华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)
??最近有個需求是需要使用 華大 MCU(HC32F460) 的 SPI 作為從機來接收數據,無奈搞了兩天死活不可用。配置完 SPI 的從機模式后,只要啟動主機端的發送就出現如下圖所示的錯誤:
下面是 SPI 主機發送數據的時序圖(黃色為 CS,綠色為 CLK):
比較特殊的是,SPI 主機要求只發送數據,不進行接收(主機只有數據輸出引腳)! 這就要求在從機 SPI 可以不發送數據,節省一個 MCU 的 IO。正是這一點,導致我在配置從機 SPI 時掉入了坑里(從機 SPI 只配置了接收!!!)。下面我們重點說一說我的經歷,讓大家少進坑。
從機模式
??無論是用了多年的 STM32 系列 ,還是切換后的華大 MCU 系列,SPI 從機模式本次是第一次使用。也因此,我對于從機 SPI 的配置也不是很了解。首先,去手冊中查找從機 SPI 的相關介紹:
HC32F460 的 SPI 支持 4 線式 SPI 模式和 3 線式時鐘同步運行模式,這里我需要使用 4 線式 SPI 運行模式。至于 3 線時鐘同步運行模式,感興趣的自行去看手冊。
標準里的 SPI 3 線制不是指的 MOSI 和 MISO 合并一個么?和華大手冊里的 3 線制不是一個東西啊
從機模式時使用 MOSI 接收,MISO 發送
上圖中紅色圈出來的地方需要注意,根據我的試用,從機模式下也有欠載錯誤檢測。
從機 SPI 配置
??在看了手冊的相關介紹之后,接下來就是實際寫代碼進行配置了。SPI 的配置還是比較簡單的,我這里使用了 DMA 進行接收數據。我們直接調用庫函數即可。如下:
在配置 IO 的時候,我這里不配置 MISO,因為我的需求里面不需要從機發送。
配置復用之前,我先把 IO 配成輸入,且帶上拉。這主要是為了保證 IO 的初始電平。這個與硬件設計有關!
舉個例子:對于串口,協議規定默認的電平為高電平。如果硬件沒有配置上拉,則我們必須先把 IO 配置帶上拉,否則可能導致無法接收數據
注意上面的紅色框中的代碼,這個是用來發送數據的!在一開始配置時,我并沒有配置發送 DMA,因為我一直認為作為從機,我不需要發送數據,自然我也不需要配置 SPI 的發送,所以在最初的配置中沒有上圖中紅色框中的內容。這就導致陷入了文章開始說的誤區。
分析總結
??HC32F460 的 SPI 從機模式并沒有只接收這種配置(ST的 SPI 可以配置僅接收),這就意味著,不管我們用不用 SPI 從機發送功能,都必須要配置發送。
??如果不使用發送,則可以不去配置 SPI 從機發送引腳(MISO),節省出來的 IO 可以作為普通 IO 去使用。
??在不使用發送功能時,配置的發送可以根據需要發送任意一個字節即可。例如,上面我的 DMA 發送中,僅僅就是循環發送一個字節 00。否則將導致本文開篇截圖的欠載錯誤!我的理解是,因為 HC32F460 不能配置單獨接收(對比 STM32 系列的 SPI 可以配置 僅接收、僅發送等模式),所以默認從機是收發都啟用(工作)的狀態。
??根據手冊的說明,在產生欠載錯誤后,會主動停止 SPI,因此實際使用中,需要處理欠載錯誤等異常的情況!而且,MCU 并沒有提供關閉這個錯誤檢測的配置項!!!因此,一旦出錯或者說 DMA 停止了發送,這必然導致出現上面的錯誤!!
參考
總結
以上是生活随笔為你收集整理的华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华大 MCU 之四 使用问题记录
- 下一篇: Linux 之三 静态库及动态库的编写和