利用STM32CUbeMx編寫程序,大大方便了開發,最近做的項目利用到了
STM32CUbeMx的硬件SP,這里對SPI的使用做一個總結。
HAL庫里的硬件SPI主要有以下幾個庫函數:
/* hspi1:spi1 硬件通道,temp_val:發送的數據,re_val:接收的數據,1:數據長度,1000:超時時間 */
HAL_SPI_TransmitReceive(&hspi1, &temp_val, &re_val, 1, 1000); // 一邊接受一邊發送數據
HAL_SPI_Transmit(&hspi1,&temp,sizeof(temp),10); //發送數據
HAL_SPI_Receive(&hspi1,&sc1161y_sel_re,sizeof(sc1161y_sel_re),10); //接收數據
HAL_SPI_TransmitReceive_DMA(); //以DMA方式發送數據
HAL_SPI_Receive_DMA(); //以DMA方式接收數據
HAL_SPI_TransmitReceive_IT(); // 以中斷方式同時接收發送數據
HAL_SPI_Transmit_IT(); // 以中斷方式發送數據
HAL_SPI_Receive_IT(); // 以中斷方式接收數據
具體使用哪個HAL庫函數看項目需求。
在使用硬件SPI過程中,會出現的問題可以總結為以下幾點:
1.發送數據不成功;
2.接收數據不成功;
3.發送的數據有誤;
4.接收的數據有誤;
5.交互的數據一部分是對的,一部分有誤;
6.SPI時鍾沒有啟動。
對於以上解決方法,我總結了一個自己調試時的方法:
1. 先確認自己的SPI配置是否正確,是否滿足項目需求;
2. 確認電路與通信IC無誤,注意信號線不要接錯;
3. 重點:調節延時,第一第二步確認無誤后,很多時候不成功是由於延時原因造成的,
主要是一個數據交互之間的延時,一幀數據發送后跟接收的延時,IC片選的延時,
每個數據發送間的延時,IC與MCU交互間的延時。
補充:有時候發送出來的數據不對,有可能是分頻因子太小,配置的速度太快導致的,就例如發0x01,收到0x2c之類的;如果發送出來的數據多了幾個,可能就是發送數據長度設置不對造成的,例如發送0xaa、0xff 時發送出去多了0x20、0x00之類的,就要考慮是不是數據長度配置不對了,具體配置詳細說明如下圖: