0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

CW32的SPI單工模式主從通信介紹

jf_pJlTbmA9 ? 來源:武漢芯源半導體 ? 作者:武漢芯源半導體 ? 2023-10-24 15:50 ? 次閱讀

串行外設接口(SPI)是一種同步串行數(shù)據(jù)通信接口,常用于 MCU 與外部設備之間進行同步串行通信。SPI是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間。CW32L083 內(nèi)部集成 2 個串行外設 SPI 接口,支持雙向全雙工、單線半雙工和單工通信模式,可配置 MCU 作為 主機或從機,支持多主機通信模式,支持直接內(nèi)存訪問(DMA)。

單工通信模式

SPI 支持單工通信模式,主機和從機通過一根單向數(shù)據(jù)線進行單發(fā)或單收通信。主機使用 MOSI 信號線進行單發(fā)通信,使用 MISO 信號線進行單收通信;從機使用 MOSI 信號線進行單收通信, 使用 MISO 信號線進行單發(fā)通信,未使用的信號線可供其它功能使用。

主機單發(fā),從機單收應用場景下,連接框圖如下:

wKgaomUDy8WAch3hAABLi9Sxd9M341.png

主機單發(fā)配置:

設置 SPIx_CR1.MODE 為 0x1,SPI 工作于單工單發(fā)通信模式;

設置 SPIx_CR1.MSTR 為 1,SPI 工作于主機模式。

設置 SPIx_SSI.SSI 為 0,在從機選擇 CS 引腳輸出低電平,作為通信起始信號。

當發(fā)送緩沖器為空時,即 SPIx_ISR.TXE 標志位為 1,將待發(fā)送的一幀數(shù)據(jù)寫入 SPIx_DR 寄存器,數(shù)據(jù)在同步移位時鐘信號的控制下從 MOSI 引腳輸出。

當寫入最后一幀數(shù)據(jù)后,必須等待發(fā)送緩沖空標志位 SPIx_ISR.TXE 變?yōu)?1,同時 SPI 總線忙標志位 SPIx_ISR. BUSY 變?yōu)?0,以確保數(shù)據(jù)發(fā)送完畢。然后設置 SPIx_SSI.SSI 為 1,使從機選擇 CS 引腳輸出高電平,結束本次通信。

從機單收配置:

設置 SPIx_CR1.MODE 為 0x2,SPI 工作于單工單收通信模式;

設置 SPIx_CR1.MSTR 為 0,SPI 工作于從機模式。

檢測到 CS 引腳變?yōu)榈碗娖綍r,從機開始與主機通信。當接收緩沖器非空時,即 SPIx_ISR.RXNE 標志位為 1,表示已經(jīng)接收完成一幀數(shù)據(jù),此時可以讀取 SPIx_DR 寄存器。當檢測到 CS 引腳變?yōu)楦唠娖綍r,本次通信結束。

主機單收,從機單發(fā)應用場景下,連接框圖如下:

wKgZomUDy8aAJk32AABKB2xRqQ0447.png

具體設置與主機單發(fā)和從機單收類似,詳情可查看用戶手冊。

SPI中斷

SPI 控制器支持 8 個中斷源,當 SPI 中斷觸發(fā)事件發(fā)生時,中斷標志位會被硬件置位,如果設置了對應的中斷使能控制位,將產(chǎn)生中斷請求。

wKgaomUDy8eAS1JSAACHeljokWU272.png

在用戶 SPI 中斷服務程序中,應查詢相關 SPI 中斷標志位,以進行相應的處理,在退出中斷服務程序之前,要清除該中斷標志位,避免重復進入中斷程序。

實例演示:SPI單工模式進行主從機通信,主機單發(fā),從機單收。

SPIy(主機)采用中斷方式發(fā)送TxBuffer緩沖區(qū)中的數(shù)據(jù),SPIz(從機)采用中斷方式接收數(shù)據(jù)并存儲到RxBuffer緩沖區(qū),比較TxBuffer和RxBuffer,如果數(shù)據(jù)一致LED1亮,否則LED2亮。

1. 配置RCC

voidRCC_Configuration(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV2);//SYSCLK=HSI=24MHz=HCLK=PCLK
RCC_AHBPeriphClk_Enable(SPIy_GPIO_CLK|SPIz_GPIO_CLK|RCC_AHB_PERIPH_GPIOC,ENABLE);//外設時鐘使能
SPIy_APBClkENx(SPIy_CLK,ENABLE);
SPIz_APBClkENx(SPIz_CLK,ENABLE);
}?

