在使用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控制器的章节找到如下说明: