在SAMD MCU阵列之间的SPI通信总线上工作。
我有一个传入的数据包,类似于{ 0x00, 0xFF, 0x00, 0xFF }
。
接收器芯片对传入的数据包执行CRC16检查。
由于我希望每次都能得到完全相同的数据包,因此我想在数据包有效时将CRC校验和设为零,而在发生传输错误时将校验和设为零。
我知道我可以在发送数据包时将计算出的CRC16添加到数据包的末尾,并且在接收方,CRC校验将输出0,但是在这种情况下,由于已构建数据包,因此无法在数据包中添加CRC16校验和由SPI线上的多个发送器芯片组成,每个芯片仅从整个数据包中填充自己的两个字节。
我需要在接收器端加载初始CRC校验和,因此在检查了传入的数据包之后,结果CRC等于零(如果数据包完好无损)。
答案here on SO实际上是我想要的,但是它是针对CRC32格式的,我实际上不了解代码的原理,因此,如果是CRC16格式,则无法重写。
任何帮助将不胜感激!
问候,
尼可
最佳答案
解决方案只是使用基于查找表的CRC。如果您不能将校验和(也称为帧校验序列,FCS)附加到包中,请先进行表查找,然后将其与固定数据的预期序列进行比较。
请注意,“CRC 16”可能有任何含义,有多个版本和(非)标准。最常见的一种可能是一种称为“CRC-16-CCITT”的方法,它具有1021h的poly和初始值FFFFh,但是即使那样,也存在多种算法-有些是正确的,有些是坏的。您面临的最大挑战是找到一种值得信赖的CRC算法。
但是,我实际上认为SAMD出于DMA的目的专门使用了硬件生成的CRC-16-CCITT芯片。由于这是SPI,因此它应该是DMA可用的,所以也许研究一下是否可以某种方式使用它。
关于c++ - 如何确定CRC16初始校验和,因此校验和为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61382282/