历史上的今天
返回首页

历史上的今天

今天是:2025年03月05日(星期三)

正在发生

2018年03月05日 | CRC校验码在单片机中的程序实现的求取

2018-03-05 来源:eefocus

由单片机嵌入式系统与微机组成的工业检测和数据采集系统中,计算机与单片机之间经常需要进行数据通信。在数字通信过程中,干扰有可能使接收到的二进制数和发送的不一致,造成“0”和“1”互变的差错。一个实用的通信系统必需能发现这种差错,并加以纠正或给出重新发送信息。CRC(CyclICRedundancy Code循环冗余码),也称多项式编码。是一种检错效率高、原理简单、易于实现的通信编码,是目前在数字通信领域应用最为广泛的一种检验方式。如16位的 CRC—CCITT标准可以检测出所有的单位错、双位错、奇位数错及小于等于16位的突发错,大于17位的突发错检错率为99.9984%[1]。可见, CRC码的检错率要大大高于一般的奇偶校验。因此CRC校验可以应用于重要数据的通信场合,如下位机运行状态的检测、运行模式或参数的在线重设置等。

对于8位的单片机系统,要实现CRC通信就必须编写生成CRC码的指令程序,且由于单片机的程序存储器很少、运算速度也比较低,因此要求程序代 码尽量少,算法必须简单。下面将以CRC—CCITT标准为例来介绍CRC通信码的单片机实现过程。

1 CRC校验码的构成 

4.jpg?imageView2/2/w/550
  
求得余式R(x),使等式左端的代数式恰为CRC校验式G(x)的整数倍。则将其与待发送的数据多项式xr·M(x)相加得到的r+k次多项式的各个系数(mk-1,mk-2,…,m1,m0,rr-1,rr-2,…,r1,r0)作为编码一起发送,其中高k位是信息位,低r位是附加校验位。在数据接收端,再对接收到的信息码进行校验,如能被同 一个G(x)整除,则表明通信正确;若余数不为0,表示数据传输有误,从而达到检错的目的。

5.jpg?imageView2/2/w/550

CRC校验虽然不能100%检测出错误,但它的漏检率相当低。漏检概率和所选取的校验标准相关,国际上已有多种CRC校验式标准。其中8位的CRC码标准有CDT约定,其校验式为G(x)=x8+x2+x+1;16位的标准有CCITT(国际电报电话咨询委员会推荐)标准G(x)=x16+x12+x5+1,和IBM公司提出的CRC-16标准G(x)=x16+x12+x2+1;校验错误效率最高的是具有32位CRC校验码的

6.jpg?imageView2/2/w/550

2 多字节信息序列CRC码的快速算法 

假设需要传送的一组信息码N为k个字节二进制序列:
  Nk=[n1 n2……nk]

其中的ni为信息码中的各个字节。

以16位校验码的CRC—CCITT标准来说明生成校验冗余码的快速算法。N(x)在计算冗余码的时候应该在后面补充两个零字节,作为待计算的信息码。为方便起见,还统一用N(x)表示。

对应的前k-1个字节构成的序列可以表示为:

7.jpg?imageView2/2/w/550

关系,若已知算式Nk-1的余项Rk-1,就可以求得Nk的余项Rk,已知Rk-2,就可求得Rk-1,依次类推。因为校验式G(x)的最高项为16次,x8 Rk-1(x)+nk(x)的最高幂次不超过23,所以最后可归结为求[n1 n2 n3]3字节序列余项的问题,每次递推都进行3字节的求余运算。按照上述的方法,很容易编制单片机上CRC校验码的实现程序。

3 CRC校验码在51单片机上的实现 

以CRC-CCITT标准为例,按前面多字节数据CRC冗余码的构造过程,51系列单片机计算多字节数据的CRC码程序如下。其中,从31H开始存放信息字节数据,算得校验码的高8位存于R3,低8位存于R4。

8.jpg?imageView2/2/w/550

9.jpg?imageView2/2/w/550

4 CRC码的查表方法

