micro 2G sd卡执行cmd8命令时,每次的返回值不一样,求解

[复制链接]
 楼主| adqprint 发表于 2011-5-24 09:54 | 显示全部楼层 |阅读模式
大家好:
    我用的是micro 2G sd卡,spi接口。执行程序
    //-----------------SD卡复位到idle结束-----------------  
    //获取卡片的SD版本信息
    r1 = SD_SendCommand_NoDeassert(8, 0x1aa, 0x87);
r1每次的返回值都不一样。我看sd卡的手册上说
• Compatible with SD Specification Ver. 2.0
• Comply with SD File System Specification Ver. 2.0
那他应该返回值是0x01,请大家帮忙想想为什么。
我执行循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态这步是对的,这能说明硬件电路和卡没问题吧?
下面是cmd8执行程序
u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc)
{
    unsigned char r1;
    unsigned char Retry = 0;
    //????????
    SPI_ReadWriteByte(0xff);
    //片选端置低,选中SD卡
    SD_CS_ENABLE();
    //发送
    SPI_ReadWriteByte(cmd | 0x40);                         //分别写入命令
    SPI_ReadWriteByte(arg >> 24);
    SPI_ReadWriteByte(arg >> 16);
    SPI_ReadWriteByte(arg >> 8);
    SPI_ReadWriteByte(arg);
    SPI_ReadWriteByte(crc);
    //等待响应,或超时退出
    while((r1 = SPI_ReadWriteByte(0xFF))==0xFF)
    {
        Retry++;
        if(Retry > 200)break;   
    }
    //返回响应值
    return r1;
}
yinyangdianzi 发表于 2011-5-24 12:02 | 显示全部楼层
没次都要点新鲜感
t.jm 发表于 2011-5-24 12:45 | 显示全部楼层
SPI_ReadWriteByte(crc);
    //等待响应,或超时退出
    while((r1 = SPI_ReadWriteByte(0xFF))==0xFF)
    {
        Retry++;
        if(Retry > 200)break;   
    }
    //返回响应值
    return r1;

有可能这里没写好,我的试过读几次都是0x01,
1)最好在SPI_ReadWriteByte(crc);之后把这时接受到的垃圾数据取走,因为SPI是双向通信,每一个发送同时都会收到一个数据。
2)最好在CS设置高后发送8一个DUMMY字节。
 楼主| adqprint 发表于 2011-5-24 14:49 | 显示全部楼层
谢谢二位,问题解决了,是硬件问题。MISO管脚有点和地虚接,从新焊接以后就好了
wenzj12345 发表于 2012-4-5 09:44 | 显示全部楼层
观注···
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

60

帖子

1

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