有人使用STM32F4芯片驗證SPI功能。當使用片內兩個SPI模塊基于中斷方式進行收發時,發現總是出現接收數據丟失的情況,貌似總丟失末尾2個數據。代碼使用HAL庫提供的API函數。這是怎么回事呢?
我拿STM32F407開發板進行驗證測試。使用SPI1做發送,SPI3做接收,都使用中斷方式。
很快重現了問題現象,即發生接收數據丟失的情形。見下圖驗證結果,發了8個數據,只收到6個數據。
現在是同一顆芯片,即同一CPU基于中斷方式完成收發。懷疑會不會是不同SPI收發模塊中斷優先級的安排不合理導致的問題。如果二者優先級一樣的話,這里的發送中斷往往先于接收中斷的產生,勢必會出現接收不及時的情形。通過對代碼跟蹤調試,也的確發現了SPI接收溢出的現象,即接收數據提取不及時。
這樣分析下來,感覺數據丟失應該跟通信速率有關,丟失數據的多少不應該固定。于是,我大幅度提升SPI通信速率再行測試,果真丟失的數據更多了。見下圖測試結果,發8個數據只收到1個數據。【前面測試時SPI波特率是5.25Mb/s,現在改為21Mb/s了】
我將SPI3接收中斷的優先級調得比SPI1發送中斷的還高,如下圖所示。
基于重新調整中斷優先級后的代碼再做測試,結果就完全正常了。
當然,我們還可以有其它靈活處理的辦法。比方發送用中斷,接收用DMA,或者發送用輪訓,接收用中斷或DMA,或者都用DMA方式也行。
這里的核心問題是中斷優先級沒有合理安排好。STM32ARM核中斷的內容不多,不過內容不多的東西往往意味著使用上更為靈活。好,今天的話題就分享到這里。
審核編輯:湯梓紅
-
SPI
+關注
關注
17文章
1706瀏覽量
91578 -
中斷
+關注
關注
5文章
898瀏覽量
41495 -
開發板
+關注
關注
25文章
5050瀏覽量
97456 -
STM32F4
+關注
關注
3文章
194瀏覽量
28057 -
HAL庫
+關注
關注
1文章
121瀏覽量
6234
原文標題:SPI傳輸時為何丟失2個數據?
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論