1. 程式人生 > >學習6__STM32--SPI外設之中斷收發

學習6__STM32--SPI外設之中斷收發

log 都是 位操作 上電 完美解決 byte 方法 -- 接收數據

> 目標

STM32雙機 SPI中斷收發通信

> 描述

  #1  STM32雙機配置為一主一從模式

  #2  采用主機中斷發送,從機中斷接收

  #3  收發機制采用不間斷收發(發送為空就發送,接收非空就接收,中間無其他操作打斷)

  #4  就是單字節發送與接收

> 問題

  從機接收端會出現,接收到的數據可能是原始發送數據也會是錯誤數據,出現這種現象的條件是發送主機復位、發送主機重新上電、隨時間變化(物理碰觸等)都會產生錯誤數據,而復位接收從機、重新上電接收從機會糾正數據

> 分析

  #1  STM32雙機未共地導致      共地後問題依舊

  #2  STM32未使用NSS引腳導致    使用後問題依舊

  #3  工作模式改變嘗試(發送與接收工作模式配置為不匹配)    問題依舊

  #4  主機發送太過頻繁導致,導致接收來不及接收導致       拉大發送數據周期問題依舊

  #5  從數據結果上分析,應該是發送主機與接收從機未同步導致,接收總線的數據先由移位寄存器接收,再copy至數據寄存器,所以分析數據移位現象是出現在移位寄存器中,比如正在傳輸中由復位操作或斷電操作等,致使移位寄存器只接收了3bit數據,而SPI數據的接收機制是,移位寄存器收滿8bit數據後copy至數據寄存器,這一切都是硬件完成,註意數據的搬移是copy,所以移位寄存器中的數據還在,就像剛剛的這種行為導致移位寄存器只接收了3bit數據,未滿8bit數據故不會copy至數據寄存器,所以等待恢復工作後,再接收5bit數據,這樣滿8bit數據後copy至spi->DR,但是這1byte數據中的前3bit與後5bit數據本不是一個有效byte數據,就導致讀到1byte無效數據,產生了接收錯誤數據的現象

> 解決

  #1  拉大發送數據周期&在進入接收中斷後先關閉SPI外設,然後再讀取數據,出中斷前開始SPI外設

  #n  。。。

>總結

  #1  這種方法只是暫時解決了該條件下接收錯誤數據的問題,並未完美解決和分析透這一現象

  #2  不拉大發送數據周期,只是在進入接收中斷後先關閉SPI外設,然後再讀取數據,出中斷前開始SPI外設,接收數據錯誤問題依舊

  

學習6__STM32--SPI外設之中斷收發