引言
MindSDK為MM32主流的微控制器,實現了一系列SPI驅動的樣例工程。本文通過講解 SPI 模塊的樣例工程,介紹 SPI 模塊的功能和用法。關于 SPI 模塊對應的驅動程序,以及 SPI 外設模塊硬件的實現細節,可具體查閱 MindSDK 工程的源文件,以及 MM32 微控制器(例如MM32F5270)的用戶手冊。
樣例工程
MindSDK 中為 SPI 驅動設計的樣例工程包括:
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 做主機的典型數據傳輸方式,包括:基礎數據傳輸、SPI 使用 DMA 發送數據、SPI 使用 DMA 收發數據。另外,還有一些 SPI 板級通信的樣例,通過將一塊 SPI 做主機,另一塊 SPI 做從機的方式進行一系列板對板的基礎數據傳輸,主機樣例與從機樣例結合使用,包括:SPI做主機進行中斷數據傳輸,SPI做主機進行輪詢數據傳輸,SPI做從機進行中斷數據傳輸(SPI從機引腳與SPI主機引腳相連進行數據傳輸)。
spi_master_basic
spi_master_basic 描述了 SPI 模塊最基本的數據傳輸方式,輪詢方式。在樣例工程中,通過 SPI_InitMaster() 函數,配置 SPI 為主模式,選定一個 SPI 數據采樣時序,為空閑時時鐘線為低電平、下降沿時數據有效的 SPI_PolPha_Alt0 ,并指定傳輸數據寬度為 SPI_DataWidth_8b 、SPI 的波特率為 BOARD_LOOP_SPI_BAUDRATE ,選定 SPI 的傳輸方向為 SPI_XferMode_TxRx 。然后,通過 SPI_Enable() 函數啟動 SPI,使 SPI 能夠進行數據傳輸。
每當 SPI 發送緩沖區未滿時,可進行數據發送,數據由 MOSI 引腳傳出;當 SPI 接收緩沖區接收有效數據時,可讀取有效的接收數據。
在最終運行程序時,需要將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連,通過向 PC 機上的串口通信終端輸入任意按鍵,使 SPI 進行 APP_SPI_BUFF_LEN 次數據發送并接收到數據,主循環對接收數據和發送數據進行驗證,若存在驗證失敗數據,則可看到串口打印出錯信息 spi loopback xfer error. app_spi_xfer_err_count = ,若驗證成功,則可看到串口打印 spi loopback xfer done. ,從而驗證 SPI 做主機的數據輪詢傳輸情況。
spi_master_tx_dma
spi_master_tx_dma 相較于 spi_master_basic 樣例工程,實現通過 DMA 進行 SPI 的數據發送功能。
其實現原理,是在 spi_master_basic 的基礎上,增加對于 DMA 的初始化,通過 DMA_InitChannel() 函數,選定所使用的 DMA 通道為 BOARD_SPI_TX_DMA_CHANNEL ,配置 DMA 數據搬運方向為存儲器到外設 DMA_XferMode_MemoryToPeriph ,數據寬度為 DMA_XferWidth_8b ,通過 SPI_GetTxDataRegAddr() 函數獲取外設地址并進行配置,設定存儲器地址為 (uint32_t)app_spi_tx_buf ,外設地址自增模式為不自增 DMA_AddrIncMode_StayAfterXfer ,存儲器地址自增模式為 DMA_AddrIncMode_IncAfterXfer。然后,啟用選定 SPI 外設的 DMA 發送通道對應的 NVIC 中斷。最后,通過 DMA_EnableChannelInterrupts()函數,在 BOARD_SPI_TX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中斷,每次在 DMA_EnableChannel() 啟動 DMA 數據傳輸后,DMA 傳輸完成時,會觸發中斷。
實際運行程序時,將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連后,用戶在串口調試終端中每次輸入任意字符,程序均會調用一次 DMA_EnableChannel() 函數,啟動 DMA 傳輸,在 SPI 進行一次 DMA 傳輸并完成后,DMA 輸標志位`app_dma_xfer_done`將在中斷處理函數中被設置為true,主程序循環等待,當標志位為 true 時,打印 spi tx dma xfer done. 到串口終端界面。
spi_master_xfer_dma
spi_master_xfer_dma 相較于 spi_master_tx_dma 樣例工程,實現通過 DMA 進行 SPI 的數據收發功能。
其實現原理,是在 spi_master_tx_dma 的基礎上,增加對于 SPI 使用 DMA 接收通道的初始化,選定使用的 SPI DMA 接收通道為 BOARD_SPI_RX_DMA_CHANNEL ,在初始化 DMA 發送通道后,繼續使用 DMA_InitChannel() 函數初始化 DMA 接收通道,修改傳輸方向為 DMA_XferMode_PeriphToMemory ,設定存儲器地址為 (uint32_t)app_spi_rx_buf ,通過 SPI_GetRxDataRegAddr() 函數獲取外設地址并配置。然后啟用選定 SPI 外設的 DMA 接收通道對應的 NVIC 中斷。最后,在 BOARD_SPI_RX_DMA_CHANNEL 通道使能 DMA_CHN_INT_XFER_DONE 中斷,每次在 DMA_EnableChannel() 啟動 DMA 數據傳輸后,當 DMA 傳輸完成,會觸發對應通道的中斷。
實際運行時,將 SPI 的 MOSI 引腳與 MISO 引腳使用杜邦線相連后,用戶在串口調試終端中每次輸入任意字符,程序均會調用一次 DMA_EnableChannel() 函數,啟動 DMA 的發送與接收通道,在 SPI 進行一次 DMA 發送并完成后,DMA 發送完成標志位 app_dma_tx_done 將在發送通道所對應的中斷處理函數中被設置為 true,再進行 SPI 的 DMA 接收操作,DMA 接收數據完成后,DMA 接收完成標志位 app_dma_rx_done 將在接收通道所對應的中斷處理函數中被設置為 true,主程序循環等待,當發送完成標志位為 true 時,打印 spi tx dma done. 到串口終端界面,當接收完成標志位未 true 時,打印 spi rx dma done with data: 以及接收數據到串口終端界面。
spi_master_b2b_interrupt
spi_master_b2b_interrupt 實現的是一個使用 SPI 主模式中斷傳輸的樣例工程,在主從機的從屬關系中做主機,需與從機結合使用。
其實現原理,是在 spi_master_basic 的基礎上,增加 SPI 傳輸所使用的結構體,通過 SPI_EnableInterrupts() 函數使能發送完成中斷 SPI_INT_TX_DONE 與接收完成中斷 SPI_INT_RX_DONE 中斷,當發送或接收數據完成時,產生對應中斷,在中斷處理函數中,傳輸次數達到所設定的 rx_idx 或 tx_idx ,將通過 SPI_EnableInterrupts() 函數關閉對應的接收完成中斷或發送完成中斷,接收完成后調用 spi_rx_done_callback() 回調函數,并將全局標志位 app_spi_xfer_flag 置為true。
實際運行此程序時,需令一塊開發板下載此樣例工程,另一塊開發板下載 spi_slave_b2b_interrupt 樣例工程,使用杜邦線連接兩開發板的 MOSI、MISO、NSS、SCK 引腳,通過串口終端界面輸入任意按鍵,進行 SPI 的數據收發,串口終端打印發送數據與接收數據。
spi_master_b2b_polling
spi_master_b2b_polling 實現的是一個使用 SPI 主模式輪詢傳輸的樣例工程,在主從機的從屬關系中做主機,需與從機結合使用。
該實現原理與 spi_master_basic 基本相同,通過 while 循環等待當前達到發送或接收數據所需的傳輸條件,達到后進行數據收發,設定發送 APP_SPI_BUF_LEN 個數據并接收。
實際運行此程序時,需令一塊開發板下載此樣例工程,另一塊開發板下載 spi_slave_b2b_interrupt 樣例工程,使用杜邦線連接兩開發板的 MOSI、MISO、NSS、SCK 引腳,通過串口終端界面輸入任意按鍵,進行 SPI 的數據收發,串口終端打印發送數據與接收數據。
spi_slave_b2b_interrupt
spi_slave_b2b_interrupt 實現的是一個使用 SPI 從模式中斷的樣例工程,在主從機的從屬關系中做從機,需與主機結合使用。
在樣例工程中,通過 SPI_InitSlave() 函數配置 SPI 為從模式,設置傳輸方向為 SPI_XferMode_TxRx ,SPI 從機的數據采樣時序需要與主機的數據采樣時序配置相同,為 SPI_PolPha_Alt0 ,設定數據寬度為 SPI_DataWidth_8b 。通過 SPI_EnableInterrupts() 函數使能 SPI_INT_RX_DONE 中斷,并啟用選定 SPI 外設對應的 NVIC 中斷。最后,啟動 SPI,SPI 作為從機,等待主機的命令。當 SPI 接收完成數據后,產生接收完成中斷,并執行中斷處理函數,在中斷處理函數中將已接收的數據發送出去。
在最終運行程序時,需令一塊開發板下載此樣例工程,另一塊開發板下載 spi_master_b2b_polling 樣例工程或 spi_master_b2b_interrupt 樣例工程,使用杜邦線連接兩開發板的 MOSI、MISO、NSS、SCK 引腳,在 spi_master_b2b_xxx 工程中對應的串口終端界面下輸入任何字符,在 spi_slave_b2b_interrupt 工程中對應的串口終端界面中可以看到對應的內容。
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7496瀏覽量
151083 -
存儲器
+關注
關注
38文章
7455瀏覽量
163621 -
數據傳輸
+關注
關注
9文章
1853瀏覽量
64498 -
SPI
+關注
關注
17文章
1701瀏覽量
91344 -
dma
+關注
關注
3文章
559瀏覽量
100446
原文標題:靈動微課堂 (第267講)|MindSDK應用基礎——SPI模塊樣例
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論