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


<目標>

  STM32雙機 SPI中斷收發通信

 

<描述>

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

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

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

  # 就是單字節發送與接收

 

<問題>

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

 

<分析>

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

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

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

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

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

 

<解決>

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

    > 在進入中斷服務程序后關閉spi外設,將導致在關閉外設期間發生的中斷而被忽視,尤其是多數據連續發送,比如DMA數據發送,實測將導致丟數據,即其中的部分中斷未作出響應而丟棄。

    > 拉大數據發送周期不失為一個辦法,但在多數場合不適合,通信中一般就要求快速傳輸,幾乎沒有單個字節的傳輸(單個字節傳輸可理解為拉大數據發送周期的一種特例)。

  # 。。。

 

<總結>

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

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

 

<深思>

以上現象的產生可分析出如下的情況導致

  # 雙機正在傳輸過程中,由於復位、重啟等操作致使收發雙方不同步而出現以下情況

    > 發送端不間斷一直發送,而接收端由於復位、重啟等操作致使重新初始化准備開始接收,正巧雙機出現這種情況,在接收端開始接收時發送端發送至當前1Byte的第5bit,這意味着第0-4bit已丟棄,剩余第5-7bit剛好被接收端接收,即接收端收到3bit數據,隨着發送端下1Byte數據發送,這種環境將產生何種結果?

  [分析]

    > 接收端接收發送端發來的1Byte數據里的前5bit與之前收到的3bit合成1Byte數據,將置位SPI_RXNE產生中斷將當前接收的1Byte數據讀走,這就導致了錯誤數據的產生,在環境保持不變的條件下,錯誤數據源遠流長

    > 接收端是否會接收剛准備好接收時到來的3bit數據?

      @ 不接收,是何原因摒棄了這殘缺的數據?

      @ 接收了,但並未copy至SPI_DR或者其他情況

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM