STM32读写SD卡时犯下的错误

[复制链接]
2854|2
 楼主| xiezhaoxuan 发表于 2016-1-7 14:55 | 显示全部楼层 |阅读模式
本帖最后由 xiezhaoxuan 于 2016-1-7 14:57 编辑

  如题,用公司的STM32F105VC通过硬件SPI方式读写SD卡,发送CMD8命令总是返回0x09,断断续续找了好几天的原因没有找到,今天找了个教程里的程序,移植到这个板子上了,再发送CMD8,结果返回的是0x01,甚至都用示波器看了波形,一开始教程程序SPI时钟慢,以为是我程序里时钟的问题,把教程程序时钟调到278KHz左右发现人家得程序还是能初始化卡成功,实在没办法了,两个程序对比吧,最后对比到下面这段程序,恍然大悟啊,真正的恍然大悟啊

  1. //发送一个命令,并返回相应的值
  2. uint8_t Sd_SendCommand(uint8_t Cmd,uint32_t Arg,uint8_t Crc)
  3. {
  4.     uint8_t Sd_Num2=0xff,Sd_Num3=0;

  5.     Sd_SendOneByte(Cmd);
  6.     Sd_SendOneByte((uint8_t)Arg>>24);
  7.     Sd_SendOneByte((uint8_t)Arg>>16);
  8.     Sd_SendOneByte((uint8_t)Arg>>8);
  9.     Sd_SendOneByte((uint8_t)Arg);
  10.     Sd_SendOneByte(Crc);

  11.     while(1)
  12.     {
  13.         Sd_Num2=Sd_SendOneByte(0xff);
  14.         if((Sd_Num2&0x80)!=0x80)
  15.             break;
  16.         if(++Sd_Num3>=10)
  17.             break;
  18.     }

  19.     return Sd_Num2;
  20. }
Sd_SendOneByte((uint8_t)Arg>>24);
  我实际是打算先将Arg右移24位再截成8位数据,但是这样写就废了,成了先将Arg截成8位数据再右移24位。。。。

改为下面这样,一次通过。。。
  1. Sd_SendOneByte(Cmd);
  2.     Sd_SendOneByte((uint8_t)(Arg>>24));
  3.     Sd_SendOneByte((uint8_t)(Arg>>16));
  4.     Sd_SendOneByte((uint8_t)(Arg>>8));
  5.     Sd_SendOneByte((uint8_t)Arg);
  6.     Sd_SendOneByte(Crc);


  记住这个教训吧。。。。

评分

参与人数 1威望 +10 收起 理由
dirtwillfly + 10 很给力!

查看全部评分

dirtwillfly 发表于 2016-1-7 15:37 | 显示全部楼层
感谢分享,很赞
motor666 发表于 2016-6-8 11:44 | 显示全部楼层
所以我从来都是一步一步自己写代码,交给编译器不放心,上过当。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

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