在使用STM32Cube_FW_F0_V1.8.0版本的HAL庫時,應用中需要使用SPI總線,兩片STM32F03x系列微控制器分別作爲主機和從機使用。並且爲了提高通訊效率和通訊可靠性,通訊時使用DMA交互數據並使能SPI控制器自帶的CRC校驗功能。在實際使用時發生以下問題:當從機使用循環DMA模式時,從機接收到的數據會錯位。但是關閉CRC校驗功能後,從機緩衝區接收到的數據就不會發生錯位了。考慮原因是CRC校驗位長度處理異常導致的。從機在實際使用過程中調用瞭如下函數:
HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,
uint16_t Size)
此函數是使用DMA交互SPI數據,從機DMA的收發通道採用DMA_CIRCULAR模式,從機僅在初始化時調用一次該函數,以後不需要重複調用,因爲DMA控制器會自動循環內存地址。
由於關閉CRC校驗功能後數據錯位的現象消失,所以考慮從CRC校驗的設置方面解決。參考STM32F0xx系列參考指南,在SPI控制器的章節找到如下說明:
可以看出,在使能CRC校驗時,DMA通道的長度設置是有變化的。
ST的庫中長度設置如下,並沒有針對CRC功能設置額外長度。
現在按下圖修改:
修改後數據DMA數據和CRC校驗功能均正常,數據不再順序錯亂。
關於此BUG,沒有找到ST官方的BUG報告email,所以發佈博文以供網友參考。