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