OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4569|回复: 3

SD卡问题 while((r1!=0X01) && retry--);

[复制链接]

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-11-7
在线时间
0 小时
发表于 2014-4-9 19:15:51 | 显示全部楼层 |阅读模式

请求指导,在原子哥sd卡初始化 SD_Initialize(void) 程序中 ,发送CMD0复位时

do
 {
  r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
 }
 while((r1!=0X01) && retry--);

这里为什么要 判断是不是接收到了0x01呢 ?看了很多pdf没找到说cmd0之后,要应答0x01的啊!!!

还有这个 SD_SendCmd(CMD0,0,0x95)函数进去后

u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc)
{
    u8 r1; 
 u8 Retry=0;
 SD_DisSelect();//取消上次片选
 if(SD_Select())return 0XFF;//片选失效
 //发送
    SD_SPI_ReadWriteByte(cmd | 0x40);//分别写入命令 cmd0的命令是40,其余是依次加1
    SD_SPI_ReadWriteByte(arg >> 24);
    SD_SPI_ReadWriteByte(arg >> 16);
    SD_SPI_ReadWriteByte(arg >> 8);
    SD_SPI_ReadWriteByte(arg);  
    SD_SPI_ReadWriteByte(crc);
 if(cmd==CMD12)SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading
    //等待响应,或超时退出
 Retry=0X1F;
 do
 {
  r1=SD_SPI_ReadWriteByte(0xFF);
 }while((r1&0X80) && Retry--);    //当r1不为0x80时,退出循环
 //返回状态值
    return r1;

}

上面加粗加黑的代码,这里为什么有((r1&0X80) 这个东西呢,难道发送完crc之后,r1应该是0x80,?等过一会变成0x01么!?

实在看不懂,求指导啊!
                          

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-4-9 19:28:05 | 显示全部楼层
原子哥,帮忙解答下啊,感激不尽,我找了好久没找到为什么
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-4-9 20:51:26 | 显示全部楼层
我去,知道为什么了,我看的命令式SD模式下的,太伤心了,果然是看SD2.0协议就知道为什么了。顺便付上一个SD2.0协议SIP模式章节的中文版,供初学者参考。

SPI中文.zip

1.37 MB, 下载次数: 264

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-9 23:10:56 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-12 16:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表