您好,
我必须通过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