打印

STM32读写SD卡时犯下的错误

[复制链接]
2667|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiezhaoxuan|  楼主 | 2016-1-7 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiezhaoxuan 于 2016-1-7 14:57 编辑

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

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

    Sd_SendOneByte(Cmd);
    Sd_SendOneByte((uint8_t)Arg>>24);
    Sd_SendOneByte((uint8_t)Arg>>16);
    Sd_SendOneByte((uint8_t)Arg>>8);
    Sd_SendOneByte((uint8_t)Arg);
    Sd_SendOneByte(Crc);

    while(1)
    {
        Sd_Num2=Sd_SendOneByte(0xff);
        if((Sd_Num2&0x80)!=0x80)
            break;
        if(++Sd_Num3>=10)
            break;
    }

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

改为下面这样,一次通过。。。
Sd_SendOneByte(Cmd);
    Sd_SendOneByte((uint8_t)(Arg>>24));
    Sd_SendOneByte((uint8_t)(Arg>>16));
    Sd_SendOneByte((uint8_t)(Arg>>8));
    Sd_SendOneByte((uint8_t)Arg);
    Sd_SendOneByte(Crc);


  记住这个教训吧。。。。

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

相关帖子

沙发
dirtwillfly| | 2016-1-7 15:37 | 只看该作者
感谢分享,很赞

使用特权

评论回复
板凳
motor666| | 2016-6-8 11:44 | 只看该作者
所以我从来都是一步一步自己写代码,交给编译器不放心,上过当。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

粉丝