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

发布者:纯真年代最新更新时间:2015-04-15 来源: eechina关键字:CRC  校验编程  硬件快速校验 手机看文章 扫描二维码
随时随地手机看文章
引言

循环冗余校验(Cyclic Redundancy Check,CRC)是最为常用的计算机和仪表数据通信的校验方法。CRC码是一种线性分组码,编码简单但具有很强的检错纠错能力。除了各种嵌入式仪表、变频器等设备,还有一些数字型传感器的输出数据也提供CRC码,如数字温度传感器DS18B20、集成温湿度采集芯片SHT11等。但是,各厂商所提供的CRC校验多项式(用于同通信码模除)互有差别,且有CRC8和CRC16之分。另外,规定模除余数初始值所有的位有全清0或全置1之分(其CRC硬件生成电路不同),故其模除求余的运算过程也不相同。初接触者往往难以领晤,省略CRC校验使通信的可靠性降低。而不少C语言程序,运算时需要使用较多的RAM单元,较难在80C51、PIC16等低档单片机上运行。

因此,对于嵌入式系统中的CRC校验,事先根据特定的校验多项式,算出1字节数据范围所对应的256个余数,将其作为表格,编程写到程序存储器中查询而避免在线运算,已是非常通用的做法。鉴于此,有些厂商在说明书中就直接给出了这个列表。但如果是CRC16校验,存储表格要占512字节(CRC32则需要1 KB),对于有限的单片机ROM资源来说所占比例不小,往往只因为多装了此表,就不得不升级单片机的型号。

本文分析和解释了实际CRC校验码的生成特点,据此给出节省RAM和ROM且运算快速的通用CRC校验编程思想和程序结构,并探讨了用少量硬件实现快速、可靠CRC校验的方法。

1 CRC原理和实际校验码的反序生成特点机台

一个k位二进制数据在传送时,按一定规律附加一些冗余位而增大其码距,就能检错和纠错。标准CRC码是将原数据左移r位,再用r+1位的特别约定多项式 (polynomial function) 模除之,获得最多为r(8、16、32)位的余数,跟随原数据之后生成k+r位的编码发送。接收方再用相同的约定多项式,模除收到的数据,余数为0则传输无误,为其他值则对应各个位的出错。.

但是对于实际应用,为加快通信速度,r位的余数并不是每次都传输,而是采用累计模加(异 或)的方法,不断地与下一个k位数据异或运算,组成新的中间余数(仍为r位,因一般选择r≥k),再被约定多项式模除得到新的余数值,依此类推,直到所有通信数据都同中间余数异或,再模除完为止。如此得到最终的r位余数,作为全组数据校验的CRC码附在该组数据之后发送。接收方以同样的过程,算得收到数组的最终余数,再同最后收到的CRC码对比(或将CRC码也作为数据,看最后余数是否为0)。当然这样只能查出该组数据的传输是否有错,而不能纠错。

首数据的余数是唯一的,再异或进后续的任何一个特定数据之后,结果依然唯一。所以只要选择r有足够的位数,就能保证多个数据中一旦有个别位传输错误,其最终的CRC余数与传.输正确的余数相等的可能性极低,因此能查出传输错误。

对于元器件和不少的设备来说,其最终余数,即组校验的CRC码,是靠硬件快速生成的。为了使硬件电路简化,也为了接收方易于校验编程,往往采用变形生成的CRC码和与其对应的校验处理方式。

对于模除余数的初始值,ISO/IEC 13239标准规定各位(8、16、32)均置1,而DS18B20器件和一些控制仪表的通信CRC码却是清0。在软件编程时要根据不同器件赋予不同的初始值。

特别约定多项式g(x)都是r+1位的,如ISO/IEC 13239标准的CRC8,g(x)=x8+x2+x+1。其最高位恒为1,将其隐含则可简化模除运算,但这样一来后面多位是0,较难在多字节(如 16位需2字节)CRC校验中定位计算和存储。因此,大多数CRC码生成和校验的处理都采用将约定多项式反序的方法,即将最低位1放到最高位并丢弃最高次幂系数1,从而将运算和存储都降为r位。

对于CRC8,g(x)=x8+x2+x+1,去高位反序后的模除.数为 11100000(0E0H),r=8。.
对于CRC16,g(x)=x16+x15+x2+1,去高位反序后的模除数为 0A001H,r=16。 
对于CRCCCITT,g(x)=x16+x12+x5+1,同样处理后的模除数为8408H,但也常用正序值1021H。.
对于 CRC32,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个)0。这相当于k+r位被模除数中仅r位被反序(放左端),而前面k位(现放.于右端)依然正序。可以看出,按反序原则,实际上每一次都是异或进通信数据的反序值,如 11001000B(0C8H)变为00010011(13H),再异或进被模除数来求取CRC校验码。但由于所有二进制数的反序值都是唯一对应的,所以并不影响生成CRC码的唯一确定性,只是接收方需要按照同样的反序规则处理。

