CRC校验——以SHT4xA温湿度传感器为例
- 一、简介
- 二、计算方法
- (一)步骤
- (二)参考代码(C语言)
- (三)检验:CRC(0xBEEF)= 0x92
- 三、参考
一、简介
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
二、计算方法
具体参考CRC校验——以SHT30温湿度传感器为例(内附SHT30的驱动代码)
(一)步骤
(1) 预置一个值为0xFFFF的16位寄存器,此寄存器为CRC寄存器
(2) 把第一个8位二进制数与16位的CRC寄存器相异或,异或的结果存在CRC寄存器中
(3) CRC寄存器的内容左移一位,用0填补最低位,并检测移出位是0还是1
(4) 如果移出位是0,则重复步骤3,如果移出位是1,则与多项式进行异或
(5) 重复步骤3、4,直到左移8位,这样整个8位数据都进行了处理
(6) 重复步骤2~5,进行下一个字节的处理
(7)最后得到的CRC寄存器的内容即为CRC校验码
(二)参考代码(C语言)
#include <stdio.h>
typedef unsigned char uint8_t;
/*
* crc8校验函数,data为要校验的数据,len为要校验的数据的字节数
*/
uint8_t crc8(const uint8_t *data, int len)
{
const uint8_t POLYNOMIAL = 0x31;
uint8_t crc = 0xFF;
int i, j;
for (i=0; i<len; ++i)
{
crc ^= *data++;
for (j=0; j<8; ++j)
{
crc = ( crc & 0x80 )? (crc << 1) ^ POLYNOMIAL: (crc << 1);
}
}
return crc;
}
int main(int argc, const char *argv[])
{
unsigned char data1[2] = {0x61, 0x04};
unsigned char data2[2] = {0xBE, 0xEF};
printf("0x%02X\n", crc8(data1, 2));
printf("0x%02X\n", crc8(data2, 2));
return 0;
}
/* 输出结果
linux@linux-VirtualBox:~$ ./a.out
0xE4
0x92
*/
(三)检验:CRC(0xBEEF)= 0x92
多项式:0x31 (
x
8
x^8
x8+
x
5
x^5
x5+
x
4
x^4
x4+1)换成二进制为 9‘b1_0011_0001
检验:CRC(0xBEEF)= 0x92
1.第一个8位数据0xBE
:CRC寄存器值为8'hFF
,两者异或
1 0 1 1 1 1 1 0
XOR 1 1 1 1 1 1 1 1
————————————————————
0 1 0 0 0 0 0 1
1)左移一位,移出0,CRC值变成
1 0 0 0 0 0 1 0
2)左移一位,移出1,与多项式0x31
异或
0 0 0 0 0 1 0 0
XOR 0 0 1 1 0 0 0 1
————————————————————
0 0 1 1 0 1 0 1
3)左移一位,移出0,CRC值变成
0 1 1 0 1 0 1 0
4)左移一位,移出0,CRC值变成
1 1 0 1 0 1 0 0
5)左移一位,移出1,与多项式0x31
异或
1 0 1 0 1 0 0 0
XOR 0 0 1 1 0 0 0 1
————————————————————
1 0 0 1 1 0 0 1
6)左移一位,移出1,与多项式0x31
异或
0 0 1 1 0 0 1 0
XOR 0 0 1 1 0 0 0 1
————————————————————
0 0 0 0 0 0 1 1
7)左移一位,移出0,CRC值变成
0 0 0 0 0 1 1 0
8)左移一位,移出0,CRC值变成
0 0 0 0 1 1 0 0
2.第二个8位数据0xEF
,CRC寄存器值0x0C
,两者异或:
1 1 1 0 1 1 1 1
XOR 0 0 0 0 1 1 0 0
————————————————————
1 1 1 0 0 0 1 1
1)左移一位,移出1,与多项式0x31
异或
1 1 0 0 0 1 1 0
XOR 0 0 1 1 0 0 0 1
————————————————————
1 1 1 1 0 1 1 1
2)左移一位,移出1,与多项式0x31
异或
1 1 1 0 1 1 1 0
XOR 0 0 1 1 0 0 0 1
————————————————————
1 1 0 1 1 1 1 1
3)左移一位,移出1,与多项式0x31
异或
1 0 1 1 1 1 1 0
XOR 0 0 1 1 0 0 0 1
————————————————————
1 0 0 0 1 1 1 1
4)左移一位,移出1,与多项式0x31
异或
0 0 0 1 1 1 1 0
XOR 0 0 1 1 0 0 0 1
————————————————————
0 0 1 0 1 1 1 1
5)左移一位,移出0,CRC值变成
0 1 0 1 1 1 1 0
6)左移一位,移出0,CRC值变成
1 0 1 1 1 1 0 0
7)左移一位,移出1,与多项式0x31
异或
0 1 1 1 1 0 0 0
XOR 0 0 1 1 0 0 0 1
————————————————————
0 1 0 0 1 0 0 1
8)左移一位,移出0,CRC值变成
1 0 0 1 0 0 1 0
(3)可以看出CRC值最终变成了0x92.
三、参考
模2除法(CRC)循环冗余校验码在线计算器
CRC校验——以SHT30温湿度传感器为例(内附SHT30的驱动代码)