1、CRC簡介
CRC 是Cyclic Redundancy Check的縮寫,循環(huán)冗余校驗(yàn),用于校驗(yàn)數(shù)據(jù)傳輸?shù)耐暾浴?一般情況下在數(shù)據(jù)發(fā)送前計(jì)算CRC校驗(yàn)值,附在發(fā)送數(shù)據(jù)之后,數(shù)據(jù)接收方也按照同樣方法計(jì)算CRC,然后對比計(jì)算結(jié)果,如果一致說明數(shù)據(jù)數(shù)據(jù)傳輸無誤,否則數(shù)據(jù)傳輸出錯。
2、什么是模二運(yùn)算
CRC計(jì)算采用二進(jìn)制模二除法,來解釋一下模二運(yùn)算,模二運(yùn)算忽略進(jìn)位和借位,下面一一解釋。
1)模二加法,類似異或運(yùn)算
1+1=0 0+0=0
1+0=1 0+1=1
2)模二減法,類似異或運(yùn)算
1-1=0 0-0=0
1-0=1 0-1=1
3)模二乘法
1×1=1 0×0=0
1×0=0 0×1=0
4)模二除法
模二除法和十進(jìn)制除法類似,運(yùn)用了模二乘法和模二減法,直接舉例說明。
3、常見CRC模型如下:
不同的多項(xiàng)式計(jì)算方法不同,下面以CRC-5/EPC舉例說明:
多項(xiàng)式公式 :x5 + x3 + 1
完整寫出來是x5 + 0x4 + x3 + 0x2 + 0*x + 1
多項(xiàng)式 :取以上多項(xiàng)式中的系數(shù)101001為多項(xiàng)式,一般最高位不寫出來,所以多項(xiàng)式是01001,即0x09
初始值 :運(yùn)算的初始值,EPC要求是0x09
結(jié)果異或值 :所有數(shù)據(jù)計(jì)算完的結(jié)果與其異或,EPC這里是0
輸入反轉(zhuǎn) :輸入數(shù)據(jù)每字節(jié)高低位是否翻轉(zhuǎn),EPC不翻轉(zhuǎn)。
輸出反轉(zhuǎn) :輸出結(jié)果高低位是否翻轉(zhuǎn),EPC不翻轉(zhuǎn)。
4、手撕CRC
仍然以CRC-5/EPC舉例,計(jì)算字節(jié)0xAA的CRC值,這是一個5位的CRC,使用模二除法,最終計(jì)算出5位CRC校驗(yàn)值。 被除數(shù)是0xAA,二進(jìn)制10101010,除數(shù)是多項(xiàng)式,即101001。 計(jì)算過程如下圖所示,為了表明計(jì)算過程把商為0的計(jì)算過程也寫出來了。 這是5位CRC,只取最后5位,即10000。 輸出結(jié)果不需要異或也不需要反轉(zhuǎn),所以10000就是計(jì)算結(jié)果。
兩個字節(jié)AA55的CRC計(jì)算過程,同樣為了表明計(jì)算過程把商為0的計(jì)算過程也寫出來了。 這是5位CRC,只取最后5位,即01000。 輸出結(jié)果不需要異或也不需要反轉(zhuǎn),所以01000就是計(jì)算結(jié)果。
再舉一個例子,仍然計(jì)算0xAA的CRC。 這次采用模型CRC-5/USB,多項(xiàng)式:x5+x2+1,輸入輸出數(shù)據(jù)都反轉(zhuǎn),多項(xiàng)式0x05,初始值為0x1F,輸出異或值為0x1F。 最終計(jì)算結(jié)果00111。
5、C語言實(shí)現(xiàn)
以下是CRC-5/EPC的C語言實(shí)現(xiàn)代碼:
/*
* Name: CRC-5/EPC x5+x3+1
* Poly: 0x09
* Init: 0x09
* Refin: False
* Refout: False
* Xorout: 0x00
* Note:
*/
uint8_t crc5_epc(uint8_t *data, uint16_t length)
{
uint8_t i;
//初始值是0x09的低5位,要和輸入數(shù)據(jù)的高五位異或
//所以0x09左移三位,00001001<<3 = 01001000 = 0x48
uint8_t crc = 0x48;
while(length--)
{
crc ^= *data++; //異或第一個字節(jié)
for ( i = 0; i < 8; i++ )
{
if ( crc & 0x80 )
{
//最高位是1,需要異或多項(xiàng)式,多項(xiàng)式是最高位為1的6bit
//多項(xiàng)式異或后最高位為0,所以這里不異或最高位了,他肯定是0
//直接把crc左移1位,去掉最高位,然后異或多項(xiàng)式的低5bit
//多項(xiàng)式是0x09<<3 = 00001001<<3 = 01001000 = 0x48
crc = (crc << 1) ^ 0x48; // 0x48 = 0x09<<(8-5)
}
else
{
//最高位是0,所以商為0,可以省去運(yùn)算,見上面圖表,因?yàn)楹?異或值不變。
crc <<= 1;
}
}
}
return crc >> 3; //計(jì)算完成后結(jié)果在高5位,右移動3位。
}
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1961瀏覽量
64866 -
二進(jìn)制
+關(guān)注
關(guān)注
2文章
801瀏覽量
41767 -
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29594 -
運(yùn)算
+關(guān)注
關(guān)注
0文章
132瀏覽量
25864 -
循環(huán)冗余校驗(yàn)
+關(guān)注
關(guān)注
0文章
7瀏覽量
6580
發(fā)布評論請先 登錄
相關(guān)推薦
PSoC 4 循環(huán)冗余校驗(yàn) (CRC)
CRC循環(huán)冗余校驗(yàn)的算法
轉(zhuǎn):循環(huán)冗余校驗(yàn)(CRC)算法入門引導(dǎo)
如何利用循環(huán)冗余校驗(yàn)(CRC)計(jì)算單元進(jìn)行傳輸數(shù)據(jù)的校驗(yàn)呢
循環(huán)冗余校驗(yàn)碼的單片機(jī)及CPLD 實(shí)現(xiàn)
循環(huán)冗余校驗(yàn)碼---CRC碼
![<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>碼---<b class='flag-5'>CRC</b>碼](https://file1.elecfans.com//web2/M00/A5/4F/wKgZomUMN9mANRdNAAACdNFrOnw261.gif)
基于FPGA的循環(huán)冗余校驗(yàn)實(shí)驗(yàn)系統(tǒng)
![基于FPGA的<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>實(shí)驗(yàn)系統(tǒng)](https://file1.elecfans.com//web2/M00/A6/29/wKgZomUMPAmAbbs4AAARDkiuYmM608.jpg)
STM32L4循環(huán)冗余校驗(yàn)模塊(CRC)介紹
循環(huán)冗余校驗(yàn)奇偶校驗(yàn)累加和校驗(yàn)等知識分享
![<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>奇偶<b class='flag-5'>校驗(yàn)</b>累加和<b class='flag-5'>校驗(yàn)</b>等知識分享](https://file1.elecfans.com//web2/M00/A6/DF/wKgZomUMQP2ATwjjAACskJcxcmc299.png)
crc循環(huán)冗余校驗(yàn)碼算法
![<b class='flag-5'>crc</b><b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>碼算法](https://file1.elecfans.com//web2/M00/A7/04/wKgZomUMQdWAQ_jkAAALcgmLiFw464.jpg)
PIC24F系列參考手冊之可編程循環(huán)冗余校驗(yàn)(CRC)
![PIC24F系列參考手冊之可編程<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>(<b class='flag-5'>CRC</b>)](https://file.elecfans.com/web1/M00/55/99/pIYBAFswaAuATlNNAABXR1AScJA773.jpg)
Verilog數(shù)字系統(tǒng)基礎(chǔ)設(shè)計(jì)中的循環(huán)冗余校驗(yàn)
32位可編程循環(huán)冗余校驗(yàn)(CRC)
![32位可編程<b class='flag-5'>循環(huán)</b><b class='flag-5'>冗余</b><b class='flag-5'>校驗(yàn)</b>(<b class='flag-5'>CRC</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論