论坛有人成功在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
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是否处于忙状态的功能,所以可能是你的命令设置上出了一些问题。

一周热门 更多>