引言
MindSDK為MM32主流的微控制器,實現(xiàn)了一系列SPI驅(qū)動的樣例工程。本文通過講解 SPI 模塊的樣例工程,介紹 SPI 模塊的功能和用法。關(guān)于 SPI 模塊對應(yīng)的驅(qū)動程序,以及 SPI 外設(shè)模塊硬件的實現(xiàn)細節(jié),可具體查閱 MindSDK 工程的源文件,以及 MM32 微控制器(例如MM32F5270)的用戶手冊。
樣例工程
MindSDK 中為 SPI 驅(qū)動設(shè)計的樣例工程包括:
spi_master_basic
spi_master_tx_dma
spi_master_xfer_dma
spi_master_b2b_interrupt
spi_master_b2b_polling
spi_slave_b2b_interrupt
其中,spi_master_basic、spi_master_tx_dma 與 spi_master_xfer_dma 分別演示了 SPI 做主機的典型數(shù)據(jù)傳輸方式,包括:基礎(chǔ)數(shù)據(jù)傳輸、SPI 使用 DMA 發(fā)送數(shù)據(jù)、SPI 使用 DMA 收發(fā)數(shù)據(jù)。另外,還有一些 SPI 板級通信的樣例,通過將一塊 SPI 做主機,另一塊 SPI 做從機的方式進行一系列板對板的基礎(chǔ)數(shù)據(jù)傳輸,主機樣例與從機樣例結(jié)合使用,包括:SPI做主機進行中斷數(shù)據(jù)傳輸,SPI做主機進行輪詢數(shù)據(jù)傳輸,SPI做從機進行中斷數(shù)據(jù)傳輸(SPI從機引腳與SPI主機引腳相連進行數(shù)據(jù)傳輸)。
spi_master_basic
spi_master_basic 描述了 SPI 模塊最基本的數(shù)據(jù)傳輸方式,輪詢方式。在樣例工程中,通過 SPI_InitMaster() 函數(shù),配置 SPI 為主模式,選定一個 SPI 數(shù)據(jù)采樣時序,為空閑時時鐘線為低電平、下降沿時數(shù)據(jù)有效的 SPI_PolPha_Alt0 ,并指定傳輸數(shù)據(jù)寬度為 SPI_DataWidth_8b 、SPI 的波特率為 BOARD_LOOP_SPI_BAUDRATE ,選定 SPI 的傳輸方向為 SPI_XferMode_TxRx 。然后,通過 SPI_Enable() 函數(shù)啟動 SPI,使 SPI 能夠進行數(shù)據(jù)傳輸。
每當(dāng) SPI 發(fā)送緩沖區(qū)未滿時,可進行數(shù)據(jù)發(fā)送,數(shù)據(jù)由 MOSI 引腳傳出;當(dāng) SPI 接收緩沖區(qū)接收有效數(shù)據(jù)時,可讀取有效的接收數(shù)據(jù)。
在最終運行程序時,需要將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連,通過向 PC 機上的串口通信終端輸入任意按鍵,使 SPI 進行 APP_SPI_BUFF_LEN 次數(shù)據(jù)發(fā)送并接收到數(shù)據(jù),主循環(huán)對接收數(shù)據(jù)和發(fā)送數(shù)據(jù)進行驗證,若存在驗證失敗數(shù)據(jù),則可看到串口打印出錯信息 spi loopback xfer error. app_spi_xfer_err_count = ,若驗證成功,則可看到串口打印 spi loopback xfer done. ,從而驗證 SPI 做主機的數(shù)據(jù)輪詢傳輸情況。
spi_master_tx_dma
spi_master_tx_dma 相較于 spi_master_basic 樣例工程,實現(xiàn)通過 DMA 進行 SPI 的數(shù)據(jù)發(fā)送功能。
其實現(xiàn)原理,是在 spi_master_basic 的基礎(chǔ)上,增加對于 DMA 的初始化,通過 DMA_InitChannel() 函數(shù),選定所使用的 DMA 通道為 BOARD_SPI_TX_DMA_CHANNEL ,配置 DMA 數(shù)據(jù)搬運方向為存儲器到外設(shè) DMA_XferMode_MemoryToPeriph ,數(shù)據(jù)寬度為 DMA_XferWidth_8b ,通過 SPI_GetTxDataRegAddr() 函數(shù)獲取外設(shè)地址并進行配置,設(shè)定存儲器地址為 (uint32_t)app_spi_tx_buf ,外設(shè)地址自增模式為不自增 DMA_AddrIncMode_StayAfterXfer ,存儲器地址自增模式為 DMA_AddrIncMode_IncAfterXfer。然后,啟用選定 SPI 外設(shè)的 DMA 發(fā)送通道對應(yīng)的 NVIC 中斷。最后,通過 DMA_EnableChannelInterrupts()函數(shù),在 BOARD_SPI_TX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中斷,每次在 DMA_EnableChannel() 啟動 DMA 數(shù)據(jù)傳輸后,DMA 傳輸完成時,會觸發(fā)中斷。
實際運行程序時,將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連后,用戶在串口調(diào)試終端中每次輸入任意字符,程序均會調(diào)用一次 DMA_EnableChannel() 函數(shù),啟動 DMA 傳輸,在 SPI 進行一次 DMA 傳輸并完成后,DMA 輸標志位`app_dma_xfer_done`將在中斷處理函數(shù)中被設(shè)置為true,主程序循環(huán)等待,當(dāng)標志位為 true 時,打印 spi tx dma xfer done. 到串口終端界面。
spi_master_xfer_dma
spi_master_xfer_dma 相較于 spi_master_tx_dma 樣例工程,實現(xiàn)通過 DMA 進行 SPI 的數(shù)據(jù)收發(fā)功能。
其實現(xiàn)原理,是在 spi_master_tx_dma 的基礎(chǔ)上,增加對于 SPI 使用 DMA 接收通道的初始化,選定使用的 SPI DMA 接收通道為 BOARD_SPI_RX_DMA_CHANNEL ,在初始化 DMA 發(fā)送通道后,繼續(xù)使用 DMA_InitChannel() 函數(shù)初始化 DMA 接收通道,修改傳輸方向為 DMA_XferMode_PeriphToMemory ,設(shè)定存儲器地址為 (uint32_t)app_spi_rx_buf ,通過 SPI_GetRxDataRegAddr() 函數(shù)獲取外設(shè)地址并配置。然后啟用選定 SPI 外設(shè)的 DMA 接收通道對應(yīng)的 NVIC 中斷。最后,在 BOARD_SPI_RX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中斷,每次在 DMA_EnableChannel() 啟動 DMA 數(shù)據(jù)傳輸后,當(dāng) DMA 傳輸完成,會觸發(fā)對應(yīng)通道的中斷。
實際運行時,將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連后,用戶在串口調(diào)試終端中每次輸入任意字符,程序均會調(diào)用一次 DMA_EnableChannel() 函數(shù),啟動 DMA 的發(fā)送與接收通道,在 SPI 進行一次 DMA 發(fā)送并完成后,DMA 發(fā)送完成標志位 app_dma_tx_done 將在發(fā)送通道所對應(yīng)的中斷處理函數(shù)中被設(shè)置為 true,再進行 SPI 的 DMA 接收操作,DMA 接收數(shù)據(jù)完成后,DMA 接收完成標志位 app_dma_rx_done 將在接收通道所對應(yīng)的中斷處理函數(shù)中被設(shè)置為 true,主程序循環(huán)等待,當(dāng)發(fā)送完成標志位為 true 時,打印 spi tx dma done. 到串口終端界面,當(dāng)接收完成標志位未 true 時,打印 spi rx dma done with data: 以及接收數(shù)據(jù)到串口終端界面。
spi_master_b2b_interrupt
spi_master_b2b_interrupt 實現(xiàn)的是一個使用 SPI 主模式中斷傳輸?shù)臉永こ蹋谥鲝臋C的從屬關(guān)系中做主機,需與從機結(jié)合使用。
其實現(xiàn)原理,是在 spi_master_basic 的基礎(chǔ)上,增加 SPI 傳輸所使用的結(jié)構(gòu)體,通過 SPI_EnableInterrupts() 函數(shù)使能發(fā)送完成中斷 SPI_INT_TX_DONE 與接收完成中斷 SPI_INT_RX_DONE 中斷,當(dāng)發(fā)送或接收數(shù)據(jù)完成時,產(chǎn)生對應(yīng)中斷,在中斷處理函數(shù)中,傳輸次數(shù)達到所設(shè)定的 rx_idx 或 tx_idx ,將通過 SPI_EnableInterrupts() 函數(shù)關(guān)閉對應(yīng)的接收完成中斷或發(fā)送完成中斷,接收完成后調(diào)用 spi_rx_done_callback() 回調(diào)函數(shù),并將全局標志位 app_spi_xfer_flag 置為true。
實際運行此程序時,需令一塊開發(fā)板下載此樣例工程,另一塊開發(fā)板下載 spi_slave_b2b_interrupt 樣例工程,使用杜邦線連接兩開發(fā)板的 MOSI、MISO、NSS、SCK 引腳,通過串口終端界面輸入任意按鍵,進行 SPI 的數(shù)據(jù)收發(fā),串口終端打印發(fā)送數(shù)據(jù)與接收數(shù)據(jù)。
spi_master_b2b_polling
spi_master_b2b_polling 實現(xiàn)的是一個使用 SPI 主模式輪詢傳輸?shù)臉永こ?,在主從機的從屬關(guān)系中做主機,需與從機結(jié)合使用。
該實現(xiàn)原理與 spi_master_basic 基本相同,通過 while 循環(huán)等待當(dāng)前達到發(fā)送或接收數(shù)據(jù)所需的傳輸條件,達到后進行數(shù)據(jù)收發(fā),設(shè)定發(fā)送 APP_SPI_BUF_LEN 個數(shù)據(jù)并接收。
實際運行此程序時,需令一塊開發(fā)板下載此樣例工程,另一塊開發(fā)板下載 spi_slave_b2b_interrupt 樣例工程,使用杜邦線連接兩開發(fā)板的 MOSI、MISO、NSS、SCK 引腳,通過串口終端界面輸入任意按鍵,進行 SPI 的數(shù)據(jù)收發(fā),串口終端打印發(fā)送數(shù)據(jù)與接收數(shù)據(jù)。
spi_slave_b2b_interrupt
spi_slave_b2b_interrupt 實現(xiàn)的是一個使用 SPI 從模式中斷的樣例工程,在主從機的從屬關(guān)系中做從機,需與主機結(jié)合使用。
在樣例工程中,通過 SPI_InitSlave() 函數(shù)配置 SPI 為從模式,設(shè)置傳輸方向為 SPI_XferMode_TxRx ,SPI 從機的數(shù)據(jù)采樣時序需要與主機的數(shù)據(jù)采樣時序配置相同,為 SPI_PolPha_Alt0 ,設(shè)定數(shù)據(jù)寬度為 SPI_DataWidth_8b 。通過 SPI_EnableInterrupts() 函數(shù)使能 SPI_INT_RX_DONE 中斷,并啟用選定 SPI 外設(shè)對應(yīng)的 NVIC 中斷。最后,啟動 SPI,SPI 作為從機,等待主機的命令。當(dāng) SPI 接收完成數(shù)據(jù)后,產(chǎn)生接收完成中斷,并執(zhí)行中斷處理函數(shù),在中斷處理函數(shù)中將已接收的數(shù)據(jù)發(fā)送出去。
在最終運行程序時,需令一塊開發(fā)板下載此樣例工程,另一塊開發(fā)板下載 spi_master_b2b_polling 樣例工程或 spi_master_b2b_interrupt 樣例工程,使用杜邦線連接兩開發(fā)板的 MOSI、MISO、NSS、SCK 引腳,在 spi_master_b2b_xxx 工程中對應(yīng)的串口終端界面下輸入任何字符,在 spi_slave_b2b_interrupt 工程中對應(yīng)的串口終端界面中可以看到對應(yīng)的內(nèi)容。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7660瀏覽量
152186 -
存儲器
+關(guān)注
關(guān)注
38文章
7530瀏覽量
164412 -
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1961瀏覽量
64867 -
SPI
+關(guān)注
關(guān)注
17文章
1724瀏覽量
92191 -
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
101026
原文標題:靈動微課堂 (第267講)|MindSDK應(yīng)用基礎(chǔ)——SPI模塊樣例
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
基于FPGA的SPI自動發(fā)送模塊的設(shè)計
SPI接口的應(yīng)用與基于FPGA的SPI自動發(fā)送模塊設(shè)計
![<b class='flag-5'>SPI</b>接口的應(yīng)用與基于FPGA的<b class='flag-5'>SPI</b>自動發(fā)送<b class='flag-5'>模塊</b>設(shè)計](https://file.elecfans.com/web2/M00/4A/13/pYYBAGKhvJOAKLCHAAAthCuesjs024.png)
SPI總線接口在OLED模塊中的應(yīng)用詳細說明
![<b class='flag-5'>SPI</b>總線接口在OLED<b class='flag-5'>模塊</b>中的應(yīng)用詳細說明](https://file.elecfans.com/web1/M00/AE/23/o4YBAF3WTnGAAQDnAAGY2NiXJlw312.png)
SPI基礎(chǔ),SPI是怎么樣的?
SPI Nand Flash簡介
![<b class='flag-5'>SPI</b> Nand Flash<b class='flag-5'>簡介</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SPI通信簡介
![<b class='flag-5'>SPI</b>通信<b class='flag-5'>簡介</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MindSDK概述、使用方法及應(yīng)用案例
MindSDK中FlexCAN驅(qū)動程序及樣例工程
![<b class='flag-5'>MindSDK</b>中FlexCAN驅(qū)動程序及<b class='flag-5'>樣</b><b class='flag-5'>例</b>工程](https://file1.elecfans.com/web2/M00/89/F6/wKgaomSNYyiAfIWtAAHocGyyNzI245.jpg)
評論