OpenEdv-开源电子网

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

论坛有人成功在STM32F103RDT6上,使用SDIO的DMA对TF卡进行写多块操作吗?

[复制链接]

16

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-8-21
在线时间
14 小时
发表于 2017-5-18 09:59:30 | 显示全部楼层 |阅读模式
20金钱
问题:STM32F103RDT6,SDIO使用DMA对TF卡进行写多块,DMA使用SD_CMD_WRITE_MULT_BLOCK写完2个块(1024字节,每块512字节),并发送完SD_CMD_STOP_TRANSMISSION命令后,再次发送任何一条命令(包括第二次写1024字节的SD_CMD_WRITE_MULT_BLOCK命令),TF卡的D0管脚都会突然从原来的高被卡拉成低,

没发命令前是高的,发完就立刻变低,这就意味着卡变成忙了,然后后面的数据块都无法继续传输下去,紧急求解!!

最佳答案

查看完整内容[请看2#楼]

之前的回复你都没有认真看,里面讲的很清楚了。 在你写完1024字节的时候,SD卡变忙是正常的,你要等待它从忙退出。用CMD13就可以查询卡的状态,判断它是不是从忙状态退出,你用单块写也是一样。 你成功的原因要不是你等了很长时间,要不就是单块写的函数中自带了查询卡从忙状态退出的命令。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-5-18 09:59:31 | 显示全部楼层
之前的回复你都没有认真看,里面讲的很清楚了。

在你写完1024字节的时候,SD卡变忙是正常的,你要等待它从忙退出。用CMD13就可以查询卡的状态,判断它是不是从忙状态退出,你用单块写也是一样。
你成功的原因要不是你等了很长时间,要不就是单块写的函数中自带了查询卡从忙状态退出的命令。
回复

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2017-5-18 18:02:25 | 显示全部楼层
我记得多块写这样不行,因为sd卡多块每写一块,有一个busy状态,需要写完一块再写下一块,多块写实际就是连续单块写的意思,不知道对不对啊  这是我自己总结的
回复

使用道具 举报

16

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-8-21
在线时间
14 小时
 楼主| 发表于 2017-5-18 18:47:04 | 显示全部楼层
ljz1987cj 发表于 2017-5-18 18:02
我记得多块写这样不行,因为sd卡多块每写一块,有一个busy状态,需要写完一块再写下一块,多块写实际就是连 ...

SD协议都有说SD卡是可以写多块的啊,等待它不busy再写第二个512块,我测试了也不行啊,只要连续写完两个512的block,再给个停止传输命令,D0瞬间就从1拉成0,一直起不来
回复

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2017-5-18 19:28:56 | 显示全部楼层
zxa123456 发表于 2017-5-18 18:47
SD协议都有说SD卡是可以写多块的啊,等待它不busy再写第二个512块,我测试了也不行啊,只要连续写完两个5 ...

可以写多块啊 我的意思是连续的写 不是1024一起丢进去dma,发送512完,等待busy完,再丢512,再停止传输
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-5-18 19:45:46 | 显示全部楼层
MCU我没用过,但可以在SD协议上给你一些思路。

使用了多块写,不等于发了命令之后就可以一直往里面写了,它有一个busy状态,这个状态会通过data0线来体现。
在正常情况下,data0线是拉高的,当传输完一个block之后,data0线会拉低一段时间,当它再次拉高时,表示可以继续往里写数据。
对于正版的卡,在首次传输完一个block即512字节时,data0线会拉低1ms左右的时间(实测了四种厂家的卡,包括闪迪、东芝、三星,速度为class10,数值仅供参考)。
在你传输完数据之后,你要发送结束命令,CMD12,收到正确回应之后表示这一次传输结束。
但是这个时候你还要注意一个地方,在结束传输之后,SD卡不会立马从prgmstate退出,这个时候如果你使用CMD7命令,SD卡将无法响应,从而产生错误,可能导致你接下来的所有对SD卡的操作失效。
要查询SD卡是否从prgmstate退出,可以通过CMD13命令,这个命令是用来查询SD卡当前的状态。

到目前为止也使用过几种MCU的SDIO控制器,基本上它们的DMA都有自动判断DAT0是否处于忙状态的功能,所以可能是你的命令设置上出了一些问题。

回复

使用道具 举报

16

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-8-21
在线时间
14 小时
 楼主| 发表于 2017-5-18 21:54:01 | 显示全部楼层
ljz1987cj 发表于 2017-5-18 19:28
可以写多块啊 我的意思是连续的写 不是1024一起丢进去dma,发送512完,等待busy完,再丢512,再停止传输

你还没懂我意思..,我是1024两个连续块都传输成功,就是在使用停止多块传输命令时,TF卡才会变忙,不使用该命令不会忙
回复

使用道具 举报

16

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-8-21
在线时间
14 小时
 楼主| 发表于 2017-5-19 00:23:07 | 显示全部楼层
ljz1987cj 发表于 2017-5-18 19:28
可以写多块啊 我的意思是连续的写 不是1024一起丢进去dma,发送512完,等待busy完,再丢512,再停止传输

有没有这部分的代码,发我一份,确保你测试写多块通过的。1095696200@qq.com
回复

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2017-5-19 14:26:04 | 显示全部楼层
zxa123456 发表于 2017-5-19 00:23
有没有这部分的代码,发我一份,确保你测试写多块通过的。,

没有  之前也有碰到类似的情况 后来我改成了连续单块写  没用多块写
回复

使用道具 举报

16

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-8-21
在线时间
14 小时
 楼主| 发表于 2017-5-31 22:14:33 | 显示全部楼层
确实,忘了在写之前等待卡不忙
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-20 16:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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