CRC(Cyclic Redundancy Check,循环冗余校验)是数据帧传输中常用的一种差错控制编码方式,针对要发送的数据帧,使用一些特定的多项式可以计算出CRC校验结果,CRC校验结果和原始数据一起发送至接收端。接收端在接收数据的同时按照相同的多项式对接收数据进行校验计算,并将校验结果和接收的结果进行对比,如果二者相同则认为没有发生传输错误;如果不同,则认为发生了传输错误。
计算CRC的步骤如下;
1. 选择一个CRC算法或生成多项式,如CRC8-CCITT的生成多项式表示为(x^8 + x^2 + x + 1);
2. 计算CRC之前,CRC寄存器初始化为一个已知的值,称为CRC初始值;这里要求确定的初始值,因为接收端的CRC校验电路需要使用和发送端相同的初始值;
3. CRC寄存器初始化之后,每个时钟都有一个数据比特输入,与当前寄存器的值共同参与计算;CRC校验电路中,一些寄存器的输入来自前级的输出,有的是前级的输出与当前输入数据进行逻辑运算的结果;
4. 在每个周期,新的数据不断输入,CRC寄存器不断更新,直到最后一个输入比特到达;
5. 当最后一个数据比特到达时,CRC内部所存储的就是最后的CRC校验结果;
6. CRC校验结果的位宽取决于具体的CRC算法,CRC8-CCITT的CRC校验结果为8比特;
7. 在最后一个数据比特发出后