|
CRC 一、循环冗余码校验英文名称为Cyclical Redundancy
! m3 O1 z( R7 D6 v% s6 \! f3 H, a- B! A8 r
Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error
+ U, Y; w4 F$ U4 G) \: K$ {# N
0 k0 ?8 E# Z9 Z& | p: o+ |8 o Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。& e, n$ v1 F0 c3 b, K
. L1 x% ~9 `; Y9 m" | x ] 根据应用环境与习惯的不同,CRC又可分为以下几种标准:. I' v6 W$ x' f8 ^& Y3 C1 H
V$ M( S* m5 {9 O0 l ①CRC-12码;1 [/ y# w+ g, b- |
^& Q# t, J, ?( y3 J ②CRC-16码;8 x: ]- w j; t: {5 |% l
# a" m" h# N' {! W2 m3 }2 d1 O ③CRC-CCITT码;
0 x: h0 U; T1 f. R# e: c: d2 A( z1 j! z8 c* D( e% V
④CRC-32码。$ a$ k! F7 }# l' [1 F4 r/ {
2 p/ m2 t, g' z) r9 C5 A
CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。$ C( @3 J$ x' R' |
) L- J; k2 M0 ~' x# [" d
下面以最常用的CRC-16为例来说明其生成过程。' H; n' E4 ^; E# \+ o P
- D; x/ l2 V$ f CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
; Y0 A M1 P) a t0 s1 o4 T: x1 I2 ~" M+ k9 ]- T
下面为CRC的计算过程:1 r$ _6 M2 E1 b! v' W
8 @2 z/ Z' J7 ] 1.设置CRC寄存器,并给其赋值FFFF(hex)。* Y. W% P. Z& q# j, |: B! W2 v
, Q' L7 F+ ~* @) L8 }7 u
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。# \& e$ \0 ^3 y; L
; ^6 t* B% c. R. [ r
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。& {/ ^4 ?8 z, \( y# L" [
: P; D# g1 r* ` A! j7 t, `
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。9 ~3 w, m. G0 K/ P0 U, B
7 Y' J5 j1 y* i; C$ ?) Y+ i$ K
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
+ k( j( L/ p- F8 ~; l' d X/ G: t3 q# g
6.重复第2至第5步直到所有数据全部处理完成。+ h5 G# F+ _' N R
) C8 [8 i9 P1 V% o3 Q
7.最终CRC寄存器的内容即为CRC值。! ?1 _9 M8 f7 O) o
3 g0 w7 o- u+ g! @ 常用的CRC循环冗余校验标准多项式如下:
6 q8 I1 g: i% I. z7 F0 y' f8 Y# \* H h
CRC(16位) = X16+X15+X2+1
! L3 M7 w8 |; _0 e) u
! B7 ^3 ~% Y, g" ~2 T+ H6 d1 { CRC(CCITT) = X16+X12 +X5+1
5 N# Q* d5 w0 W7 R
0 h: G: P2 I3 t5 C/ k% R# R CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1 + d+ d7 u& ^& Z- Y8 V2 j
1 ], W& Z0 J1 D: d K, D 以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。 0 o3 p0 [! i, X
, o V$ O- W8 f$ C' ` 注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 |
|