您的位置 首页 FPGA

CRC校验原理与程序设计――(RS485总线体系应用之1)

1.CRC校验原理1.1 CRC的基本概念:CRC是英文Cyclical Redundancy Check的缩写,翻译成中文通常称作循环冗余校验或简称为CRC校验。它是数据传输领域中

1.CRC校验原理

1.1 CRC的基本概念:

CRC是英文Cyclical Redundancy Check的缩写,翻译成中文一般称作循环冗余校验或简称为CRC校验。它是数据传输范畴中最常用的一种过失校验办法,其特点是传输数据和CRC校验值的长度可以恣意选定。在当今手机、核算机和数码产品遍及的信息数字化年代,CRC校验无处不在。CRC分为多种规范,例如:CRC -12码一般用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其间CRC-16多为美国选用,而CRC- CCITT多为欧洲国家所选用。而CRC-32码大都被使用在Point-to-Point的同步传输中。更多的CRC校验规范类型拜见附表:CRC校验规范类型。

1.2 CRC校验的基本原理:

在代数编码理论中,一个数值可以表明为一个多项式。例如:一个十进制数值2892,可以用多项式表明为2×3 + 8×2 + 9x + 2(x=10)。同理,一个二进制数值1010101对应的多项式为x6 + x4 + x2 + 1(x=2)。

生成CRC码的基本原理是:设被校验的数据为K位,校验码为R位,码字长度为N(=K+R),则关于CRC码会集的任一码字,存在且仅存在一个R次多项式g(x),使得

V(x)=A(x)g(x)=xRm(x) + r(x);

其间: m(x)为被校验数据的K-1次多项式

r(x)为校验码的R-1次多项式

g(x)称为生成多项式:g(x)=g0 + g1x1 + g2x2 + … + g(R-1)x(R-1) + gRxR

发送方经过指定的g(x)核算出CRC校验码,接收方则经过该g(x)来验证收到的CRC校验码。综上所述,一个完好的CRC校验进程是:

发送方:依据要传送的K位原始数据(二进制码序列),以规范指定的多项式核算出一个R位校验码(CRC码),附在原始数据后边,构成一个新的二进制码序列共K + R位,然后发送出去。

接收方:将接收到的数据除以与发送方相同的多项式值,假如可以除尽,则正确,不然证明犯错。还有别的一种处理,便是接收方用发送方相同的办法核算出接收到数据的CRC校验值,再与发送方发来的校验值比较,相同则正确,不然证明犯错。

2. CRC校验码的核算进程:

例如:有一个要发送的7位二进制数1011001;对应的m(x)=x6 + x4 + x3 + 1。设CRC校验码取4位并设g(x)=x4 + x + 1,则该多项式对应的值是10011。依据CRC规矩,为确保被除数够除,首要需即将发送的数扩展2R 即24倍(左移4位),得到 10110010000,对应的xRm(x)=x10 + x8 + x7 + x4 。

CRC校验码的生成实质其实便是选用模2除法取余数,该除法的简捷核算便是将除数和被除数按位做异或(相同为0,不同为1。0^0=0; 0^1=1; 1^0=1; 1^1=0)运算。需求留意的是,进行异或运算时除数有必要和被除数最高有用位对齐。下面是将10110010000除以11001手艺核算的演示,得到余数为1010,该值便是数据1011001的CRC校验值。

10110010000 将1011001左移4位

10011 多项式值与被除数最高有用位对齐

=00101010000 第1次异或成果

10011 多项式值与被除数最高有用位对齐

=00001100000 第2次异或成果

10011 多项式值与被除数最高有用位对齐

=00000101100 第3次异或成果

10011 多项式值与被除数最高有用位对齐

=00000001010 第4次异或成果

为了简洁核算机程序求解CRC,在实践使用中一般把多项式值的最高位舍掉,而且将参与核算的数据高低位倒置后再核算。前面的演算数据倒置后的运算状况如下:

00001001101

11001

00001010100

11001

00000110000

11001

00110100000

11001

01010000000

提请留意:只要真实读懂以上手艺演算的进程和规则,才干理解下节内容。

3. CRC校验的程序设计

下面以最常用的CRC-16-IBM校验规范为例来阐明CRC校验码的生成进程。 由于CRC-16码由两个字节构成,所以首要要预备一个16位的CRC寄存器,并将每一位都置1。详细的核算进程为:

① 设置CRC寄存器,并给其赋值FFFFH。

② 将被校验数据的第一个字节(8Bit)与CRC寄存器的低8位进行异或,成果存CRC寄存器。

③ CRC寄存器的值向右移一位,最高位(MSB)补零,查看移出的最低位(LSB)是否为1。

④ 假如LSB为0,重复第三步;若LSB为1,CRC寄存器与CRC16多项式值A001H相异或。

⑤ 重复第③与第④步,直到该字节的8次移位悉数完结。

⑥ 假如被校验数据有多个字节,则重复第②至第⑤步直到一切数据悉数处理完。

⑦ 终究CRC寄存器的内容即为CRC值。

3.1 用查表法求CRC函数的程序

查表法省去了将被校验数据移位并与多项式异或核算的进程,因而比核算法更方便,但程序编码量偏大。

3.1.1 用VC编写的程序

unsigned short CRC16(puchMsg, usDataLen)

unsigned char * puchMsg ;

unsigned short usDataLen ;

{

unsigned char uchCRCHi = 0xFF ;

unsigned char uchCRCLo = 0xFF ;

unsigned uIndex ;

while (usDataLen–)

{

uIndex = uchCRCLo ^ * puchMsg++ ;

uchCRCLo = uchCRCHi ^ auchCRCLo [uIndex] ;

uchCRCHi = auchCRCHi [uIndex] ;

}

return (uchCRCLo 8 | uchCRCHi) ;

}

static char auchCRCHi[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/141296.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部