上面的程序中,每次计算一组3字节的CRC余项需要进行8次循环操作,每次循环包括2字节的数据移动,和3次异或操作。对于时间要求严格的 数据采样场合,速度可能跟不上。这时可以把对1字节通信数据的所有取值(共256个)求得CRC码做成一个余项表,用查表的方法来代替余项的循环求取过程。

设一普通3字节码为Tabc=[a b c],把它分解为一特殊的后2字节为零的3字节序列Ta00=[a 00],和一个2字节序列Tbc=[b c],可以由多项式表

10.jpg?imageView2/2/w/550

其中Qa00为整数的商式,Ra00和Tbc都是最高次不超过15的余项,它们的和就是Tabc(x)的余项。每次取信息码的3字节序列Tabc,先查表得出其中Ta00(x)的余项Ra00(x),这是一个2字节的多项式,把它和余下的2字节序列Tbc进行异或操作,得到新的3字节序列的高2字节,然后取信息码的下一字节附于其后构成新的3字节序列再分解为Ta00和,循环查表计算。运用这种方法可以很快求出多字节信息码Mk的CRC冗余校验码。

建立16位CRC的检验码表共需要2×256个字节。对于80C51系列的单片机来说,程序存储器ROM一般都有4KB以上的空间,容量上可以满足要求。

下面给出CRC校验码表的求取程序:

11.jpg?imageView2/2/w/550

12.jpg?imageView2/2/w/550

每种校验规则校验码的最高位都为1,为编程方便,将其最高位去掉,把校验码的位数凑成是一个字节的整数倍。CRC—CCITT的校验式为G(x)=x16+x12+x5+1,去掉高位后,校验码为0001000000100001(1021H)。取一个用来比较的16位数CRC—BYTE=8000H,逐次比较信息码的最高位是否为1,是则将1记录在暂存单元CRC—Temp的最低位,如果是0,则低位左移入0,每次暂存单元和信息单元循环左移,相当于把信息字节的数据逐位从左移入暂存单元中。当暂存单元的最高位变为1,说明已移入了16位数据,然后把暂存单元再左移一次,和16位校验码做异或操作,也就相当于进行模2除。因为暂存单元被移出的最高位1和校验码被舍去的最高位1异或,其结果必然为零,也就等于进行了17位异或操作。把所得的余式存放在暂存单元中,接着循环,直到将信息码和补充在尾部的零字节都操作结束,把最后的余式复给CRC—Variable输出,完成对一个余项式的处理。

这种方法的好处是很容易实现对8位或者32位的校验式求取余项表进行扩展,只需将CRC—MODEL改为8位或32位的校验式模型,比较字节CRC— BYTE改为80H和800000H,追加末尾0字节LAST—BYTE改为1和4个,然后再把对应于16位数据变量CRC—Variable的 unsigned short型,改为un-signed char或unsigned long就可以了。

13.jpg?imageView2/2/w/550

5 结束语

利用CRC实现程序可以计算出各种标准下的CRC校验冗余码表。在单片机容量允许的情况下,可以利用查表进行CRC校验。在对时间要求不高、对存储容量要求严格的场合,可以直接利用循环计算来求得余项。编程使用8051系列单片机汇编语言,可以实现最少和高效的指令代码。该程序算法也可应用于 M68HC和PIC17等系列单片机上。

参考文献
[1]Joe Campbell著.徐国定,廖卫东译.串行通讯C程序员指南[M].北京:清华大学出版社.1990.
[2]韩炬.CRC算法实现[J].煤炭科学技术,2000,(2):11-15.


推荐阅读

史海拾趣

Ecera Comtek Corp公司的发展小趣事

在快速发展的过程中,Ecera Comtek Corp公司始终关注企业社会责任的践行。公司积极参与各种公益活动,为社会做出积极贡献。例如,在自然灾害发生时,Ecera Comtek Corp公司积极捐赠通信设备,帮助灾区恢复通信联系;在偏远地区,公司还捐建了多所希望小学,为当地的孩子们提供了良好的学习环境。这些公益活动不仅提升了Ecera Comtek Corp公司的品牌形象,也增强了员工的凝聚力和归属感。

Dowosemi公司的发展小趣事

