uint8_t crc8(const uint8_t *data, int len)
{
return crc8_arg(data, len, 0);
}
uint8_t crc8_arg(const uint8_t *data, int len, uint8_t previous_crc)
{
unsigned crc = previous_crc << 8;
int i, j;
for (j = len; j; j--, data++) {
crc ^= (*data << 8);
for (i = 8; i; i--) {
if (crc & 0x8000)
crc ^= (0x1070 << 3);
crc <<= 1;
}
}
return (uint8_t)(crc >> 8);
}
TI參考資料連結
CRC 即循环冗余校验码(Cyclic Redundancy Check),是数据通信领域中最常用的一种差错校验码,
其特征是信息字段和校验字段的长度可以任意选定。利用 CRC 进行检错的过程可简单描述为:在发送端
根据要传送的 k 位二进制码序列,以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息后
边,构成一个新的二进制码序列数共 k+r 位,然后发送出去。在接收端,根据信息码和 CRC 码之间所遵
循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。
在 UCD 系列控制器中采用 8 位循环冗余校验(CRC-8),生成多项式为:C(x) = x8 + x2 + x1 + 1,表
示成二进制是 0b100000111。
0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 1 1 0 1 0 0 1 0 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 1 0 1 0 1 0 1 0 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 1 0 1 0 1 1 0 1 0 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 1 0 1 1 1 0 1 0 0 = CRC
1 0 0 0 0 0 1 1 1 异或(生成多项式)
0 0 1 1 1 0 0 1 1 = CRC (0x73) |