OpenEdv-开源电子网

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

sd卡数据读写问题请教

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-9-11
在线时间
0 小时
发表于 2013-9-11 14:14:29 | 显示全部楼层 |阅读模式
用原子哥的代码移植到自己的板子上,初始化有效了。也能读出sd的大小。但在进行读扇区时返回r1值老是为0xff,不知问题出在哪,求指教
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节   
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节  
buf+=512;  
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}   
SD_DisSelect();//取消片选
return r1;//
}

另外对于写命令函数
  
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;
}    
r1=SD_SPI_ReadWriteByte(0xFF); 这个语句不是很理解,为什么读取返回值时要一直给sd卡写0xff?望不吝赐教。

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

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-11 15:26:17 | 显示全部楼层
回复【楼主位】haokeer:
---------------------------------
SPI是环路数据,后面的进去了才能把前面的“顶”出来。
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-9-11
在线时间
0 小时
 楼主| 发表于 2013-9-11 16:05:23 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
请问这就是用这句r1=SD_SPI_ReadWriteByte(0xFF);的意义吗
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-11 16:42:18 | 显示全部楼层
回复【3楼】haokeer:
---------------------------------
是的,写0xFF,可以得到返回值。
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-9-11 21:52:19 | 显示全部楼层
回复【4楼】ricefat:
---------------------------------
找了半天也没看到,为什么SD卡在检测是否准备好的时候,直接写入0xff呢?为什么写其他的值不可以呢?谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-11 21:59:13 | 显示全部楼层
回复【5楼】shilang0304:
---------------------------------
你觉得应该写多少?
然后按你的这个值,去实际测试一下。看看OK不?如果OK,恭喜,你写的这个值也可以用。
如果不OK,那就再试试其他值,一直试到OK为止。
最后,你可以得出一个结论:在0~0XFF之间,这个地方必须写XXX这些值,否则无法成功。
相信能帮到很多人。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-9-11 22:00:47 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
按照您说的,SD卡是环路数据,写0XFF能把数据顶出来,那我写其他值能把数据顶出来吗?比如我写0x55呢?
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-9-11 22:04:52 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,我刚才一直在试,按照1楼回复的,是环路数据,那我写0x55,顶上来的也应该是0XFF,但是SD卡检测失败,我试过几个值了,还希望原子赐教,谢谢。
能帮助很多人?什么意思?呵呵
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-11 22:07:04 | 显示全部楼层
回复【8楼】shilang0304:
---------------------------------
就是有很多有你这个问题的人,可以参考你的答案。
你说的写0X55,顶上来的应该是0XFF,这句话不是很理解。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-9-11 22:13:01 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,我是这样理解的:
根据1楼的说法:SPI是环路数据,后面的进去了才能把前面的“顶”出来。
如果您写的是0XFF,那顶上来的也应该是最上面的数据,也就说,无论你写什么数据,顶上来都应该是最上面的数据,如果顶上来的为0xff为
OK,那也就是说,我写入0x55,顶上来的也应该是0Xff啊!

原子哥,像您说的,就算从0X00试到0xff,就算还有其他的答案,也不理解是怎么回事,
原子哥,能够给解释一下?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-11 22:55:34 | 显示全部楼层
回复【10楼】shilang0304:
---------------------------------
这里所谓顶上来的方法,不太对吧。
这里其实就是2个作用:
1,维持MOSI为高。
2,给SD卡提供时钟,驱动SD卡内部电路工作,传送出应答信号给主机。

你给非0XFF的数据,那么也就是MOSI还有变动,这可能导致与SD卡协议规定的不符(猜测,没具体找),所以就没有有效应答输出了。
所以我要你一个个实验,或者你直接自己找SD卡白皮书,去看是不是有这么个规范。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-9-11 23:08:57 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
恩,有点理解了,谢谢你原子哥。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-12 08:19:56 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
懂了,感谢原子哥解释
回复 支持 反对

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-10-14
在线时间
0 小时
发表于 2013-12-10 23:13:29 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
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;
}    
上面里的while((r1&0X80) && Retry--); 这一句中r1&0X80是什么意思啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-10 23:27:46 | 显示全部楼层
见SD卡2.0白皮书


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-10 23:28:27 | 显示全部楼层
如果不是zero,说明命令响应还没收到,继续等待。
等待超时,则说明此次传输命令失败。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-9-22
在线时间
1 小时
发表于 2014-9-24 14:41:58 | 显示全部楼层
原子哥,就这个问题我还想问一下,发送0XFF
1,持续发送CLK给SD卡这个理解了。
2. 维持MOSI高电平的意义是什么呢? 这个还未理解。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-9-22
在线时间
1 小时
发表于 2014-9-24 14:42:28 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
原子哥,就这个问题我还想问一下,发送0XFF 
1,持续发送CLK给SD卡这个理解了。 
2. 维持MOSI高电平的意义是什么呢? 这个还未理解。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-24 23:11:34 | 显示全部楼层
回复【18楼】o13635133581:
---------------------------------
因为你输出的数据都是1,那么MOSI,是不是一直是1?
一直是1,那是不是维持高电平?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-9-24
在线时间
0 小时
发表于 2014-10-3 15:56:26 | 显示全部楼层
回复【18楼】o13635133581:
---------------------------------
主机给SD卡提供时钟,SD卡才能根据主机发送不同的命令做出相应的响应,0xFF就是提供这个让从机响应的时钟,你提供了时钟剩下的就是硬件做的工作了。当然时间很短,你接下来要做的的应该是针对相应的响应例如R1响应,R3响应,R7响应来读取你需要的SD卡的相关寄存器值,如根据命令不同得到了R1响应,然后可以读到CSD数据 ,CID数据,读取一个块的数据,或者写一个块的数据。又如,你发送CMD58可以获得R3响应,然后你就可以读出OCR寄存器的数据。  用库函数的最终目的还是操作寄存器,所以有些软件层面的知识要弄懂,硬件层面的知识也要明白的差不多。有些东西是硬件操作,所以不是通过一个函数就能明白的,当然了解它的大体意思其实也不妨碍你继续学习。个人愚见,欢迎交流。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-9-22
在线时间
1 小时
发表于 2014-10-9 15:27:43 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
后来搜索了一下,这里也理解了, 还有你的程序我也移植过来成功了。哈哈
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-12
在线时间
1 小时
发表于 2015-2-17 16:32:02 | 显示全部楼层
实在找不到SD卡白皮书中文版,都怪以前没好好学英语,这SD卡学起来好累啊
回复 支持 反对

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
发表于 2015-9-4 20:28:48 | 显示全部楼层
if(cmd==CMD12)SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading
原子大哥这句是什么意思,为什么这么写
回复 支持 反对

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
发表于 2015-9-4 20:30:33 | 显示全部楼层
还有个问题想请教下就是那个CRC值,好像程序中0x87,0x01等,是否crc是自己随便写入的?
回复 支持 反对

使用道具 举报

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-11-17
在线时间
51 小时
发表于 2018-8-17 14:00:56 | 显示全部楼层
学习了,感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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