Dowosemi公司一直将产品质量视为企业的生命线。他们建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都进行严格的把控。此外,公司还定期对员工进行质量培训,确保每一位员工都能深刻理解并贯彻执行质量标准。这种对质量的坚持让Dowosemi公司的产品在市场上赢得了良好的口碑。

意华(CZT)公司的发展小趣事

为了进一步扩大规模和提升竞争力,意华先后成立了多家子公司,包括苏州意华电工有限公司、东莞意兆电子科技有限公司等。这些子公司的成立,不仅实现了公司在不同地域的资源整合和优势互补,也加速了公司的集团化发展进程。通过集团化管理,意华能够更好地协调各子公司之间的业务和资源,提高整体运营效率。

客益(Guestgood)公司的发展小趣事

为了提高产品质量,意华先后通过了ISO9001、ISO14001、IECQC080000等多项国际质量管理体系认证。这些认证不仅证明了公司的质量管理水平,也为客户提供了更可靠的产品保障。通过持续的质量改进和过程控制,意华的产品质量得到了显著提升,赢得了更多客户的认可。

Cambridge Electronic Industries Ltd公司的发展小趣事

Cambridge Electronic Industries Ltd(简称CEI)的创立,标志着剑桥地区电子工业的一次重要飞跃。在20世纪中期,随着电子技术的快速发展,CEI的创始人看到了其中的商机,并决定成立一家专注于电子设备和系统研发制造的公司。起初,CEI主要面向当地的小型企业和研究机构,提供定制化的电子解决方案。凭借创始人的技术背景和团队的辛勤努力,CEI逐渐在剑桥地区的电子市场中建立了良好的声誉。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

问答坊 | AI 解惑

PCI总线的任意波形发生器的设计

摘要:任意波形发生器是信号处理领域中必不可少的仪器设备,而很多任意波形发生器不能产生快速、有效、连续而且易于定制的信号波形。本文提出了一种利用缓冲区快速交换数据、基于PCI总线的任意波形发生器的设计构想,依据该构想设计的任意波形发生 ...…

查看全部问答>

c语言设计

本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 C语言程序设计的一本书,共享一下  …

查看全部问答>

想买块FPGA板,推荐一下呗!

大家好,本人今年要参加全国电子设计竞赛,各位大哥哥大姐姐谁有相关的板子卖给小弟!不胜感激!FPGA板要求:板子要精炼,不需要太多花俏的东西例如数码管什么的,只要把线全部引出了即可,支持JTAG下载!芯片最好clylone!! 不是也没关系! ...…

查看全部问答>

Spartan-6 and Virtex-6 FPGA Embedded Kit FAQ

1. Where can I purchase an Embedded kit?   2. How much do the Spartan-6 and Virtex-6 FPGA Embedded Kits cost? 3. When will I get my kit? 4. What are included in the Embedded Kits? 5. What expansion ports are avail ...…

查看全部问答>

你正在使用什么单片机?

[ 本帖最后由 飞嵌电子 于 2010-7-8 15:48 编辑 ]…

查看全部问答>

驱动无法加载到Device.EXE

注册表已经写入成功了,但是dll文件没加入到device.EXE   这是 什么问题了?…

查看全部问答>

SD卡等存储设备突然掉电后不可用的原因求助

是BPB还是FAT或FDT的损坏? 除了硬件损坏,文件系统突然断电会有什么样的写入错误造成存贮设备不可用吗? 一般的文件系统如果是先写数据,再记录FAT和FDT会提高保护的可能性吗。…

查看全部问答>

急急急,SOS!!!!

急求在ccs环境下ucosii移植到5402的源代码(不用修改的)。。。。。。。…

查看全部问答>

电源管理中ECO是神马意思?

最近在看一份富士通半导体的产品选型文件中出现的名词ECO不解,在百度上找到的结果是:Engineering Change Order。还有的说是在与环保相关的概念和资料中,ECO 是ECOLOGICAL的缩写,用来表示生态环保的意思。小弟就是想知道ECO到底是个什么技术?还 ...…

查看全部问答>

BeagleBone Black坏了,谁有闲置的出给我吧

BeagleBone Black坏了,谁有闲置的出给我吧 …

查看全部问答>