[讨论] Hex文件格式CRC检查
SPI_CRCPolynomial库函数的SPI初始化需要
SPI _ init structure.SPI _ CRC polynomial=7;
我的疑问是,使用STM32控制nRF24L01时,STM32的SPI具有CRC检查功能,而nRF24L01的SPI没有CRC检查功能。 如何才能实现通信呢?
根据数据手册,发送数据后发送CRC; 接收数据时接收完数据后,比较接收的CRC和接收时计算的CRC是否相同。 问题是RF IC没有发送CRC吗?
请大家指教!
----- -涉及数据手册中的CRC
22.3.6 CRC计算
CRC校验仅用于保证全双工通信的可靠性。 数据发送和数据接收分别使用不同的CRC计算机。
通过对每个接收比特进行可编程多项式运算来计算CRC。 CRC的计算是SPI_CR1寄存器
在中由CPHA和CPOL位定义的采样时钟的边沿发生。
注:根据选择的发送和接收数据的帧格式,此SPI接口提供两种CRC计算方法。 这意味着8位数据帧提取
使用CR8; 16位数据帧采样CRC16-CCITT。
通过设置SPI_CR1寄存器的CRCEN位启用CRC计算。 在设置CRCEN位的同时重置CRC发送
内存(SPI_RXCRCR和SPI_TXCRCR )。 当设置了SPI_CR1的CRCNEXT比特时,SPI_TXCRCR的内部
在发送当前字节后发出。
注意:传送SPI_TXCRCR的内容时,如果移位寄存器接收到的数值与SPI_RXCRCR的内容不一致
时,SPI_SR寄存器的CRCERR标志位被设置为1。 如果TX缓冲区中有数据,则CRC的值为
数据传输结束后进行传输。 在CRC传输期间,CRC计算机将关闭,寄存器的值保持不变。
注意:请参阅产品说明书,确保具有此功能。 (并不是所有型号都有此功能。
在SPI通信中,可以按以下步骤使用CRC :
设置CPOL、CPHA、LSBFirst、BR、SSM、SSI和MSTR的值;
在SPI_CRCPR寄存器中输入多项式;
通过设置SPI_CR1寄存器CRCEN位使能CRC计算,寄存器SPI_RXCRCR也被清除
和SPI_TXCRC;
设置SPI_CR1寄存器的SPE位启动SPI功能;
开始通信,直到只剩下最后一个字节或半个字,维持通信;
向发送缓冲器写入最后的字节或半字,并设置SPI_CR1的CRCNext位指示硬件是最后的
1数据字节发送完成后,发送CRC。 在CRC发送过程中,CRC的计算停止;
在发送最后一个字节或半字后,SPI发送CRC,CRCNext位被清除。 同样,收到了
如果要将CRC与SPI_RXCRCR的值进行比较且比较不匹配,则设置SPI_SR上的CRCERR标志,然后返回,
设定了SPI_CR2寄存器的ERRIE时,会发生中断。
注:如果SPI时钟频率较高,则用户在发送CRC时需要小心。 CRC传输过程中使用CPU的时间是
尽可能少的事情。 为了避免接收最后的数据和CRC时出现错误,请在发送CRC时禁止函数调用。
如果SPI的时钟频率较高,建议使用DMA模式,以避免降低SPI速度。
如果将STM32F10xxx配置为从模式,并且使用了NSS硬件模式,则NSS管脚必须是数据传输和CRC传输
期限会保持很低。
没有生效啊。 启用的是其他地方的配置。 即使配置了spi_CRCPolynomial,或者没有使用SPI模块,也没有关系。
应该使用SPI_Transmitcrc和SPI_CalculateCRC函数启用CRC发送功能