OpenEdv-开源电子网

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

对于SD卡还有点不理解的地方,求教

[复制链接]

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
发表于 2012-11-26 17:06:21 | 显示全部楼层 |阅读模式
//向SD卡发送一个命令
//输入: u8 cmd   命令
//      u32 arg  命令参数
//      u8 crc   crc校验值   
//返回值:SD卡返回的响应                
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);//分别写入命令
    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--); 
 //返回状态值
    return r1;
}                          
//获取SD卡的CID信息,包括制造商信息
//输入: u8 *cid_data(存放CID的内存,至少16Byte)  
//返回值:0:NO_ERR
//   1:错误                
u8 SD_GetCID(u8 *cid_data)
{
    u8 r1;   
    //发CMD10命令,读CID
    r1=SD_SendCmd(CMD10,0,0x01);
    if(r1==0x00)
 {
  r1=SD_RecvData(cid_data,16);//接收16个字节的数据 
    }
 SD_DisSelect();//取消片选
 if(r1)return 1;
 else return 0;
}  

以上2个函数,是原子SD卡实验里面的,第一个  SD_SendCmd 是发送指令的,第二个 SD_GetCID 是获取CID的
       我对于 SD_SendCmd 这个函数不太理解,对应第二条函数中的   r1=SD_SendCmd(CMD10,0,0x01);来讲
             发送的指令是CMD10,参数是0,CRC是01,那么在 SD_SendCmd 这个函数中的返回值是sd卡的响应。
       SD卡的R1响应结构是      0           0            X              X            X             1
                                      起始位    传输位     命令索引     卡状态     CRC7      结束位
     首先,我不清楚响应的 命令索引,卡状态是什么意思,也许是  CMD10发送的命令参数之类的。
           从R1的响应来看无论如何,R1的结束位是1,那么说,如果命令索引,卡状态和CRC7都是0的话,R1的值也是0x01,不可能是0x00
     有了这个结论之后,再来看上面的SD_SendCmd 这个函数,可知这个函数的返回值就是R1的值,是不会为0的;
             那么在 SD_GetCID 这个函数当中,为什么要    if(r1==0x00)  了才进入接收数据的函数呢?  还有 if(r1)return 1; 这个是返回错误的,既然R1不会为0,那么SD_GetCID 这个函数不就始终返回1,是错误的了?

            主要还是R1响应弄的不太明白,请各位抽点时间看看,帮忙解决这个问题,谢谢了
 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-26 18:56:08 | 显示全部楼层
这个只是  u8 r1;  并不是说他的返回值就是R1格式!
别被这个变量迷惑了。。。
看看附件这个文档!有详细的介绍的!

SD卡2.0协议.pdf

1.04 MB, 下载次数: 438

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2012-11-27 08:30:24 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好的,昨天又研究了下,貌似有点点明白了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 00:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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