|
CRC 一、循环冗余码校验英文名称为Cyclical Redundancy ! l2 Z+ N! {- f) J; l
# Y) Y g! p4 w/ k+ f6 p
Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error
- A/ ?5 Z2 J: Y) @ M( a# m
, A. s* x% u: [ Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。
% G3 C( D+ B& r; a1 g' m% ~0 S. Y. P6 o9 R+ O
根据应用环境与习惯的不同,CRC又可分为以下几种标准:
5 A$ n: I0 [2 a
! E! x7 V/ U. `: h ①CRC-12码;
3 w9 Y4 E% E% I# S5 H+ H+ W' B$ c: @( J! z4 v h) R; k9 [& E& O
②CRC-16码;* F# g& ~* f2 [4 D
" t4 R; J' h7 M( M0 [ ③CRC-CCITT码;% Y8 Q o; \$ D
+ O; {( |* n/ c, _6 ?) w
④CRC-32码。$ c- u$ r9 F5 ?, y: N: i' ]
" M {' Z# U4 H- Q( } CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
# n7 k( F3 V5 H* |( F+ R# r
% i- D f0 s e 下面以最常用的CRC-16为例来说明其生成过程。# ^0 o9 L! n* M) i" X
t- s7 a: [6 `2 z. r3 F+ d5 J+ }
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。/ o6 c& _, X9 z" ]" l* d$ K
" D7 e0 C8 N: ~5 [# h9 a 下面为CRC的计算过程:
! v. c4 t& L4 l: f9 u
' y- }7 j/ @5 x 1.设置CRC寄存器,并给其赋值FFFF(hex)。
: E' v' v* l9 o) e+ s* ~6 J
! l5 h! k) ^+ e1 b* ^4 L 2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。3 Q9 B0 L+ B3 [* b1 n, {
7 h; k+ T; l3 |9 r1 ?- ]
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
- D# g: S6 P! P6 D# T0 M: i8 c5 h% ^
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
3 K0 @, X% f Z$ o, X- p
4 x! m) \7 R S5 d3 s 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。* f! Y2 Y6 N, g( H
W) T* n% Y) F5 K
6.重复第2至第5步直到所有数据全部处理完成。, D0 J8 o9 h; s; U$ |
1 u2 z* e1 k4 c- @: v 7.最终CRC寄存器的内容即为CRC值。 F1 K. G# [' p1 ?, E
/ x* P" D* z7 i$ ]( t; \+ Z. T. o
常用的CRC循环冗余校验标准多项式如下:
4 b9 \+ _* k, G& ~1 T$ x3 T b5 _) k0 R: T3 n
CRC(16位) = X16+X15+X2+1 7 o9 b. f" t; ~9 K: _' \! }
6 l% x: Z8 O# K7 x
CRC(CCITT) = X16+X12 +X5+1 % I& \( d# p8 {: {" _0 @2 H# c
n$ {. e& |3 n$ D CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1 - `3 O" c/ q7 v
l# s3 K) n* f0 f% D' j 以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。
1 |. y4 M! ^+ k$ }) y2 z7 w3 b3 V. U& [, T: e! H
注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。 |
|