This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CRC 8位多项式X^8 + 1

Guru**** 2333840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/581810/crc-8-bit-polynomial-x-8-1

您好,

我必须通过SCI从外部设备检查CRC。

CRC计算为SCI 8位数据,其CRC代码G (X)= X^8 + 1

然后我有以下代码来计算它:

静态uint8_t dv_SmartAbs_iCaclCrc (uint8_t*数据,uint8_t大小)
{
uint8_t j;
uint8_t carry;
uint8_t crc;

crc = 0;

while (size-->0)
{
CRC ^=*数据++;
(j = 8;j != 0;j--)
{
Carry = CRC和0x80;
CRC <<= 1;
如果(携带!= 0)
{
CRC ^= 0x01;/* Polynome X^8 + 1 */
}
}
返回
(CRC和0x00FF);
} 

因此,如果我有以下缓冲区:

0x001A,0x0020,0x00AF,0x000A,0x0001, 0x0011,0x0002,0x0000,0x0000,0x0080, (大小= 10)我有以下结果:

CRC = 0x0D0D,被截断为8 LSB SO 0x0D。

这适用于我的外部设备。

否。我将使用VCU使用CRC库。 但数据表显示它使用多项式0x7。 这似乎与我的多项式不符?

为了检查这个,我决定实施我的算法,它尊重0x07多项式,并检查我的算法是否找到了与库相同的CRC。

如果在我的算法中,我用0x07替换多项式0x01 (替换 CRC ^= 0x01; 替换 CRC ^= 0x07;)

CRC的结果是0x53B9,CRC_run8位的结果 是0xAB,CRC_run8位反射 的结果是0x29 (种子=0),但不是0xB9。

我错过了什么?

crc_run8

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

    我将应用查找表方法。

    使用0x01多项式,CrcTable[i]= i !

    然后,CRC算法为Reduce Only以生成逻辑XOR,所有字节都要检查!。

    CRC = 0;
    while (size-!= 0)
    {
    	CRC =((* Data++)^ CRC);
    /* CRC = CRC8_table[CRC];*/
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    VCU CRC期望将字节打包,即 0x201A, 0x0AAF,0x1101,0x0002,  0x8000  

    我在此处发布了一个未打包的CRC算法:  

    您需要将装配体中的VCRC16L_Px指令更改为VCRC8L

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    感谢您的支持,

    我将进行测试,但这很奇怪,因为我很清楚16位值的MSB字节会改变CRC的结果,但我也看到6,7,8,9和10位16位值会改变结果。 这意味着大小(10)是以字为单位,而不是以字节为单位?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大小始终是字节数。

    假设CRC的种子值为0x0,则所有前导零将产生0 CRC。 当您达到第一个非零值0x1A时,它会更改CRC。 任何后续的0也会更改CRC,这就是CRC值在处理第一个单词的高位字节0x001A时发生变化的原因。

    当您在VCU库中以10作为size_in_bytes参数运行正常的CRC函数时,您仅在0x001A,0x0020,0x00AF,0x000A,0x0001上运行CRC。 因此,您必须使用E2E帖子中的alternate函数,该函数仅占用每个单词的低字节。