標(biāo)題: CRC校驗(yàn)的原理及CRC硬件電路的模擬 [打印本頁]

作者: 51黑黑黑    時(shí)間: 2016-2-13 02:04
標(biāo)題: CRC校驗(yàn)的原理及CRC硬件電路的模擬
CRC的全稱為Cyclic Redundancy Check,中文名稱為循環(huán)冗余校驗(yàn)。利用CRC進(jìn)行檢錯(cuò)的過程可簡單描述為:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)校驗(yàn)用的r位 監(jiān)督碼(CRC碼),附在原始信息后邊,構(gòu)成一個(gè)新的二進(jìn)制碼序列數(shù)共k+r位,然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢 驗(yàn),以確定傳送中是否出錯(cuò)。這個(gè)規(guī)則,在差錯(cuò)控制理論中稱為“生成多項(xiàng)式”,一般用g(x)表示。

以下用實(shí)例來說明:

設(shè)一個(gè)被校驗(yàn)的數(shù)為1010011,生成多項(xiàng)式g(x)=x^5+x^4+x+1,轉(zhuǎn)化為二進(jìn)制數(shù)即110011,寬w即g(x)最高位的階數(shù),此處為5,那么我們在1010011后加5個(gè)0,然后以g(x)為除數(shù)作模2除,如下圖

   模2除不需要向高位借位,只需每位作異或運(yùn)算,得到的余數(shù)即CRC碼,那么發(fā)送時(shí)應(yīng)當(dāng)是1100100011000
,如果傳輸無誤,作和g(x)作模二除,則不會(huì)有余數(shù)。





   此圖為DS18B20的CRC生成器的硬件框圖,它的工作過程是,這個(gè)生成器寄存器里的位開始都初始化為0,在一個(gè)時(shí)鐘作用下,INPUT輸入一個(gè)bit,生成器寄存器右移一位,那么最低位(LSB)被移出,輸入的bit異或,異或結(jié)果與原(右移前)的第5位和第4位異或,得到的結(jié)果通過右移到了第4位和第3位,然后輸入下一個(gè)bit,最后生成器寄存器的值稱為CRC,這個(gè)叫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與某位異或要重新計(jì)算
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位異或,結(jié)果寫在這兩位上
                  //其它位保持不變
  CRC_Value>>=1;
  if(shift_bit)
  CRC_Value|=0x80;//1的話把最高位寫1
  dat>>=1;//接著輸入第2位
}
return(CRC_Value);
}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1