新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > CRC校验码在单片机中的程序实现及其冗余码表的求取

CRC校验码在单片机中的程序实现及其冗余码表的求取

作者:时间:2012-02-15来源:网络收藏

4 码的查表方法

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

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

10.jpg

其中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

12.jpg

每种规则校验码的最高位都为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

5 结束语

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

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

51单片机相关文章:51单片机教程


单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理


数字通信相关文章:数字通信原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