微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何为该协议建模 CRC

如何解决我如何为该协议建模 CRC

我有一份 TWI 设备的协议规格表,其中说明:

CRC 字节是一个八位循环冗余校验,使用 0x5A 的初始种子和 0x18 的多项式 XOR 值。

规范给出了一些示例命令:

enter image description here

以及后来的附加示例,CRC 0x07 来自命令 0x15

它还声明

数据按位串行发送,最高有效位在前。

我尝试计算使用 http://www.sunshine2k.de/coding/javascript/crc/crc_js.html 给出的命令示例的 CRC 值

enter image description here

使用反射和非反射输入和结果,但我无法获得与命令示例匹配的计算 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 0c480c f0 64 b8 135a11 03,{a500 {1}} 和 07 代表 15

我不知道如何获得第二个示例中的 48,但我也不知道向上和向下箭头的含义,也不知道蓝色和粉红色的含义。

我也不知道“0x18 的多项式 XOR 值”是什么意思。正确多项式的 Koopman 表示为 0x98,接近但不相同。

更新:

好的,0x18 来自一种真正曲折的 CRC 计算方法,如以下 OP 评论中的链接中的示例所示:

tortuous assembly code

在那个例子中,多项式的应用发生在两个不同的地方。 0x18 是向下移动 1 的多项式,但没有反映,因为代码一次一个地遍历数据位。

这实际上是在 another answer of mine from a while back 中提到的(我忘记了)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。