0-0AVR236_程序空间的CRC校验
- 格式:doc
- 大小:82.50 KB
- 文档页数:8
AVR单片机CRC校验码的查表与直接生成》用AVR汇编语言实现的CRC-32源程序如下:. ;计算法生成CRC-32.include"m128def.inc";调用头文件.org $0000;程序起始地址rjmp reset.def crc0=r0;32位CRC检验码寄存器.def crc1=r1.def crc2=r2.def crc3=r3.def poly0=r4;32位CRC生成多项式寄存器.def poly1=r5.def poly2=r6.def poly3=r7.def address=r8;帧数据寄存器.def control=r9.def information=r10.def count0=r17;计数寄存器.def count1=r18.def temp=r16.equ data=$0100;数据存放起始地址.org $0010(以下这段程序的功能是:初始化堆栈段)reset:ldi r16,low(ramend)out spl,r16ldi r17,high(ramend)out sph,r16(以下这段程序的功能是:初始化数据,给32位CRC校验码寄存器附初值,给32位CRC生成多项式寄存器赋值,给计数寄存器附初值)ldi temp,0xedmov poly3,templdi temp,0xb8mov poly2,templdi temp,0x83mov poly1,templdi temp,0x20mov poly0,templdi temp,0mov crc0,tempmov crc1,tempmov crc2,tempmov crc3,templdi count0,0ldi count1,0ldi r30,$00ldi r31,$01ldi temp,0b10110101st z+,templdi temp,0b11101011st z+,templdi temp,0b11001001st z+,templdi temp,0st z+,tempst z+,tempst z+,tempst z+,templdi r30,$00(以下这段程序执行的功能是:当32位CRC校验码寄存器的首位不为零时,使32位CRC校验码寄存器中的值与32位CRC生成多项式寄存器中的值相异或,然后在把当前数据单元的最高位置于32位CRC校验码寄存器的最低位,原来32位CRC校验码寄存器中的二进制数据依次向左移动一位)loop:ld temp,z+clcrol temprol crc0rol crc1rol crc2rol crc3brcc loopeor crc0,poly0eor crc1,poly1eor crc2,poly2eor crc3,poly3inc count0cpi count0,8brne loopldi count0,0rjmp next(以下这段程序执行的功能是:转到下一个数据单元继续执行loop子程序,直到所有的数据都被执行完毕)next:cpi count1,7;注释一breq overinc count1rjmp loopover:noprjmp over注释一:在本例中数据单元为3个8位二进制串,校验位为4个8位二进制串,故上式中结束条件为count1为7,推而广之如果数据为n个8位二进制串,则结束条件count1为n+4用查表法得到32位CRC校验码的源程序如下. ;32位CRC校验码的查表生成法.include"m128def.inc";调用头文件.org $0000;程序起始地址rjmp reset.def crc0=r0;32位CRC校验码寄存器.def crc1=r1.def crc2=r2.def crc3=r3.def address=r4;帧数据寄存器.def control=r5.def information=r6.def crctable0=r7;查到的表值寄存器.def crctable1=r8.def crctable2=r9.def crctable3=r10.equ data=$0100;数据存放首地址.equ table=$1000;表存放首地址.def temp=r17.def count0=r18;计数寄存器.def count1=r19.org $0010(下面这段程序执行的功能是:初始化堆栈段)reset:ldi r16,low(ramend)out spl,r16ldi r16,high(ramend)out sph,r16ldi temp,0x00;设置32位CRC寄存器,并给其赋值0mov crc0,tempmov crc1,tempmov crc2,tempmov crc3,templdi r30,$00;z指针指向数据起始地址ldi r31,$01(下面这段程序执行的功能是:存储数据)ldi temp,0b10110101ldi temp,0b11101011st z+,templdi temp,0b11001001st z+,templdi temp,0x00st z+,tempst z+,tempst z+,tempst z+,templdi r30,$00ldi count0,0ldi count1,0(下面这段程序执行的功能是:根据32位CRC校验码寄存器中最低字节与当前数据的异或值来查找32位CRC生成表,得到异或值所指的32位CRC生成表中的内容)next1:ld temp,z+eor temp,crc0clcmov r24,templdi r25,0lsl r24rol r25clclsl r24rol r25ldi r29,$10add r29,r25mov r28,r24ld crctable3,y+ld crctable2,y+ld crctable1,y+ld crctable0,y+(下面这段程序执行的功能是:将32位CRC寄存器右移8位)loop:cpi count0,8breq nextclcror crc3ror crc2ror crc1ror crc0clcrjmp loop(下面这段程序执行的功能是:使得到的32位CRC生成表中的数据和32位CRC 校验码寄存器中的数据进行异或运算,直到所有的数据都处理完毕,最终得到32位CRC校验码)next:eor crc3,crctable3eor crc2,crctable2eor crc1,crctable1eor crc0,crctable0inc count1cpi count1,7;判断是不是所有的数据都处理完毕brne next1over:nop。
CRC校验实现方法CRC原理CRC是什么东西呢?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。
CRC有什么用呢?它的应用范围很广泛,最常见的就是在网络传输中进行信息的校对。
其实我们大可以把它应用到软件保护中去,因为它的计算是非常非常非常严格的。
严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。
所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用16进制工具暴力破解过了。
我们先来看看CRC的原理。
首先看两个式子:式一:9 / 3 = 3 (余数 = 0)式二:(9 + 2 ) / 3 = 3 (余数 = 2)在小学里我们就知道,除法运算就是将被减数重复地减去除数X 次,然后留下余数。
所以上面的两个式子可以用二进制计算为:(不会二进制计算的可以撤退了)式一:1001 - 0011 =0110 对应的十进制等式为:9-3=6;0110 - 0011 =0011 对应的十进制等式为:6-3=3;0011 – 0011 =0000 对应的十进制等式为:3-3=0;一共减了3次,所以商是3,而最后一次减出来的结果是0,所以余数为0。
式二:1011 - 0011 =1000 对应的十进制等式为:11-3=8;1000 - 0011 =0101 对应的十进制等式为:8-3=5;0101 – 0011 =0010 对应的十进制等式为:5-3=2;一共减了3次,所以商是3,而最后一次减出来的结果是2,所以余数为2。
crc校验-循环冗余校验原理和方法-回复标题:循环冗余校验(CRC)原理与方法在数据通信领域,确保数据的完整性是至关重要的。
任何数据传输过程都可能引入错误,因此需要采用一种可靠的方法来检测和纠正这些错误。
这就是循环冗余校验(CRC)的作用。
本文将详细介绍CRC的原理和方法。
一、CRC的基本原理CRC是一种根据数据产生一个简短固定位数的校验码的方法。
它通过将待校验的数据与一个预先定义好的生成多项式进行模二除法运算,得到的余数即为CRC校验码。
接收方再用同样的生成多项式对收到的数据和校验码进行模二除法运算,如果余数为0,则表示数据正确无误;否则,就表示数据出现了错误。
二、CRC的工作流程1. 数据预处理:首先,对原始数据进行一些预处理操作,例如添加填充位、反转位序等,以满足特定的CRC算法要求。
2. 计算CRC校验码:然后,使用预定的生成多项式对预处理后的数据进行模二除法运算,得到的余数就是CRC校验码。
3. 传输数据和校验码:最后,将原始数据和计算得到的CRC校验码一起发送给接收方。
三、CRC的生成多项式选择生成多项式的选择对于CRC的性能至关重要。
一个好的生成多项式应具备以下特点:1. 最高位和最低位必须为1,这样可以保证最高次项和常数项不为0。
2. 应尽量避免有太长的连续0或1,因为这会导致检错能力下降。
3. 应尽量包含更多的1,这样可以提高检错能力。
4. 可以选择常用的标准生成多项式,如CRC-8、CRC-16、CRC-32等。
四、CRC的优缺点优点:1. 简单易实现:只需要简单的逻辑运算即可完成校验。
2. 效率高:相比于其他复杂的检错编码方法,CRC的计算速度更快。
3. 检错能力强:只要生成多项式选择得当,CRC可以检测出大部分的突发错误和随机错误。
缺点:1. 不能纠错:一旦检测到错误,只能丢弃数据包,无法纠正错误。
2. 对于某些特定的错误模式,可能会出现漏检的情况。
五、总结总的来说,CRC是一种简单而有效的数据校验方法。
crc校验原理及步骤嘿,咱今儿就来聊聊这 CRC 校验!你说这 CRC 校验啊,就像是给数据穿上了一件特别的“保护衣”。
它的原理呢,其实挺有意思。
就好像我们要识别一群人里有没有冒牌货,得有个特别的办法来判断。
CRC 校验就是通过一种特定的计算方式,给数据生成一个独一无二的“标记”。
那具体步骤是咋样的呢?首先啊,得选个合适的生成多项式,这就好比选一把合适的钥匙。
然后呢,把要校验的数据当成宝贝一样,和这个生成多项式一起进行一番奇妙的运算。
这运算过程啊,就像是一场数据的舞蹈,各种数字在里面蹦跶、组合。
等这舞蹈结束,就得到了一个校验码。
这个校验码可重要啦,就像人的身份证号一样,能证明数据的身份。
当数据要传输或者存储的时候,就把这个校验码也带上。
等数据到了目的地,接收方再按照同样的步骤来一次,看看算出来的校验码和带来的一不一样。
如果一样,那就说明数据在旅途中没出啥问题,完好无损地到达啦!要是不一样呢,哎呀,那可就麻烦啦,说明数据可能在途中遭遇了什么“小意外”,得赶紧找找问题出在哪儿。
你想想,要是没有这 CRC 校验,那数据在传输过程中出了错都不知道呢!这就好像我们寄个重要包裹,没有保价一样,心里多不踏实呀!CRC 校验在很多地方都大显身手呢!比如在通信领域,它能确保信息准确无误地传达;在计算机存储中,它能保证数据的可靠性。
它就像一个默默无闻的守护者,时刻守护着数据的安全。
所以啊,可别小瞧了这 CRC 校验,它虽然听起来有点复杂,但作用可大着呢!它就像是数据世界里的一位忠诚卫士,为我们的数据保驾护航,让我们能安心地使用和传输数据。
你说是不是很厉害呢?。
CRC校验原理及其C语言实现-机电之家网PLC技术网CRC校验原理及其C语言实现在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。
通常,CRC的除数用生成多项式来表示。
最常用的CRC码的生成多项式有CRC16,CRC32.以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x)求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。
生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码PLC资料网接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。
用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5 +1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x 2+x+1 以上是摘录的一段介绍,是不是觉得很玄?我第一次看也是觉得很晕,后来查询了一些规约和协议的实现资料以后,才恍然大悟。
CRC校验原理及实现CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于检测数据传输过程中的错误。
它通过使用一个或多个生成多项式来计算数据的校验值,然后将校验值添加到数据末尾传输。
接收方将使用相同的生成多项式来计算接收到的数据的校验值,并将其与接收到的校验值进行比较,如果不匹配,则说明数据存在错误。
CRC校验的核心原理是多项式除法,其中数据位被视为多项式的系数,并且我们可以使用位运算来表示多项式除法。
CRC校验使用的生成多项式通常是固定的,并被称为CRC多项式。
生成多项式的选择对于CRC校验的性能非常关键。
常用的CRC多项式包括CRC-16、CRC-32等。
实现CRC校验的步骤如下:1.选择一个适当的CRC多项式。
这个选择取决于应用的特定要求和标准。
2.将CRC初始值设为0。
3.将待传输的数据的每一个字节按位表示为一个多项式,并将他们连接成一个多项式。
4.对于每一个数据字节,将多项式除以CRC多项式。
可以使用位运算来进行除法运算。
5.将余数作为CRC多项式的系数与下一个数据字节连接形成一个新的多项式,并继续除法运算。
6.对于最后一个数据字节,除法完成后会有一个最终的余数。
将这个余数作为校验值。
7.在传输数据时,将校验值附加到数据的末尾。
8.接收方通过接收到的数据和附加的校验值进行相同的CRC校验过程。
9.接收方计算得到的校验值与接收到的校验值比较,如果相同,则数据传输正确;如果不同,则数据传输存在错误。
CRC校验具有高效、可靠和简单的特点。
它可以检测到大部分单比特错误和多比特错误。
然而,CRC校验只能检测错误,而不能纠正错误。
所以在实际应用中,通常需要结合其他的纠错方法,如重传机制,以确保数据传输的可靠性。
总结起来,CRC校验是一种常用的错误检测技术,利用多项式除法计算数据的校验值。
实现CRC校验需要选择适当的CRC多项式,并进行多次除法运算,然后将计算得到的校验值附加到数据末尾进行传输。
crc的校验原理
CRC(循环冗余检验)是一种常用的校验方法,它基于多项
式运算和模2除法,用于检测数据传输中的错误。
CRC校验的原理是将待校验的数据看作是一个二进制数,然
后选择一个生成多项式来进行模2除法运算。
生成多项式通常为一组二进制数,例如:1011、11001等。
数据发送方在发送
数据之前,通过将待发送的数据与生成多项式进行模2除法运算,得到余数,并将余数附加在数据的末尾。
接收方在接收到数据后,再次执行相同的除法运算,若余数为0,则认为数据
传输无错误,若余数不为0,则认为数据传输存在错误。
CRC校验的特点是能够检测出多位错误,并且有较低的错误
检测漏率。
由于CRC校验仅依赖于生成多项式,因此在发送
方和接收方需要约定好相同的生成多项式。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
总结起来,CRC校验通过模2除法运算,将生成多项式与待
校验的数据进行运算,得到余数来判断数据传输是否存在错误。
其优点是高效、可靠,并且可以检测多位错误,因此在数据传输领域得到了广泛应用。
CRC 校验码的原理在通信与数字信号处理等领域中循环冗余校验码(Cyclic Redundancy Check,CRC )是一种很常用的设计。
一般来说数据通信中的编码可以分为信源编码和信道编码两大类,其中,为了提高数据通信的可靠性而采取的编码称为信道编码,即抗干扰编码。
在通信系统中,要求数据传输过程中的误码率足够低,而为了降低数据传输过程中的误码率,经常采用的一种方法是差错检测控制。
在实际的通信系统中,差错检测控制的主要方法又3种:前向纠错(FEC ),自动重发(ARQ )和反馈检验法。
FEC 指接收端不仅能够在收到的信码中发现错码,而且还能够纠正错码。
一般来说,这种方法不需要反向信道,实时性很好,不过设备较复杂。
ARQ 是指接收端在收到的信码中检测出错码时,即设法通知发送端重新发送信号,直到能够正确接收为止。
通常,这种方法只用来检测误码,而且只能在双向信道中使用。
反馈检验法是指接收端将收到的信码一字不差地转发回发送端,同时与原发送信码进行比较,如果有错,则发端重发。
这种方法的原理和设备都比较简单,但需要双向信道的支持,而且传输效率低下; 通过实践检验,在这三中方法中,如果传输过程中的误码率较低,那么采用前向纠错法比较理想,但如果误码率较高时,这种方法又会出现“乱纠”的现象;在网络通信中,广泛的采用差错检测方法时自动请求重发,这种方法只要检错功能即可;反馈检验法时前向纠错法和自动请求重发的结合。
在实现差错检测控制的众多方法中,循环冗余校验就是一类重要的线性分组码。
它时一种高效的差错控制方法,它广泛应用于测控及数据通信领域,同时具有编码和解码方法简单,检错能力强,误判概率很低和具有纠错能力等优点。
循环冗余校验码实现的方法CRC 的基本原理就是在一个P 位二进制数据序列之后附加一个R 位二进制检验码序列,从而构成一个总长位N=P+R 位的二进制序列。
例如,P 位二进制数据序列D=[d 1-p d 2-p …d 1d 0],R 位二进制检验码R = [r 1-r r 2-r …r 1r 0],那么所得到的这个N 位二进制序列就是M=[d 1-p d 2-p …d 1d 0 r 1-r r 2-r …r 1r 0],这里附加在数据序列之后的CRC 码与数据序列的内容之间存在着某种特定的关系。
1AVR236: CRC Check of Program MemoryFeatures•CRC Generation and Checking of Program Memory •Supports all AVR ® Controllers with LPM Instruction•Compact Code Size, 44 Words (CRC Generation and CRC Checking)•No RAM Requirement•Checksum Stored in EEPROM•Execution Time: 90 ms (AT90S8515 @ 8 MHz)•16 Bits Implementation, Easily Modified for 32 Bits•Supports the CRC-16 Standard, Easily Modified for CRC-CCITT, CRC-32IntroductionThis application note describes CRC (Cyclic Redundancy Check) theory and imple-mentation of CRC to detect errors in program memory of the Atmel AVR microcontroller.CRC is a widely used method of detecting errors in messages transmitted over noisy channels. New standards for secure microcontroller applications has introduced CRC as a method of detecting errors in Program memory of microcontrollers. It is prefera-ble to implement the CRC calculation in compact code with low requirement for data storage memory since it frees up MCU resources for use in the actual application.The implementation of CRC used in this application note is optimized for minimum code size and register usage.Figure 1. CRC Checking of Program Memory Using 16-bit Divisor8-bit Microcontroller Application2AVR2361143B –AVR –04/02Theory of OperationChecksums was originally used in communication through noisy channels. A number (the checksum) is computed as a function of the transmitted message. The Receiver uses the same function to compute a checksum, and compares the computed value with the value received from the transmitting side.In this application note the checksum is constructed as a function of the code, and stored in the internal EEPROM. The microcontroller can later use the same function to calculate the checksum of the code and compare it with the appended checksum. Example: Checksum calculated by summing the numbers of the code:Code:04 29 06Code with checksum:04 29 06 39This checksum is simply the sum of the numbers in the code.If the second byte in the code is corrupted from 29 to 23, the error will be detected when the original checksum is compared with the computed checksum.Original code with checksum:04 29 06 39Code with error:04 23 06 39 -> Wrong !If the first byte in the code is corrupted from 04 to 10 and the second byte is corrupted from 29 to 23, the checksum will not detect the errors.Original code with checksum:04 29 06 39Code with error:10 23 06 39-> Correct !The problem with this checksum is that it is too simple. It may not detect errors on multi-ple bytes in the code and it may not detect errors in the checksum itself.This example shows that addition is not sufficient to detect errors. CRC calculations use division instead of addition to calculate the checksum for the code. The principles are similar, but by using division multiple bit errors and burst errors will be detected.The CRC algorithm treat the Program memory as an enormous binary number, which is divided by another fixed binary number. The remainder of this division is the checksum.The microcontroller will later perform the same division and compare the remainder with the calculated checksum.Note that the division uses polynomial (modulo-2) arithmetic, which is similar to regular binary arithmetic, except it uses no carry. The addition of the numbers with polynomial arithmetic are simply XOR ’ing the data.Example: Addition in polynomial arithmetic:1011 0110+1101 00110110 0101The addition is equal to XOR ’ing the two numbers.Lets define the some properties for the polynomial arithmetic:M(x) = a k-bit number (the code to be checked). G(x)= an (n+1) bit number (the divisor or polynom).R(x)= an n-bit number such that k>n (the remainder or checksum).M(x)*2nG(x)--------------------Q(x)R(x)G(x)-----------Where Q(x) is the quotient +=3AVR2361143B –AVR –04/02Q(x) can now be described as:Which is equal to Q(x) since the divisor and the remainder are the same number, andadding it to itself is the same as XORing it, which results in zero.Example of CRC Division The hexadecimal number 6A which is the binary number 0110 1010, is divided with thedivisor 1001 (=9 hex). The checksum will be the remainder of the operation 0110 1010divided with 1001.First append W zeros to the end of the original message (where W is the width of the divisor).011010100000 / 1001 = 01100 Quotient is Ignored 0000 1101 1001 1000 1001 0011 0000 0110 0000 1100 1001 1010 1001 0110 0000 1100 10010101 = 5 = Remainder = ChecksumThe checksum is added to the end of the original code. The resulting code will be 6A5.When this code is checked, the code and the checksum is divided by the divisor. The remainder of this division is zero if no errors has occurred, non-zero otherwise.Q(x)M(x)*2n R(x)+G(x)------------------------------------- M(x)2nequals adding n zeros to the end of the code×=If M(x)*2n G(x)------------------------- is replaced in the last equation M(x)*2n +R(x)G(x)-----------------------------------Q(x)+R(x)G(x)-----------+R(x)G(x)-----------=Q(x)=4AVR2361143B –AVR –04/02Several standards are used today for CRC detection. The characteristics of the divisor vary from 8 to 32 bits, and the ability to detect errors varies with the width of the divisor used. Some commonly used CRC divisors are:CRC-16 = 1 1000 0000 0000 0101= 8005(hex)CRC-CCITT = 1 0001 0000 0010 0001= 1021 (hex)CRC-32= 1 0000 0100 1100 0001 0001 1101 1011 0111 = 04C11DB7 (hex)Observe that in 16 bits divisors, the actual numbers of bits are 17, and in a 32 bits divi-sor the number of bits are 33. The MSB is always 1.Software DescriptionMain ProgramThe main program is supplied to show operation of both the CRC generation and CRC checking. The checksum generated is stored in the internal EEPROM, and read back before the CRC checking is performed.In most applications, the checksum will be generated by a programmer and placed at the last address of the Program memory.Figure 2. Flowchart for the Main Program5AVR2361143B –AVR –04/02The main program call the sub routine CRC_gen with Status Register = 0x00 after reset to generate a new checksum for the code. The generated checksum is stored in EEPROM.To check the CRC checksum the routine CRC_gen is called with Status Register =0xFF, or any value different from 0x00.CRC Checksum GenerationThe operation is based on the principle of rotating the entire Program memory bit by bit.The MSB is shifted into the Carry Flag. If the Carry Flag is 1 (one), the word is XOR ’ed with the divisor. Note that the MSB of the Program memory which is shifted into the Carry Flag also is XOR ’ed with the MSB of the divisor. Since they are both 1, the result will always be zero and the division is ignored.At the end of the Program memory 16 zeros are appended to the code. The checksum is the resulting value of the complete XOR operation.CRC Checksum CheckingThe same principles are applied as for the generation, but the generated checksum is appended to the code, replacing the zeros. The result of the calculation including the appended checksum is zero if no errors has occurred, non-zero otherwise.If the checksum is included in the Program code, only the checking part of the computa-tion needs to be done in the Program code.The same routine is used for both CRC generation and the CRC checking. A Global Register Status is loaded with 0x00 at function call to perform CRC generation. If the Status Register is loaded with any value different from 0x00 at function call, the function performs a CRC checksum checking.The flowchart shows the flow of crc_gen routine which includes both the CRC genera-tion and CRC checking.The flowcharts in Figure 3 and Figure 4 describes the operation of the crc_gen subroutine.6AVR2361143B –AVR –04/02Figure 3. CRC_gen Subroutine7AVR2361143B –AVR –04/02Figure 4. Rotate SubroutineModificationsThe code example implements a 16-bit checksum for CRC-16 computation. The code is easily modified to support 32-bit checksum by increasing the size of the code buffer from 32 to 64 bits, and increasing the size of the divisor from 16 to 32 bits.If the checksum is generated by a programmer and placed in the last memory location,only the code for checking the checksum needs to be included in the program. The code in the “end ” section of the routine can be removed. Please see comments in the code.Some CRC-algorithms requires the data register to have an initial value different from 0x00. If other values is used, the initial values can be loaded into the registers, replacing the two first LPM instructions. See comments in code for more information.If the CRC algorithm is reflected, which means that the LSB of the bytes are shifted in first instead of the MSB, the routine can support this by replacing the LSL (Logical Shift Left) and ROL (Rotate Left) instructions with LSR (Logical Shift Right) and ROR (Rotate Right) instructions.Other implementations of CRC computation exists with higher speed, most of them use a lookup table to increase the speed of the operation. The RAM requirements for such application makes them suitable for more complex systems.8AVR2361143B –AVR –04/02ResourcesReferencesFred Halsall“Data Communication, Computer Networks and Open Systems ”1992 Addison-Wesley Publishers Ross N. Williams“The Painless Guide to Error Detection Algorithms ”ftp:///papers/crc_v3.txtTable 1. CPU and Memory UsageFunction Code Size Cycles Register Usage InterruptDescription main36 words–R2, R3, R16, R22, R23, R24, R25–Initialization and Example Program CRC_gen 44 words700.000 (approx.)R0, R1, R2, R3, R17, R18, R19, R20, R21, R22, R30, R31–Generate and Check CRC Checksum EEwrite 7 words 13 cycles R16, R23, R24, R25–Write CRC Checksum to EEPROM EERread 4 words 8 cyclesR16, R23, R24, R25–Read CRCChecksum from EEPROMTOTAL91 words––Table 2. Peripheral UsagePeripheral Description 2 Bytes EEPROM Storing CRC Value8 I/O PinsOutput Low Byte of CRC to LEDs9AVR2361143B –AVR –04/02© Atmel Corporation 2002.Atmel Corporation makes no warranty for the use of its products, other than those expressly contained in the Company ’s standard warranty which is detailed in Atmel ’s Terms and Conditions located on the Company ’s web site. The Company assumes no responsibility for any errors which may appear in this document, reserves the right to change devices or specifications detailed herein at any time without notice, and does not make any commitment to update the information contained herein. No licenses to patents or other intellectual property of Atmel are granted by the Company in connection with the sale of Atmel products, expressly or by implication. Atmel ’s products are not authorized for use as critical components in life support devices or systems.Atmel HeadquartersAtmel OperationsCorporate Headquarters2325 Orchard Parkway San Jose, CA 95131TEL 1(408) 441-0311FAX 1(408) 487-2600EuropeAtmel SarLRoute des Arsenaux 41Casa Postale 80CH-1705 Fribourg SwitzerlandTEL (41) 26-426-5555FAX (41) 26-426-5500AsiaAtmel Asia, Ltd.Room 1219Chinachem Golden Plaza 77 Mody Road Tsimhatsui East Kowloon Hong KongTEL (852) 2721-9778FAX (852) 2722-1369JapanAtmel Japan K.K.9F, Tonetsu Shinkawa Bldg.1-24-8 ShinkawaChuo-ku, Tokyo 104-0033JapanTEL (81) 3-3523-3551FAX (81) 3-3523-7581MemoryAtmel Corporate2325 Orchard Parkway San Jose, CA 95131TEL 1(408) 436-4270FAX 1(408) 436-4314MicrocontrollersAtmel Corporate2325 Orchard Parkway San Jose, CA 95131TEL 1(408) 436-4270FAX 1(408) 436-4314Atmel Nantes La Chantrerie BP 7060244306 Nantes Cedex 3, France TEL (33) 2-40-18-18-18FAX (33) 2-40-18-19-60ASIC/ASSP/Smart CardsAtmel Rousset Zone Industrielle13106 Rousset Cedex, France TEL (33) 4-42-53-60-00FAX (33) 4-42-53-60-01Atmel Colorado Springs1150 East Cheyenne Mtn. Blvd.Colorado Springs, CO 80906TEL 1(719) 576-3300FAX 1(719) 540-1759Atmel Smart Card ICsScottish Enterprise Technology Park Maxwell BuildingEast Kilbride G75 0QR, Scotland TEL (44) 1355-803-000FAX (44) 1355-242-743RF/AutomotiveAtmel Heilbronn Theresienstrasse 2Postfach 353574025 Heilbronn, Germany TEL (49) 71-31-67-0FAX (49) 71-31-67-2340Atmel Colorado Springs1150 East Cheyenne Mtn. Blvd.Colorado Springs, CO 80906TEL 1(719) 576-3300FAX 1(719) 540-1759Biometrics/Imaging/Hi-Rel MPU/High Speed Converters/RF DatacomAtmel GrenobleAvenue de Rochepleine BP 12338521 Saint-Egreve Cedex, France TEL (33) 4-76-58-30-00FAX (33) 4-76-58-34-80e-mailliterature@Web Site1143B –AVR –04/020MATMEL ® and AVR ® are the registered trademarks of Atmel.Other terms and product names may be the trademarks of others.。
crc校验基本原理CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余校验码(CRC)的基本原理在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。
对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。
根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。
通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。
CRC几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。
可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
多项式包括生成多项式G(x)和信息多项式C(x)。
如生成多项式为G(x)=x4+x3+x+1,可转换为二进制数码11011。
而发送信息位1111,可转换为数据多项式为C(x)=x3+x2+x+1。
2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。
在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:a、生成多项式的最高位和最低位必须为1。
b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
c、不同位发生错误时,应该使余数不同。
d、对余数继续做除,应使余数循环。
将这些要求反映为数学关系是比较复杂的。
但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:N K 码距d G(x)多项式 G(x)7 4 3 x3+x+110117 4 3 x3+x2+111017 3 4 x4+x3+x2+1111017 3 4 x4+x2+x+11011115 11 3 x4+x+11001115 7 5 x8+x7+x6+x4+111101000131 26 3 x5+x2+110010131 21 5 x10+x9+x8+x6+x5+x3+11110110100163 57 3 x6+x+1100001163 51 5 x12+x10+x5+x4+x2+110100001101011041 1024 x16+x15+x2+1110000000000001013 CRC码的生成步骤1、将x的最高幂次为R的生成多项式G(x)转换成对应的R+1位二进制数。
CRC校验码计算过程CRC(Cyclic Redundancy Check)校验码是一种常用的数据校验方法,它通过计算数据的校验码来检测和纠正数据传输过程中可能发生的错误。
1.待校验数据的表示方式:首先需要将待校验数据转换为二进制形式。
例如,如果待校验数据是一个ASCII字符串,就需要将每个字符转换为对应的ASCII码,然后将每个ASCII码转换为8位的二进制数。
如果待校验数据本身就是一个二进制数,则无需进行转换。
2.生成多项式的选择:选择一个合适的生成多项式,用于生成校验码。
生成多项式通常用一个二进制数表示,最高位必须为1,且低位几个1的个数越多,校验能力越强。
3.将待校验数据与一个特定的预设值(称为校验值或者初始值)相异或:校验值通常是一个全为0的数,它的位数与生成多项式的位数相同。
4.将异或后的结果和生成多项式进行除法运算:从结果的最高位开始,依次进行除法运算。
如果当前位是1,就用生成多项式异或当前位对应位置的数据;如果当前位是0,就直接进行异或运算。
重复这个运算,直到遍历完所有位。
5.获取校验码:将除法运算的结果作为校验码。
6.将校验码追加到原数据后面,形成最终的发送数据。
接收端收到数据后,需要进行校验。
校验的步骤如下:1.将接收到的原始数据和校验码分离。
2.用同样的生成多项式对原始数据进行除法运算,得到一个余数。
3.如果余数为0,则表示数据传输没有错误;如果余数不为0,则表示数据传输过程中发生了错误。
4.通过比较接收到的校验码和计算得到的余数,可以确定是否有错误发生。
如果两者相等,则数据传输没有错误;如果两者不相等,则数据传输过程中发生了错误。
需要注意的是,CRC校验码能够检测错误,但无法纠正错误。
如果发现数据传输中存在错误,需要重发数据。
CRC校验C语言实现,转载请注明出处,谢谢CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。
用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程。
结合自己的理解简单写下来。
1、CRC简介CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
接收端根据同样的规则校验,以确定传送中是否出错。
接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。
2、计算整个k+r位的CRC码,若为0,则接收正确。
CRC码有多种检验位数,8位、16位、32位等,原理相同。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(即乘以2的16次方后),除以一个多项式,最后所得到的余数就是CRC码。
求CRC码所采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。
这一点要仔细理解,是编程的基础。
CRC-16: (美国二进制同步系统中采用) G(X) = X16 + X15 + X2 + 1CRC-CCITT: (由欧洲CCITT推荐) G(X) = X16 + X12 + X5 + 1CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 12、按位计算CRC采用CRC-CCITT多项式,多项式为0x11021,C语言编程时,参与计算为0x1021,这个地方得深入思考才能体会其中的奥妙,分享一下我的思路:当按位计算CRC时,例如计算二进制序列为1001 1010 1010 1111时,将二进制序列数左移16位,即为1001 1010 1010 1111 (0000 0000 0000 0000),实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……现在开始分析运算:<1>对第一个二进制分序列求余数,竖式除法即为0x10000 ^ 0x11021运算,后面的0位保留;<2>接着对第二个二进制分序列求余数,将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余,这一步理解应该没什么问题。
CRC 校验码的计算方法CRC从原理到实现===============作者:Spark Huang(hcpp@)日期:2004/12/8摘要:CRC(Cyclic Redundancy Check)被广泛用于数据通信过程中的差错检测,具有很强的检错能力。
本文详细介绍了CRC的基本原理,并且按照解释通行的查表算法的由来的思路介绍了各种具体的实现方法。
1.差错检测数据通信中,接收端需要检测在传输过程中是否发生差错,常用的技术有奇偶校验(ParityCheck),校验和(Checksum)和CRC(Cyclic Redundancy Check)。
它们都是发送端对消息按照某种算法计算出校验码,然后将校验码和消息一起发送到接收端。
接收端对接收到的消息按照相同算法得出校验码,再与接收到的校验码比较,以判断接收到消息是否正确。
奇偶校验只需要1位校验码,其计算方法也很简单。
以奇检验为例,发送端只需要对所有消息位进行异或运算,得出的值如果是0,则校验码为1,否则为0。
接收端可以对消息进行相同计算,然后比较校验码。
也可以对消息连同校验码一起计算,若值是0则有差错,否则校验通过。
通常说奇偶校验可以检测出1位差错,实际上它可以检测出任何奇数位差错。
校验和的思想也很简单,将传输的消息当成8位(或16/32位)整数的序列,将这些整数加起来而得出校验码,该校验码也叫校验和。
校验和被用在IP协议中,按照16位整数运算,而且其MSB(Most Significant Bit)的进位被加到结果中。
显然,奇偶校验和校验和都有明显的不足。
奇偶校验不能检测出偶数位差错。
对于校验和,如果整数序列中有两个整数出错,一个增加了一定的值,另一个减小了相同的值,这种差错就检测不出来。
2.CRC算法的基本原理-------------------CRC算法的是以GF(2)(2元素伽罗瓦域)多项式算术为数学基础的,听起来很恐怖,但实际上它的主要特点和运算规则是很好理解的。
CRC校验原理及步骤标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]CRC校验原理及步骤什么是CRC校验CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。
到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。
因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。
在循环冗余校验码(CRC)的计算中有应用到模2除法。
例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。
注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
crc校验原理校验原理1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=xRm(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。
4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;采用多项式除法: 得余数为: 1010 (即校验字段为:1010)发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,CRC校验源码分析这两天做项目,需要用到 CRC 校验。
以前没搞过这东东,以为挺简单的。
结果看看别人提供的汇编源程序,居然看不懂。
花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省点时间。
先是在网上下了一堆乱七八遭的资料下来,感觉都是一个模样,全都是从 CRC 的数学原理开始,一长串的表达式看的我头晕。
crc 校验方法CRC校验方法概述CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,它通过对数据进行简单的计算,生成校验码,以验证数据在传输或存储过程中是否发生错误。
本文将详细介绍CRC校验方法的原理、计算过程以及应用。
一、CRC校验原理CRC校验方法基于多项式除法,通过对待校验数据与生成多项式进行除法运算,得到余数作为校验码。
校验码的长度通常为固定值,比如CRC-16(16位CRC校验码)或CRC-32(32位CRC校验码)。
二、CRC校验计算过程1. 选择生成多项式:根据需求选择合适的生成多项式,如CRC-16采用的生成多项式是x^16 + x^15 + x^2 + 1。
2. 准备待校验数据:将待校验数据转换成二进制形式。
3. 添加校验位:在待校验数据的末尾添加与生成多项式位数相同的0,得到扩展数据。
4. 除法运算:将扩展数据与生成多项式进行模2除法运算,得到余数。
5. 得到校验码:将余数作为校验码添加到原始数据中,形成最终的数据帧。
三、CRC校验应用1. 数据传输中的错误检测:在数据传输过程中,发送方对数据进行CRC校验并将校验码附加在数据帧中,接收方收到数据后也进行CRC 校验,通过比较计算得到的校验码与接收到的校验码是否一致,可以判断数据是否出现错误。
2. 存储介质的数据完整性验证:在磁盘、光盘等存储介质上,数据经过CRC校验后写入,读取时再进行校验,以确保数据的完整性。
3. 网络通信中的数据校验:在以太网、无线通信等网络通信中,CRC校验用于检测数据帧在传输过程中是否发生错误。
4. 文件校验:CRC校验常用于校验下载文件的完整性,通过比较计算得到的校验码与提供的校验码是否一致,可以判断文件是否被修改或损坏。
四、CRC校验的优缺点1. 优点:- 简单高效:CRC校验方法计算简单,速度快。
- 高可靠性:CRC校验能够有效检测多种错误类型,包括单比特错误和多比特错误。
CRC校验原理及步骤什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。
到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。
因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。
在循环冗余校验码(CRC)的计算中有应用到模2除法。
例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。
注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
AVR单片机CRC校验码的查表与直接生成
摘要循环冗余码校验是常用的重要校验方法之一。
高速嵌入式单片机功能强大,在无线数据传输应用方面具有很大优势。
本文基于128高速嵌入式单片机,实现32位校验码的直接生成法和查表生成法;根据实验结果,分析两种方法的特点。
关键词128校验码生成表数据段
引言
随着技术的不断进步,各种数据通信的应用越来越广泛。
由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。
为了降低错误所带来的影响,一般在通信时采用数据校验的办法,而循环冗余码校验是常用的重要校验方法之一。
高速嵌入式单片机是8位,执行大多数指令只需一个时钟周期,速度快8的运行速度约等于2019051的运行速度,32个通用寄存器直接与相连,消除了运算瓶颈;内嵌可串行下载或自我编程的和,功能繁多,具有多种运行模式。
本文采用公司的128高速嵌入式单片机,依照1999年公布的80211无线局域网协议标准,采用32位循环冗余校验码实现无线传输数据时的差错校验。
1循环冗余校验码原理
11数据传输的帧格式
根据制定的80211无线局域网络协议,在数据传输时都应按照帧传输。
这里,我们采用了信息处理系统-数据通信-高级数据链路控制规程-帧结构,它的每个帧由下列字段组成传输顺序自左至右
地址控制信息校验位
地址——数据站地址字段;
控制——控制字段。
信息——信息字段;
校验位——根据前面三个字段生成的校验位。
由地址、控制、信息三个字段组成的总的字段统称为数据段。
12校验码的理论生成方法。
CRC校验编程和硬件快速校验探讨引言循环冗余校验(Cyclic Re&mdancy Check,CRC)是最为常用的计算机和仪表数据通信的校验方法。
CRC码是一种线性分组码,编码简单但具有很强的检错纠错能力。
除了各种嵌入式仪表、变频器等设备,还有一些数字型传感器的输出数据也提供CRC码,如数字温度传感器DSl8820、集成温湿度采集芯片SHTll等。
但是,各厂商所提供的CRC校验多项式(用于同通信码模除)互有差别,且有CRC一8和CRC一16之分。
另外,规定模除余数初始值所有的位有全清0或全置1之分(其CRC硬件生成电路不同),故其模除求余的运算过程也不相同。
初接触者往往难以领晤,省略CRC校验使通信的可靠性降低。
而不少C语言程序,运算时需要使用较多的RAM单元,较难在80C51、PIC16等低档单片机上运行。
因此,对于嵌入式系统中的CRC校验,事先根据特定的校验多项式,算出1字节数据范围所对应的256个余数,将其作为表格,编程写到程序存储器中查询而避免在线运算,已是非常通用的做法。
鉴于此,有些厂商在说明书中就直接给出了这个列表。
但如果是CRC一16校验,存储表格要占512字节(CRC一32则需要1 KB),对于有限的单片机ROM资源来说所占比例不小,往往只因为多装了此表,就不得不升级单片机的型号。
本文分析和解释了实际CRC校验码的生成特点,据此给出节省RAM和ROM且运算快速的通用CRC校验编程思想和程序结构,并探讨了用少量硬件实现快速、可靠CRC校验的方法。
1 CRC原理和实际校验码的反序生成特点一个k位二进制数据在传送时,按一定规律附加一些冗余位而增大其码距,就能检错和纠错。
标准CRC码是将原数据左移r位,再用r+1位的特别约定多项式(poly—nomial funetion)模除之,获得最多为r(8、16、32)位的余数,跟随原数据之后生成k+r位的编码发送。
CRC校验码软件生成技术原理分析
罗长洲;马梦宇;李萌;李泽超
【期刊名称】《计算机仿真》
【年(卷),期】2024(41)3
【摘要】循环冗余校验(Cyclic Redundancy Check,CRC)具有检错能力强,运算简单,易于直接用硬件数字电路实现的特点。
在完善CRC校验码生成原理模型的基础上,研究了信息系统传输带CRC校验码数据包的一般过程,提出了三种计算数据包CRC校验码的技术方法,在ADI公司DSP软件集成开发仿真测试环境中,设计了一组嵌入式程序,生成了符合ITU组织CRC16 ITU-T V.41标准的CRC校验码码表,分析并总结了CRC校验码码表元素的工程含义和应用方法,研究了两种计算数据包CRC校验码工程实现方法的技术特点,并验证了它们的正确性、一致性和有效性。
【总页数】5页(P158-161)
【作者】罗长洲;马梦宇;李萌;李泽超
【作者单位】北京控制与电子技术研究所;中国航天科工集团二院研究生院
【正文语种】中文
【中图分类】TP391
【相关文献】
1.CDT规约中CRC校验码的生成方法
2.并行CRC-32校验码生成算法研究及其实现
3.8位CRC校验码表格生成及高速校验子程序
4.AVR单片机CRC校验码的查表与直接生成
5.数据字段伪CRC校验码生成技术
因版权原因,仅展示原文概要,查看原文内容请购买。
精选AVR应用笔记
A VR236: 程序空间的CRC校验
翻译:邵子扬 2006年6月2日
shaoziyang@
特点
●程序空间 CRC 的产生和校验
●支持所有带有LPM指令的 AVR 单片机
●紧凑代码,仅 44 字(CRC 产生和 CRC 校验)
●无需 RAM
●校验值存放在 EEPROM
●执行时间:90 ms (AT90S8515 在 8MHz)
●16 位方式,容易修改为 32 位
●支持标准 CRC-16,容易修改成 CRC-CCITT, CRC-32
介绍
这篇应用笔记说明了 CRC(循环冗余校验)理论和应用 CRC 来检测 AVR 单片机的 Flash 程序空间的错误。
CRC 广泛应用于在有噪声的环境下检测传送的消息中的错误。
单片机的新加密标准将 CRC 作为检测单片机程序空间错误的方法。
使用紧凑的代码和很少的数据存储空间计算来 CRC 可以给用户的具体应用以更多的资源。
这篇应用笔记中使用的 CRC 为最小的代码大小和寄存器使用而优化。
图1. 使用16位 CRC 校验程序空间
操作理论
校验最初用于噪声环境下的通信。
通过一个函数计算出传递的数字(校验),接收方使用同样的函数计算校验,并和发送方计算出的校验相比较。
在这篇应用笔记中,校验看作函数代码,并存放在内部的 EEPROM 中。
单片机可以使用同样的函数计算代码的校验,并和它进行比较。
例如使用同样的累加计算校验:
代码: 04 29 06
代码和校验: 04 29 06 39
这个校验只是简单累加,如果第二个字节由 29 错误变为 23,那么就可以由两次校验的不同检测出发生了错误。
原始带有校验的代码: 04 29 06 39
带有错误的代码: 04 23 06 39 -> 错误 !
如果第一个字节从 04 变为 10,同时第二个字节从 29 变为 23,那么上面的校验就检测不出错误了。
原始带有校验的代码: 04 29 06 39
带有错误的代码: 10 23 06 39 -> 正确 !
这是因为这个校验太简单了,不能检测出多个字节变化引起的错误,也不能检测出校验自己的错误。
这个例子显示了加法不适合做错误检测。
CRC 计算使用了除法代替加法来计算校验。
原理是类似的,但是使用 but by using division multiple bit errors and burst errors will be detected.
CRC 算法将程序空间看作巨大的二进制数,由另外一个固定的二进制数作除数。
余数就是校验。
单片机执行同样的除法并比较余数。
注意除法使用了多项式(modulo-2)算法,类似标准的二进制算法,除了没有进位外。
多项式算法的加法其实就是简单的对数据进行异或。
例子:多项式算法加法
1011 0110
+ 1101 0011
0110 0101
加法等于两个数之间的异或。
让我们定义一些多项式算法的:
M(x) = k 的位数字(要校验的数).
G(x) = (n+1) 的位数字(除数或多项式).
R(x) = n 位的数字,k > n (余数或校验).
这里Q(x)是商。
Q(x) 可以描述为:
而等于添加n个0到末尾。
如果
替代方程式,那么
等于 Q(x) 是因为除数和商都是相同的数字,和自己相加和异或是相同的,结果都是0。
CRC除法的例子
16进制数 6A 等于二进制 0110 1010,被 1001 (=9 hex)除。
校验就是余数等于 0110 1010 除以 1001。
首先添加 W 个 0 到末尾(W 是除数的位数)。
011010100000 / 1001 = 01100 商被忽略
0000
1101
1001
1000
1001
0011
0000
0110
0000
1100
1001
1010
1001
0110
0000
1100
1001
0101 = 5 = 余数 = 校验
校验添加到原始代码的结尾,结果就是 6A5。
当这个代码被校验过,代码和校验做除法。
如果没有发生错误,那么余数是0,否则是非0的数。
今天有许多标准用于CRC检测,除数一般在 8 位到 32 位,错误的检测能力和除数的大小有关。
一些常用的 CRC 除数是:
CRC-16 = 1 1000 0000 0000 0101= 8005(hex)
CRC-CCITT = 1 0001 0000 0010 0001= 1021 (hex)
CRC-32 = 1 0000 0100 1100 0001 0001 1101 1011 0111 = 04C11DB7 (hex)
16 位除数的实际位数是 17,而 32 位除数的实际位数是 33。
因为最高位总是 1。
软件说明
主程序
主程序显示了计算 CRC 和 CRC 校验。
产生的校验存放在内部的 EEPROM 中,在执行 CRC 校验时读取出来。
在大多数应用中,校验由编程器产生并放在程序空间的最后。
图2. 主程序流程
主程序在复位后以状态寄存器 = 0x00 调用子程序 CRC_gen,产生新的校验值,并存放到EEPROM 中。
检查校验是以状态寄存器 = 0xFF 来调用子程序 CRC_gen,或者任意非 0 的参数。
产生CRC校验
基于将整个程序空间按照位循环移动的原理,最高位移动到 Carry 标志。
如果 Carry 标志是 1,就和除数进行异或。
注意程序空间的最高位也和除数的最高位进行异或。
因为它们都是1,所以异或的结果总是0。
在程序空间的最后添加了16个0到代码中,校验是完成异或操作后的结果。
检查CRC校验
同产生CRC校验的原理一样,但是用产生的校验替代0添加到代码后面。
包括添加的0的计算的结果如果是0就说明没有错误,否则就是有错误。
如果校验包括在程序代码中,那么只有校验部分的计算需要在程序中完成。
同样的程序用于 CRC 的产生和 CRC 的检查。
一个全局状态寄存器表示参数,如果以参数0调用就是产生 CRC,否则就是检查 CRC 校验。
图3 和图4 说明了 crc_gen 子程序。
图3. CRC_gen 子程序
图4. 循环子程序
修改
例子代码执行 CRC-16 的 16 位校验计算。
代码很容易修改成支持 32 位校验:增加代码缓存从 32 位到 64 位,增加除数的位数到 32 位。
如果校验由编程器产生,并放在空间的最后,只有检查校验的代码需要包括到程序中,可以删除“end”小节中的代码。
请查看代码的注释。
一些 CRC 算法需要数据寄存器有一个非0的初值。
如果使用了其他数值,初始值可以载入寄存器中,替代起始的两个 LPM 指令。
请查看代码的注释。
如果 CRC 算法是反射型的,就是移动最低位而不是最高位,用 LSR(逻辑右移)和 ROR(循环右移)指令替换程序中的 LSL(逻辑左移)和 ROL(循环左移)指令。
CRC 计算的其他部分速度很快,大部分都使用了查表来加快速度。
这种应用对RAM的需求使其可以适合更复杂的系统。
Resources
表1 CPU和空间使用
参考
Fred Halsall
“Data Communication, Computer Networks and Open Systems”1992 Addison-Wesley Publishers
Ross N. Williams
“The Painless Guide to Error Detection Algorithms”
ftp:///papers/crc_v3.txt。