首页 > 解决方案 > 我如何为这个协议建模 CRC

问题描述

我有一个 TWI 设备的协议规格表,其中指出:

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

该规范提供了一些示例命令:

在此处输入图像描述 稍后还有一个附加示例,其中 CRC 0x07 由命令 0x15 产生

它还指出

数据以最高有效位在前按位顺序发送。

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

在此处输入图像描述

使用反射和非反射输入和结果,但我无法得到计算的 CRC 以匹配命令示例。

我错过了一些明显的东西吗?

标签: crc

解决方案


反映了CRC,多项式为x 8 +x 5 +x 4 +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;
}

这给出了、06for 、for 、for和for的CRC 。0c480c f0 64 b8 135a11 03a5000715

我不知道如何48在第二个示例中获得,但我也不知道向上和向下箭头是什么意思,也不知道蓝色和粉红色是什么意思。

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

更新:

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

曲折的汇编代码

在那个例子中,多项式的应用发生在两个不同的地方。是0x18多项式向下移动了一位,尽管由于代码一次一位地通过数据位而没有反映出来。

这实际上在我不久前的另一个答案中注意到了(我忘记了)。


推荐阅读