70
2004.2
单片机与嵌入式系统应用
CRC-8高效简练的单片机实现方法
※
■ 福建农林大学 陈松岭
1ST STAGE
2ND STAGE
X X X 3RD STAGE
X 4TH STAGE
XOR
X 5TH STAGE
XOR
X 6TH STAGE
X 7TH STAGE
X 8TH STAGE XOR
X 输入数据
(LSB)
(MSB)CRC-8的生成多项式=X +X +X +1
8
5
4
1 2 3 4 5 6 7 8 输入 原CRC
新CRC C R C *
h a0 b1 c2 ad03
abe014
bcf125
acdg0236
bdeh1347 H*
g h a0 b1 c2 ad03
abe014
bcf125
acdg0236 G*
f g h a0 b1 c2 ad03
abe014
bcf125 F*
e f g h a0 b1 c2 ad03
abe014 E*
d ae0 bf1 cg2
adh03 be14 cf25
adg036
abeh0147 D*
c ad0
abe01
bcf12
acdg023
bdeh134
cef245
adfg0356
abegh01467 C*
b c ad0
abe01
bcf12
acdg023
bdeh134
cef245
adfg0356 B*
a b c ad0
abe01
bcf12
acdg023
bdeh134
cef245 A*
0 1 2 3 4 5 6 7
本刊2002年第9期《循环冗余校验码的单片机及
CPLD实现》[1]
和2003年第8期《DS18B20串行通信误码的解决方法》[2]两篇文章,都讨论了如何在单片机中实现
CRC-8校验的问题,但所给出的程序还不够精炼和完整。笔者在从事1-wire(单总线)器件(如DS1961S、DS18B20也是一种1-wire芯片)实际编程中,从CRC-8的校验码生成器的硬件实现电路出发,从理论上推导出实现CRC-8校验的公式,从而得出更为简练高效的单片机软件实现方法。
1CRC-8校验过程分析
图1为CRC-8校验码生成器的硬件实现电路,由移
位寄存器和异或门组成。从算术的角度,图1可以被看作是一个除法电路:输入的数为被除数,带有反馈作用的移位寄存器可视为除数,运算的商被丢弃。数据逐位输入到电路中进行运算。当数据输入完成之后,8位移位存器中数据就相对于定输入据流CRC值。
在图STAGESTAGE对应CRC ̄第0路出发,输入1图值与原C的关系。
设当(Current CRC)值为= hgfe dcba (MSB->LSB),输入的值(Input) = 7654 3210(7代表输入数据第7位的数据,6代表第6位数据,以此类推)。电路的运算结果如表1所列。表1中ab表示a XOR b,即为a和b的异或和。
令CRC的临时值CRCTMP = HGFE DCBA = CurrentCRC XOR Input,即为当前CRC值与输入数据的异或和。有CRCTMP = (HGFE DCBA) = ( hgfedcba ) XOR ( 76543210 )。
定义ab=a XOR b,有H = h XOR 7 = H7,G=g6,F=f5,E=e4,D=d3,C=c2,B=b1,A=a0
定义H*=h的新值,有 H* = hnew,G* = gnew等等。定义CRC*= CRC的新值。
因此,根据表1中新CRC值,有公式1:
H*=BDEH ,G*=ACDG ,F*=BCF ,E*=ABE ,D*=ABEH,C*=ABEGH,B*=ADFG,A*=CEF
CRC*=H* G* F* E* D* C* B* A* (MSB->LSB) (1)
71
Microcontrollers & E mbedded Systems
2004.2
表2 CRC8CAL和CRC8Table的程序性能比较
目标代码
长度/B 执行时间 /μs CRC 使用的 内存单元 程序中使用的 寄存器 使用的场合
CRC8CAL 61 41 可位寻址单元 A ,R2,Cy
程序存储区空间紧张,对校验速度要求不高
CRC8Table
261
7
普通单元
A
校验速度要求较高的应用
C、B、A的值有关,也就是只和当前CRC值与输入值的异或和(CRCTMP)有关。在取得CRCTMP后,求得新CRC值有两种不同的方法:① 根据CRCTMP每一位值直接求出新的CRC值;② 根据以上分析结果编制一份256字节的表格,以CRCTMP作为索引查表得到新的CRC值。
2CRC-8的单片机软件实现
根据公式1,采用直接计算和查表法编制的MCS51
汇编语言程序分别为CRC8CAL和CRC8Table。程序见本刊网站(http://www.dpj.com.cn)。
CRC8CAL和CRC8Table的程序性能比较,如表2所列。系统晶振假设为12MHz。
3实例分析
以1-wire芯片的实际编程说明。如某个DS1961S芯
片的64位地址码为:33 35 E1 04 00 00 00 4C(十六进制数),依次存放在AddrNoBuf的8字节缓冲区中。根据1-wire地址码的组成规则,8字节数据全部通过CRC-8校验后的结果应为零[3]
。下文给出相应程序段。
MOV CRC,#0;3 字节,2μs,CRC单元清
;零,使用前CRC应清零
MOV R0,#AddrNoBuf;2字节,1μs,R0->缓冲区,
;第一字节(33H)存放在;AddrNoBuf单元
MOV R3,#8;2字节,1μs,R3为计数单
;元,地址码共8字节
DoCRC:MOV A,@R0;1字节,1μs,取出数据
ACALL CRC8CAL;2字节,2μs,语句1。进行
;CRC单元中
ACALL CRC8Table
;2字节,2μs;语句2。语句1;可由语句2加上语句3代替MOV CRC,A;2字节,1μs;语句3INC R0
;1字节,1μs;下一个数据DJNZ R3,DoCRC;2字节,2μs
…
;完成整个地址码的校验,正;确的校验结果应为0
这样,在12MHz系统晶振下,完成8字节数据的CRC-8校验最慢只需要380μs,最快只需要116μs。而利用参考文献[2]提供的程序,完成相同的8字节数据的CRC-8校验需要978μs,并且占用更多的工作寄存器。
结 语
根据公式1,也可以利用高级语言或在其它类型的单片机中快速实现CRC-8的软件编码校验程序,或者在
CPLD和FPGA等可编程逻辑器件上实现高效的CRC-8校验电路。同样,根据本文所述的原理,也可以推导出快速实现CRC-16软件编码的公式。得到的公式和MCS51的汇编程序也是十分简洁的。
参考文献
1来卫国,徐冉. 循环冗余校验码的单片机及CPLD实现.单片机与嵌入式系统应用,2002(9)2宋寅卯,高卫民. DS18B20串行通信误码的解决方法.单片机与嵌入式系统应用,2003(8)3黄宇飞,等. 单片机单总线技术. 单片机与嵌入式系统应用,2001(1)4
Maxim Integrated Products,Inc.Book of iButton Standards.
pdf . www.ibutton.com
(收稿日期:2003-09-09)