关于SD卡CRC7校验的问题

[复制链接]
 楼主| xiezhaoxuan 发表于 2015-12-25 14:32 | 显示全部楼层 |阅读模式
  现在在研究SD卡,刚刚开始,却感觉困难重重,可能是比较笨吧,好不容易到了CMD8命令,发现用了几张卡,发送CMD8命令(0x48,0x00,0x00,0x01,0xAA,0x87)返回应答都是0x09,显示CRC校验错误,一开始以为是卡的问题,可是换了几张卡都这样,开始怀疑是不是校验0x87真的错了?

  这是从网上的程序中得到的值,主要是自己不知道CRC7校验的生成过程,所以不确定就开始怀疑了,看到SD卡协议中有相关说明:


但是还是不明白具体过程,然后开始在网上找资料,关于这方面的资料很少,不过最后大概明白了它的计算过程,然后自己用QT写了个计算CRC7的程序,经过验证,上面CMD8命令的校验码就是0x87,
下面贴上计算校验码的相关部分程序:
  1. //计算CRC7
  2. //传进来的数组指针应该后面有余量,起码多出一个字节,用于存放CRC补上的7个0位
  3. //计算方法是根据SD卡协议4.5节得出的
  4. quint8 Widget::Crc7(quint8 *calByte,quint16 calNum)        //计算CRC7
  5. {
  6.     quint8 Crc_Num2=0x89;       //CRC7的多项式
  7.     quint16 Crc_Num3=1;     //计数数组中提供移位的字节的位置
  8.     quint16 Crc_Num4=0x80;     //计数移位字节中该移哪一位
  9.     quint8 Crc_Num5=*calByte;   //除法计算中的被除数,也存结果
  10.     //quint8  Crc_Num6=0;         //存储除法计算中的余数,即异或后的值

  11.     *(calByte+calNum)=0;        //讲数组扩充一个字节,并补0

  12.     while(1)
  13.     {
  14.          if((Crc_Num5&0x80)==0x80)    //检查最高位是否为1
  15.         {
  16.              Crc_Num5=Crc_Num5^Crc_Num2;
  17.         }
  18.         else        //最高位不为时,从后面字节借位,向前移一位
  19.         {
  20.             if((Crc_Num3==calNum)&&(Crc_Num4==0x01))  //移到最后一个字节倒第二位了
  21.             {
  22.                 break;  //退出循环
  23.             }

  24.             if(Crc_Num4==0x00)   //当前字节移完,换下一个字节
  25.             {
  26.                 Crc_Num4=0x80;
  27.                 Crc_Num3++;
  28.             }
  29.             else
  30.             {
  31.                 Crc_Num5<<=1;   //左移1位
  32.                 if(((*(calByte+Crc_Num3)&Crc_Num4)==0)) //补上1位
  33.                     Crc_Num5&=0xFe;
  34.                 else
  35.                     Crc_Num5|=0x01;
  36.                 Crc_Num4>>=1;
  37.                 Crc_Num4&=0x7F;
  38.             }
  39.         }
  40.     }

  41.     return Crc_Num5;
  42. }


现在好了,既然不是校验码的问题,那问题就麻烦了。。。。

继续研究吧。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部