打印

CMD10读SD卡的CID,一直得不到0xFE

[复制链接]
4928|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pengyang73|  楼主 | 2012-7-8 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始化完成后,用CMD10读CID,过程如下:

response = SPI_SD_SendCommand(CMD10,0,0xff);
得到的response为0x0,继续;

response = SPI_SD_SendReceiveByte(Dummy_Byte);
只要response不为0xFE,就一直循环SPI_SD_SendReceiveByte(Dummy_Byte);
可我得到的response一直为0xFF,都循环了0xFFFE次了,肯定已超时。


请问我的流程有错误吗?谢谢!
沙发
悠然科技| | 2012-7-9 10:07 | 只看该作者
先确保初始化是否成功,我一直初始化得不到正确的字符,调试好后,cmd10就正常了

使用特权

评论回复
板凳
pengyang73|  楼主 | 2012-7-9 16:39 | 只看该作者
我的初始化:
1)对MMC卡, 发CMD0得到返回值0x01, 然后发CMD1,得到的返回值是0x0;
2)对SD卡,发CMD0得到返回值0x01, 然后发CMD55,得到返回值0x01,然后发ACMD41,得到0x0;
3)再对MMC卡,发CMD0得到返回值0x01, 然后发CMD55,得到返回值0x05,即非法指令和idle status两个位有指示;

我觉得这个初始化应该没有问题吧? 对了,我用的是SPI接口

使用特权

评论回复
地板
悠然科技| | 2012-7-9 17:39 | 只看该作者
初始化和返回值木有问题
我也这样做的,读cid还是很流畅,并且也是判断了0xfe

使用特权

评论回复
5
pengyang73|  楼主 | 2012-7-9 21:32 | 只看该作者
能不能把你的读CID那段程序帖上来学习一下?

使用特权

评论回复
6
sunruiyeyipeng| | 2012-7-13 22:38 | 只看该作者
不知道这个返回值有什么意义,我一直在找这个返回值和意义的对应表格

使用特权

评论回复
7
pengyang73|  楼主 | 2012-7-15 16:14 | 只看该作者
这个0xFE应该是数据令牌,表示其后面的内容是数据,而不是R1或错误信息什么的.

使用特权

评论回复
8
pengyang73|  楼主 | 2012-7-15 17:08 | 只看该作者
本帖最后由 pengyang73 于 2012-7-15 17:13 编辑

问题还没有解决,我的代码如下,请各位大虾帮我检查一下,谢谢!

说明:
1)前面初始化的代码省略了
2)SPI_SD_SendCommand不含CS拉高拉低的操作,但包含了CS拉低后和命令结束后的延迟等待

////////////////////////////  读CID ////////////////////////////////////////////////
        retry=0;
        SPI_SD_CS_LOW();
        do {
                  response = SPI_SD_SendCommand(CMD10,0,0xff);
                  retry++;
               } while ((response!=0x00)&&(retry<400));
        if (response==0x00) printf(" CMD10 = 0x%x   retry=%d\r\n",response,retry);
         else {
                       printf(" CMD10 sent failed! 0x%x\r\n",response);
                    return;
              }

        retry=0;
        do {
                   response = SPI_SD_SendReceiveByte(Dummy_Byte);
                   retry++;
        }  while ((response!=0xFE)&&(retry<0xFFFE));  
        if (response==0xFE) printf(" 数据令牌 = 0x%x   retry=%d\r\n",response,retry);
         else {
                       printf(" 获取数据令牌 =0x%x  failed!  retry=%d\r\n",response,retry);
                     return;
              }
   
        for (i=0;i<16;i++)         CID=SPI_SD_SendReceiveByte(Dummy_Byte);
        
               SPI_SD_CS_HIGH();

        for (i=0;i<16;i++) printf("CID[%d] = 0x%x\r\n",i,CID);

使用特权

评论回复
9
pengyang73|  楼主 | 2012-7-15 17:10 | 只看该作者
对了,上面程序运行的结果是(通过USART显示在超级终端上):


CMD0  = 0x1   retry=1
CMD1  = 0x0   retry=32
CMD16 = 0x0   retry=1
CMD59 = 0x0   retry=1
SD inited successfully!
CMD10 = 0x0   retry=1
获取数据令牌 = 0xff, failed!  retry=65534

使用特权

评论回复
10
figo20042005| | 2012-7-16 22:02 | 只看该作者
LZ问题现在解决了吗?

使用特权

评论回复
11
pengyang73|  楼主 | 2012-7-16 22:31 | 只看该作者
figo20042005, 你好, 还没有哎.  我现在快40才开始学单片机,白天还有其他工作,真是不容易啊. 不过, 这单片机好象很容易上瘾,越来越喜欢,呵呵

使用特权

评论回复
12
figo20042005| | 2012-7-17 21:02 | 只看该作者
大哥,你40了怎么想着学单片机,培养电子兴趣?

使用特权

评论回复
13
pengyang73|  楼主 | 2012-7-21 10:28 | 只看该作者
很大一部分原因是兴趣,还有工作也需要用到一些。 工作中有些项目确实可以让别人来做,但一来时间上不急迫,二来自己也觉得很有意思, 所以干脆就自己来玩玩。 我原来是学通讯的。

但是现在时间上远不如以前充沛了,白天要处理原来的事务,晚上要顾家,比在学校或刚毕业时吃力多了,所以就上这里来求助于各位了。呵呵

使用特权

评论回复
14
mcuzhuanyong| | 2012-10-26 17:29 | 只看该作者
lz解决没,我也遇到同样问题,就是读不到0xfe。其他的都正常

使用特权

评论回复
15
xumengkai| | 2013-2-25 20:07 | 只看该作者
我遇到了同样的问题,但是我发现那个miso管脚配置的不对,改过来以后好了!我的qq381426031

使用特权

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

本版积分规则

0

主题

26

帖子

0

粉丝