前言
在学习写SD卡2.0协议的一个SD卡模型(Verilog)的时候,遇到了CRC效验码的有关问题,记录一下。
一、CRC效验码是什么?
CRC效验码是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。
基本思想是将传输的数据补位一定长度。将这个补位后的数除以另一个数(约定好的一个多项式 ,如x^7 + x^3 + 1,或者二进制表示10001001)。得到的余数作为校验数据附加到原数据后面。
计算方法为采用无进位的二进制加法(等价于XOR操作),最后对另一个数(约定好的一个多项式 ,如x^7 + x^3 + 1)取模。
二、在SD2.0中的CRC
1.CRC 适用于保护 SD 总线上的 SD 卡命令,响应和数据传输免于出错的。命令线上,每个命令 都会产生 CRC,而每个响应也都会检查 CRC。对于数据块来说,每一个传输的块都会产生 CRC。
CRC 的产生和检查描述如下:
CRC7 的检测是用于所有的命令,所有的响应(除了 R3),以及 CSD 和 CID 寄存器。CRC7 是一个 7bit 的数,计算方法如下: G(x) = x^7 + x^3 + 1。
M(x) = (第 1bit)*x^n + (第 2bit)*x^(n-1) + … + (n+1bit)*x^0
CRC[6:0] = [(M(x)*x^7)/G(x)]的余数
第 1bit 是相对应 bit 串(命令,响应,CID,CSD)最左边的 bit。 n 是 CRC 保护的 bit 数-1。命令和响应的保护数是 40(n=39),CSD 和 CID 是 120(n=119)。
