CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位 监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检 验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”,一般用g(x)表示。 以下用实例来说明: 设一个被校验的数为1010011,生成多项式g(x)=x^5+x^4+x+1,转化为二进制数即110011,宽w即g(x)最高位的阶数,此处为5,那么我们在1010011后加5个0,然后以g(x)为除数作模2除,如下图 
模2除不需要向高位借位,只需每位作异或运算,得到的余数即CRC码,那么发送时应当是1100100011000
,如果传输无误,作和g(x)作模二除,则不会有余数。

此图为DS18B20的CRC生成器的硬件框图,它的工作过程是,这个生成器寄存器里的位开始都初始化为0,在一个时钟作用下,INPUT输入一个bit,生成器寄存器右移一位,那么最低位(LSB)被移出,输入的bit异或,异或结果与原(右移前)的第5位和第4位异或,得到的结果通过右移到了第4位和第3位,然后输入下一个bit,最后生成器寄存器的值称为CRC,这个叫CRC-8-Dallas/Maxim,X^8+X^5+X^4+1(1-Wirebus)。
程序如下:
uchar Calulate_CRC(uchar dat,ucharCRC_Value)//模拟CRC-8-Dallas/Maxim硬件电路X^8+X^5+X^4+1{//0^0==0,0^1==1,1^0==1,1^1==0,说明0与某位异或某位保持不变,1与某位异或要重新计算
uchar i;
bit shift_bit;
for(i=0;i<8;i++)
{
shift_bit=(bit)((CRC_Value^dat)&0x01);//LSB与输入的bit异或
if(shift_bit)
CRC_Value^=0x18;//如果shift_bit是1,那么将它与CRC_Value的第5位和第4位异或,结果写在这两位上
//其它位保持不变
CRC_Value>>=1;
if(shift_bit)
CRC_Value|=0x80;//1的话把最高位写1
dat>>=1;//接着输入第2位
}
return(CRC_Value);
}
|