1

在 SAMD MCU 阵列之间的 SPI 通信总线上工作。

我有一个类似的传入数据包{ 0x00, 0xFF, 0x00, 0xFF }。接收器芯片对传入的数据包执行 CRC16 检查。

由于我每次都期待完全相同的数据包,因此我希望在数据包有效时具有零 CRC 校验和,而不是在传输错误时具有零校验和。

我知道我可以在发送数据包时将计算出的 CRC16 添加到数据包的末尾,并且在接收端,CRC 校验将输出 0,但在这种情况下,由于数据包是构造的,因此不可能向数据包添加 CRC16 校验和通过 SPI 线上的多个发送芯片,每个芯片只从整个数据包中填充自己的两个字节。

我需要在接收端加载初始 CRC 校验和,因此在检查传入数据包后,生成的 CRC 等于零(如果数据包完好无损)。

SO上这里的答案其实是我要找的,但是是针对CRC32格式的,我其实对代码的原理不是很了解,所以无法重写if for CRC16格式。

任何帮助将不胜感激!

问候, 尼科

4

2 回答 2

2

解决方案是简单地使用基于查找表的 CRC。如果您无法将校验和(也称为帧校验序列,FCS)附加到包中,则首先进行表查找,然后简单地将其与固定数据的预期序列进行比较。

请注意,“CRC 16”可能意味着任何东西,有多个版本和(非)标准。最常见的一种可能是称为“CRC-16-CCITT”的一种,具有 1021h 多边形和初始值 FFFFh,但即使是这种算法,也有多种算法 - 有些是正确的,有些是错误的。您最大的挑战将是找到一个值得信赖的 CRC 算法。

但是,我实际上认为 SAMD 专门在片上使用硬件生成的 CRC-16-CCITT,用于 DMA 目的。由于这是 SPI,它应该是 DMA-able,所以也许调查一下你是否可以以某种方式使用它。

于 2020-04-23T08:24:53.720 回答
0

多亏了 Bastian Molkenthin 的建议,我找到了一个解决方案,他做了这个很棒的在线 CRC 计算器

他建议尝试对 CRC16 初始值的所有 2^16 值进行蛮力计算。事实上,在几行代码和几微秒后,SAMD51 找到了一个初始值,该值与给定缓冲区的零 CRC 值匹配。

于 2020-04-26T17:32:34.823 回答