当前位置:文档之家› CRC-8高效简练的单片机实现方法

CRC-8高效简练的单片机实现方法

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)

相关主题
文本预览
相关文档 最新文档