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

2019-08-17 10:09发布

问题: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管脚都会突然从原来的高被卡拉成低,

没发命令前是高的,发完就立刻变低,这就意味着卡变成忙了,然后后面的数据块都无法继续传输下去,紧急求解!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
JUSTNIUB
1楼-- · 2019-08-17 12:55
 精彩回答 2  元偷偷看……
ljz1987cj
2楼-- · 2019-08-17 18:23
我记得多块写这样不行,因为sd卡多块每写一块,有一个busy状态,需要写完一块再写下一块,多块写实际就是连续单块写的意思,不知道对不对啊  这是我自己总结的
zxa123456
3楼-- · 2019-08-17 23:27
ljz1987cj 发表于 2017-5-18 18:02
我记得多块写这样不行,因为sd卡多块每写一块,有一个busy状态,需要写完一块再写下一块,多块写实际就是连 ...

SD协议都有说SD卡是可以写多块的啊,等待它不busy再写第二个512块,我测试了也不行啊,只要连续写完两个512的block,再给个停止传输命令,D0瞬间就从1拉成0,一直起不来
ljz1987cj
4楼-- · 2019-08-18 03:15
zxa123456 发表于 2017-5-18 18:47
SD协议都有说SD卡是可以写多块的啊,等待它不busy再写第二个512块,我测试了也不行啊,只要连续写完两个5 ...

可以写多块啊 我的意思是连续的写 不是1024一起丢进去dma,发送512完,等待busy完,再丢512,再停止传输
JUSTNIUB
5楼-- · 2019-08-18 08:04
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是否处于忙状态的功能,所以可能是你的命令设置上出了一些问题。

zxa123456
6楼-- · 2019-08-18 13:32
 精彩回答 2  元偷偷看……

一周热门 更多>