如何解决我如何为该协议建模 CRC
我有一份 TWI 设备的协议规格表,其中说明:
CRC 字节是一个八位循环冗余校验,使用 0x5A 的初始种子和 0x18 的多项式 XOR 值。
规范给出了一些示例命令:
它还声明
数据按位串行发送,最高有效位在前。
我尝试计算使用 http://www.sunshine2k.de/coding/javascript/crc/crc_js.html 给出的命令示例的 CRC 值
使用反射和非反射输入和结果,但我无法获得与命令示例匹配的计算 CRC。
我是否遗漏了一些明显的东西?
解决方法
反映CRC,多项式为x8+x5+x4+1。高功率下降后反映的多项式是0x8c
。此 C 代码计算 CRC:
unsigned crc8twi(unsigned char const *data,size_t len) {
unsigned crc = 0x5a;
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (int k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ 0x8c : crc >> 1;
}
return crc;
}
这给出了 06
的 CRC 0c
,48
的 0c f0 64 b8 13
,5a
的 11 03
,{a5
的 00
{1}} 和 07
代表 15
。
我不知道如何获得第二个示例中的 48
,但我也不知道向上和向下箭头的含义,也不知道蓝色和粉红色的含义。
我也不知道“0x18 的多项式 XOR 值”是什么意思。正确多项式的 Koopman 表示为 0x98
,接近但不相同。
更新:
好的,0x18
来自一种真正曲折的 CRC 计算方法,如以下 OP 评论中的链接中的示例所示:
在那个例子中,多项式的应用发生在两个不同的地方。 0x18
是向下移动 1 的多项式,但没有反映,因为代码一次一个地遍历数据位。
这实际上是在 another answer of mine from a while back 中提到的(我忘记了)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。