2 嵌入式系统CRC校验的编程

如上所述,k+r位的被模除数采用右移的方法不断地同反序的约定多项式对位模除,也就遵从了从高位向低位不断减余的除法规则。但由于不必求模除的商,因此只要将被模除数不断地右移位,与去掉最高位的反序约定多项式模减,求得余数即可。 

但如果被模除数最低位右端的移出位是0,则无论从左端添进多少个0,也不够模除约定多项式(其隐含的最高位是1)。在此情况下该位的商是0,余数不变,不应再同约定多项式对位模减,而要继续左添0右移位,直到当前余数(被模除数)右移出的位值为1才够模除(商1),才可将余数再对位模减一次多项式。由此看出,将约定多项式去掉最高位,可以使模减(异或)的计算位数r减少(一般r都正好是1字节位数的整数倍)。

由于被模除数是k+r位的,因此.总共需要右移k位,即左添进k个0,才能模除到最低位结束。得到的余数最多是r位(约定多项式为r+1位),再将它异或入一个新数据,作为新的被模除数。 

每异或进一个数据,求新一轮CRC码,都只进行k(字节数据k=8)次的右移和一般都少于k次的模减(异或)运算,而且模减的中间差值无需保留(后值覆盖前值)。因此CRC码生成的运算过程,就是右移位、判断移出位为1则同多项式模减(C语言不能对移出位检测,需将余数备份后同0x01相 “与”)、差值回存后再右移的k次循环过程,如图1所示。之后,再异或进下一个数据(该步与查表法一致)。编程得当的话运算量很小。.

1.gif 

笔者用51汇编语言编写CRC8校验程序,算得1字节数据的CRC码,只需64~80个机器周期,只多用1字节RAM单元(CRC16校验多用2字节,时间加倍)来存储余数,即下一次的被模除数(不断覆盖上一次已无用的)。因此,完全可以直接运算,而不必存储大量的数据表格。C语言编程,要考虑语句代码的优化以及只定义使用int和char型局部变量,以免耗时和占用R.AM单元太多。[page]

接收方对于最后收到的r位CRC校验码,.不需要再纳入模除而使最终余数为0,只需同信息数据的模除余数比较,相等则确定通信正确。这样可以减少模除循环次数,节省时间。 

3 硬件CRC校验的探讨

器件或设备的说明书中,常给出其硬件CRC码的生成电路。以总线数字温度传感器DS18B20为例,其8位CRC码生成电路如图2所示。.

对应该硬件电路,等效的模除多项式为: 

0.gif 

该模除多项式反序后,再隐含最高位,其多项式的值为8CH。

8位移位寄存器的初始值清0(00H),通信数组数据的每个字节低位在前,按位依次输入,当数据全部输入完成后,移位寄存器各个位的存储(输出)值就是所需的CRC校验码。 

在实际应用中发现,Autonics等品牌的控制仪表,其通信CRC校验码与DS18B20的完全相同。

2.gif 

对应于图2的硬件生成电路,可用1片8D触发器(如74HC373)和1片4封装异或门(如74HC136)连接而成,如图3所示。

3.gif 

对于CRC赋初值00H(74HC373清0)的操作,可先读出D0~D7的随机值,然后将读出的数据再串行输入即可。因为相同的数据相异或总是为0,再除以任何多项式仍为0。

若MCU剩余足够的I/O口,可将CRC码的D0~D7位并行读入。否则,还需加一片74HC165,将D0~D7转换成串行数据读入。

以少量的硬件实现快速CRC,能节省单片机的运算时间和存储资源。用于发送端,能够快速获得CRC校验码,在系统其他任务很重时,能增强实时性。而用于接收端,除了上述优点之外,还能显著增强系统接收和确认信息的可靠性,适用于一些远程控制的执行装置(如变频驱动器、阀门定位控制器、重要的监测报警装置等)。这些装置对于接收到的数据或命令信息,一旦因误校验而不能正确地判断执行,其后果都是比较严重的。因此,要提高嵌入式系统的可靠性和实时性,硬件 CRC校验是一种选择。

结语

本文在分析了常用CRC码的反序生成原理的基础上,给出了其编程运算的统一步骤,并提出了由硬件快速生成CRC码或对接.收数据进行CRC校验的电路和方法,可为嵌入式系统的可靠性和实时性设计提供参考。

