新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > CRC校验编程和硬件快速校验探讨

CRC校验编程和硬件快速校验探讨

作者:时间:2011-04-14来源:网络收藏

引 言
循环冗余(Cyclic Remdancy Check,)是最为常用的计算机和仪表数据通信的方法。码是一种线性分组码,编码简单但具有很强的检错纠错能力。除了各种嵌入式仪表、变频器等设备,还有一些数字型传感器的输出数据也提供码,如数字温度传感器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校验的方法。

本文引用地址:http://www.amcfsurvey.com/article/156401.htm


1 CRC原理和实际校验码的反序生成特点
一个k位二进制数据在传送时,按一定规律附加一些冗余位而增大其码距,就能检错和纠错。标准CRC码是将原数据左移r位,再用r+1位的特别约定多项式(poly—nomial funetion)模除之,获得最多为r(8、16、32)位的余数,跟随原数据之后生成k+r位的编码发送。接收方再用相同的约定多项式,模除收到的数据,余数为O则传输无误,为其他值则对应各个位的出错。
但是对于实际应用,为加快通信速度,r位的余数并不是每次都传输,而是采用累计模加(异或)的方法,不断地与下一个k位数据异或运算,组成新的中间余数(仍为r位,因一般选择r≥k),再被约定多项式模除得到新的余数值,依此类推,直到所有通信数据都同中间余数异或,再模除完为止。如此得到最终的r位余数,作为全组数据校验的CRC码附在该组数据之后发送。接收方以同样的过程,算得收到数组的最终余数,再同最后收到的CRC码对比(或将CRC码也作为数据,看最后余数是否为O)。当然这样只能查出该组数据的传输是否有错,而不能纠错。
首数据的余数是唯一的,再异或进后续的任何一个特定数据之后,结果依然唯一。所以只要选择r有足够的位数,就能保证多个数据中一旦有个别位传输错误,其最终的CRC余数与传输正确的余数相等的可能性极低,因此能查出传输错误。
对于元器件和不少的设备来说,其最终余数,即组校验的CRC码,是靠生成的。为了使硬件电路简化,也为了接收方易于校验,往往采用变形生成的CRC码和与其对应的校验处理方式。
对于模除余数的初始值,ISO/IEC 13239标准规定各位(8、16、32)均置1,而DSl8820器件和一些控制仪表的通信CRC码却是清0。在软件编程时要根据不同器件赋予不同的初始值。
特别约定多项式g(x)都是r+1位的,如ISO/IEC13239标准的CRC一8,g(x)=x8+x2+x+1。其最高位恒为1,将其隐含则可简化模除运算,但这样一来后面多位是O,较难在多字节(如16位需2字节)CRC校验中定位计算和存储。因此,大多数CRC码生成和校验的处理都采用将约定多项式反序的方法,即将最低位1放到最高位并丢弃最高次幂系数1,从而将运算和存储都降为r位。
对于CRC一8,g(x)=x8+x2+x+1,去高位反序后的模除数为11100000(OEOH),r=8。
对于CRC一16,g(x)=x16+x15+x2+1,去高位反序后的模除数为OA001H,r=16。
对于CRC一CCITT,g(x)=x16+x12+x5+1,同样处理后的模除数为8408H,但也常用正序值1021H。
对于CRC一32,g(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1,处理后的模除数为0EDB88320H,r=32。
如上处理后,按理说被模除数和余数也应该反序。但这样的话r位的余数在同下一个k位数据模加时不但k位数据应反序,而且必须左端(最高位)对齐进行异或,处理起来不但麻烦也容易出错。因此,实际CRC码的生成和校验一般仍是将余数,即被(模)除数,按正序排列,新数据也仍是右对齐异或进余数中。但是将被模除数原先的左移r位右添0改成了右移r位左添(r个)O。这相当于k+r位被模除数中仅r位被反序(放左端),而前面k位(现放于右端)依然正序。可以看出,按反序原则,实际上每一次都是异或进通信数据的反序值,如11001000B(0C8H)变为000100ll(13H),再异或进被模除数来求取CRC校验码。但由于所有二进制数的反序值都是唯一对应的,所以并不影响生成CRC码的唯一确定性,只是接收方需要按照同样的反序规则处理.

c语言相关文章:c语言教程


分频器相关文章:分频器原理

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