|
CRC 一、循环冗余码校验英文名称为Cyclical Redundancy 2 T$ T2 o/ x; c& @3 B1 h
) m: r/ e; [# f4 C9 } Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error
7 U: @2 \, n8 x E2 |, j$ A" g4 ]+ x/ a+ ~3 i3 i
Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。8 h2 I0 B$ \ b# @
% Q: z! h, P' G9 N' y- J/ H 根据应用环境与习惯的不同,CRC又可分为以下几种标准:
( X% \- P* ? L7 H* D: y) L% I4 Y% a1 O$ c
①CRC-12码;
" O% y7 ^4 F7 i' V1 z5 h4 O/ m; { B5 @, k& e* Z9 C
②CRC-16码; T2 {' ]5 ?, [; ]8 Y
: J A5 A d$ }: `+ J: f
③CRC-CCITT码;
: X4 Q4 g+ T; N d3 E6 A- a/ T1 Z# o% S4 }) b# h
④CRC-32码。
* @# S! v5 J9 \ g. M4 p' b
; Y6 Y: z/ ?& B) t7 a: P CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
( R$ q) G- \ q# w
( l |- C9 {2 @3 Y6 d0 V! f 下面以最常用的CRC-16为例来说明其生成过程。6 [- V }4 S' S' h- Y. U2 w
$ ?9 \+ E* h# T; A
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。2 T: O$ K( E6 ~1 X
, g }4 l X$ t7 v; B 下面为CRC的计算过程:7 p0 c& s9 x u; V) m* ~
& C& P9 q2 N7 r# U5 |5 S5 \
1.设置CRC寄存器,并给其赋值FFFF(hex)。2 i1 o# ]( [1 O
) Y5 [& \4 `) @4 N' G# X1 E 2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
( W3 L& Q, u% o O' f% I6 U
y5 a* A) m4 @" ` 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。& u4 u9 W$ G- \' [+ U
' W0 Q6 O! q; c4 W 4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
/ P1 @, A7 m' f
. w, T9 j4 r% L) Q2 S9 P& D 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6 L. M# X4 G3 t1 ?( B$ Z/ s9 v. h2 B9 h' s! ?* C
6.重复第2至第5步直到所有数据全部处理完成。
( O) o2 G) ]3 i0 z5 p. c
) G- o. R7 f# L/ H 7.最终CRC寄存器的内容即为CRC值。) j( I+ G- Y( Q) Z# e3 ^7 f3 b
1 C" Z# ?* l* n* i 常用的CRC循环冗余校验标准多项式如下:
/ T% P+ ^' `% i3 V
. w2 c8 L0 Q4 p) h& ^% ` CRC(16位) = X16+X15+X2+1
) w0 Q f O; d/ } u2 @6 U/ }: p3 B
CRC(CCITT) = X16+X12 +X5+1 m Q6 y. `- P$ @: k% B
( p0 k7 E! ~8 t! q; \ CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1 , }, @0 }* q9 Z% V% S
2 Z" B# W1 P' a+ o 以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。 1 S4 X7 |$ ?1 ^: a4 p/ W) D, J- m
! g' t, C6 M, y: e+ w 注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 |
|