2. 配置GPIO

voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure={0};
SPIy_AF_SCK;//SPISCKMOSI復用
SPIy_AF_MOSI;
SPIz_AF_SCK;
SPIz_AF_MOSI;
GPIO_InitStructure.Pins=SPIy_SCK_PIN;//推挽輸出
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(SPIy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIy_MOSI_PIN;
GPIO_Init(SPIy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIz_SCK_PIN;//浮空輸入
GPIO_InitStructure.Mode=GPIO_MODE_INPUT;
GPIO_Init(SPIz_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=SPIz_MOSI_PIN;
GPIO_Init(SPIz_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=GPIO_PIN_3|GPIO_PIN_2;//PC3LED1/PC2LED2
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, GPIO_InitStructure);
PC03_SETLOW();//LED滅
PC02_SETLOW();
}?

3. 配置SPI

voidSPI_Configuration()
{
SPI_InitTypeDefSPI_InitStructure={0};
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_TxOnly;//單工單發(fā)
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//主機模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//幀數(shù)據(jù)長度為8bit
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//時鐘空閑電平為低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第一個邊沿采樣
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//片選信號由SSI寄存器控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;//波特率為PCLK的8分頻
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//最高有效位MSB收發(fā)在前
SPI_InitStructure.SPI_Speed=SPI_Speed_Low;//低速SPI
SPI_Init(SPIy, SPI_InitStructure);
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_RxOnly;//單工單收
SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;//從機模式
SPI_Init(SPIz, SPI_InitStructure);
SPI_Cmd(SPIy,ENABLE);
SPI_Cmd(SPIz,ENABLE);
}?

4. 配置NVIC中斷函數(shù)

voidNVIC_Configuration(void)
{
NVIC_SetPriority(SPIy_IRQ,1);//優(yōu)先級,無優(yōu)先級分組
NVIC_SetPriority(SPIz_IRQ,0);
NVIC_EnableIRQ(SPIy_IRQ);//SPI中斷使能
NVIC_EnableIRQ(SPIz_IRQ);
}
voidSPI1_IRQHandler(void)//SPI1中斷函數(shù)
{
if(SPI_GetITStatus(CW_SPI1,SPI_IT_TXE)!=RESET)
{
if(TxCounter==BufferSize-1)
{
SPI_ITConfig(CW_SPI1,SPI_IT_TXE,DISABLE);
}
SPI_SendData(CW_SPI1,TxBuffer[TxCounter++]);
}
}
voidSPI2_IRQHandler(void)//SPI2中斷函數(shù)
{
if(SPI_GetITStatus(CW_SPI2,SPI_IT_RXNE)!=RESET)
{
RxBuffer[RxCounter++]=SPI_ReceiveData(CW_SPI2);
}
}?

5. 比較兩個buffers區(qū)

TestStatusBuffercmp(uint8_t*pBuffer1,uint8_t*pBuffer2,uint16_tBufferLength)
{
while(BufferLength--)
{
if(*pBuffer1!=*pBuffer2)
{
returnFAILED;
}
pBuffer1++;
pBuffer2++;
}
returnPASSED;
}?

6. 主程序

int32_tmain(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
SPI_Configuration();//配置SPI
NVIC_Configuration();//配置NVIC

SPI_ITConfig(SPIz,SPI_IT_RXNE,ENABLE);//使能SPIzRXNE中斷
SPI_NSSInternalSoftwareConfig(SPIz,SPI_NSSInternalSoft_Reset);//軟件NSS,選中SPIz
SPI_ITConfig(SPIy,SPI_IT_TXE,ENABLE);//使能SPIyTXE中斷
while(RxCounter

7.實驗結果顯示:LED1亮起,buffers區(qū)數(shù)據(jù)相等,SPI單工模式主從通訊(中斷方式)功能實現(xiàn)。

來源:武漢芯源半導體

免責聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯(lián)系小編進行處理

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16667

    瀏覽量

    347784
  • 通信
    +關注

    關注

    18

    文章

    5880

    瀏覽量

    135316
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1669

    瀏覽量

    90733
收藏 人收藏

    評論

    相關推薦

    CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?5931次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計劃

    CW32快速開發(fā)入門

    CW32快速開發(fā)入門
    的頭像 發(fā)表于 04-24 18:56 ?1686次閱讀
    <b class='flag-5'>CW32</b>快速開發(fā)入門

    【應用筆記】CW32 自舉程序中使用的 ISP 協(xié)議

    提供的 ISP 模式,通過 UART 串口方便地實現(xiàn)對 CW32 微控制器片上 FLASH主存儲器的擦除和燒寫。本應用筆記將介紹如何進入 CW32 微控制器 ISP
    發(fā)表于 06-06 13:26

    AT32F4xx SPI使用工模式通訊

    AT32F4xx SPI使用工模式通訊演示AT32F403Axx SPI使用工模式通訊,其余
    發(fā)表于 10-27 06:14

    CW32單片機在智能馬桶的應用介紹

    和調(diào)節(jié)。本文將介紹CW32單片機在智能馬桶的詳細應用。 圖:CW32的智能馬桶控制板 CW32單片機在智能馬桶的應用介紹 1.溫度感應與控
    發(fā)表于 12-20 10:06

    STM32_ SPI主從通信

    STM32_SPI主從通信
    的頭像 發(fā)表于 04-08 10:54 ?7289次閱讀
    STM32_ <b class='flag-5'>SPI</b><b class='flag-5'>主從</b><b class='flag-5'>通信</b>

    CW32 低功耗模式的特性介紹

    CW32系列芯片支持3種工作模式,運行模式、休眠模式以及深度休眠模式,本文以CW32L083為例
    的頭像 發(fā)表于 12-30 10:53 ?929次閱讀
    <b class='flag-5'>CW32</b> 低功耗<b class='flag-5'>模式</b>的特性<b class='flag-5'>介紹</b>

    cw32和stm32的區(qū)別

    cw32和stm32的區(qū)別 CW32和STM32是兩種常見的單片機,被廣泛應用于各種電子設備中。在本文中,我們將深入探討CW32和STM32之間的區(qū)別和優(yōu)劣勢。 1. 硬件性能 硬件性能是衡量單片機
    的頭像 發(fā)表于 08-16 11:15 ?3506次閱讀

    cw32和gd32的區(qū)別

    cw32和gd32的區(qū)別 CW32和GD32是兩種不同的芯片系列,分別由WCH和GigaDevice公司推出,兩者有很多不同之處,下面我們來詳細介紹。 首先從CW32系列開始,
    的頭像 發(fā)表于 08-16 11:15 ?1660次閱讀

    CW32L083的UART單線半雙工模式介紹

    CW32L083的UART單線半雙工模式介紹
    的頭像 發(fā)表于 10-24 17:49 ?954次閱讀
    <b class='flag-5'>CW</b>32L083的UART單線半雙<b class='flag-5'>工模式</b><b class='flag-5'>介紹</b>

    CW32 PWM輸出功能介紹

    CW32 PWM輸出功能介紹
    的頭像 發(fā)表于 09-27 16:12 ?647次閱讀
    <b class='flag-5'>CW32</b> PWM輸出功能<b class='flag-5'>介紹</b>

    CW32實時時鐘(RTC)介紹

    CW32實時時鐘(RTC)介紹
    的頭像 發(fā)表于 10-24 15:36 ?926次閱讀
    <b class='flag-5'>CW32</b>實時時鐘(RTC)<b class='flag-5'>介紹</b>

    應用筆記-CW32 自舉程序中使用的 ISP 協(xié)議

    ,通過UART串口方便地實現(xiàn)對CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應用筆記將介紹如何進入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并詳細
    發(fā)表于 06-06 13:37 ?7次下載

    基于CW32的物聯(lián)網(wǎng)應用

    CW32】基于CW32的物聯(lián)網(wǎng)應用
    的頭像 發(fā)表于 11-02 15:55 ?609次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應用

    CW32單片機在智能馬桶的應用介紹

    和調(diào)節(jié)。本文將介紹CW32單片機在智能馬桶的詳細應用。圖:CW32的智能馬桶控制板CW32單片機在智能馬桶的應用介紹1.溫度感應與控制智能馬
    的頭像 發(fā)表于 12-20 10:09 ?460次閱讀
    <b class='flag-5'>CW32</b>單片機在智能馬桶的應用<b class='flag-5'>介紹</b>