参考文献

   1. 王新梅 肖国镇 纠错码--原理与方法 2001
   2. 罗伟雄 韩力 原东昌 通信原理与电路 1999
   3. 李安福 符合ISO/IEC标准的快速CRC运算 [期刊论文] -单片机与嵌入式系统应用2008(10)
   4. Williams Ross A Painless Guide to CRC Error Detection Algorithms 2008
关键字:CRC  校验编程  硬件快速校验 引用地址:CRC校验编程和硬件快速校验探讨

上一篇:低功耗MCU优化电池供电系统设计
下一篇:MSP430省电方式的两种唤醒方法

推荐阅读最新更新时间:2024-03-16 13:58

STM32学习基本 存储器、CRC、电源
1、STM32命名规则? 例子:STM32 F 103 C 8 T 6 A xxx 其中: (1) 产品系列 STM32:基于ARM核心的32位微控制器; (2)产品类型: F:通用型 (3)产品子系列: 101:基本型;102:USB基本型,USB2.0全速设备;103:增强型;105/107:互联型。 (4)引脚数目: T:36脚;C:48脚;R:64脚;V:100脚;z:144脚。 (5)闪存存储器容量: 4:16k;6:32k;8:64k;B:128k;C:256k;D:384k;E:512K。 (6)封装: H:BGA;T:LQFP;U:VFQFPN;Y:WLCSP64; (7)温度范围: 6:工业级:-4:0-85;7
[单片机]
在小尺寸DSP上实现2D条形码解码
  条形码一般被用于将关键的字母数字信息转换为数字系统能够扫描和读取的符号信息,而无需每次都要将信息录入数字系统。   1D(一维)条形码只能对数字数据进行编码,在过去二十年中主要用于产品运输和追踪、系统安全、超市等场合。使用2D(二维)条形码,数据在水平和垂直方向被编码为2D符号,如下图1所示。 图1:2D条形码示例。   2D符号所能包含的数据量远大于1D符号。2D条形码解决方案可比传统1D条形码提供更大的信息密度,特别是对于那些需要对精密信息而不是简单的码信息进行编码的应用。   2D条形码技术的一些应用包括产品标签、产品信息追踪和检验、移动安全、出入境检查服务、医疗保健和电子商务等。   如今存在很多2D条形
[嵌入式]
在小尺寸DSP上实现2D条形码解码
AVR单片机CRC校验码的查表与直接生成
摘要:循环冗余码校验CRC是常用的重要校验方法之一。AVR高速嵌入式单片机功能强大,在无线数据传输应用方面具有很大优势。本文基于Atmega128高速嵌入式单片机,实现32位CRC校验码的直接生成法和查表生成法;根据实验结果,分析两种方法的特点。 关键词:Atmega128 CRC校验码 CRC生成表 数据段 引 言   随着技术的不断进步,各种数据通信的应用越来越广泛。由于传输距离、现场状况、干扰等诸多因素的影响,设备之间的通信数据常会发生一些无法预测的错误。为了降低错误所带来的影响,一般在通信时采用数据校验的办法,而循环冗余码校验是常用的重要校验方法之一。   AVR高速嵌入式单片机是8位RISC MCU,执行大多数指
[单片机]
[单片机] crc16算法
什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。奇偶校验虽然简单,但是漏检率太高,而CRC则要低的多,所以大多数都是使用CRC来校验。CRC也称为多项式码。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,进而可以保证在软件层次上数据传输的正确性和完整性。 #include crc16.h /** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 +
[单片机]
CRC位域多表查表方法
CRC算法的实现一般可分运算和查表两种,前者靠对某CRC多项式的移位和异或得到, 占用程序空间小但速度慢。后者是将前者的运算结果值排列为一个CRC矩阵表格,占用程 序空间大但速度快。 CRC查表方法经典的有两种,由于表格空间的不同,对于CRC8采用全表查询,CRC16以上 采用小表(一般为256个元素的数组)查询。 CRC查表由于CRCN(N=4,8,12,16,20,24,32,48,64,128,...)的不同占用的表格空间差异 很大。每种CRC的多项式对应一张CRC表,例CRC4左右移位各有16个CRC4表。CRC8左右移位 各有256个CRC8表。1个CRC8表占用256个字节,可组成16*16的数组,而
[单片机]
STM32 CRC寄存器
1、CRC计算公式 所有的STM32芯片都内置了一个硬件的CRC计算模块,可应用到通信程序中,这个CRC计算模块使用常见的、在以太网中使用的计算多项式: X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1 写成16进制就是:0x04C11DB7 2、使用这个内置CRC模块操作步骤: 复位CRC模块(设置CRC_CR=0x01),这个操作把CRC计算的余数初始化为0xFFFFFFFF 把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入CRC_DR寄存器(既下图中的绿色框) 写完所有的数据字后
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved