打印

stm32 sdio MultiBlockRead问题

[复制链接]
4784|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2012-1-30 02:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ck, IO, Multi, sd
本帖最后由 Simon21ic 于 2012-1-30 02:32 编辑

正在用stm32做一个SDIO的TF卡读卡器,初始化和读写都没有问题,只是发现一个驱动时序问题,不知道用stm32是否可以解决。

应用前提:
1. 目前的读卡器驱动时序,USB部分是全状态机实现(因为实现了2个CDC,一个多LUN的MSC和一个HID,需要同时操作),所以要求SD卡得驱动也都是非阻塞操作。
2. USB的MSC驱动,使用了2个512字节的缓冲(只能使用这么多),实现tick-tock操作。
比如:主机发送读取16个512字节block操作(总共8K数据),设备发现需要执行读取操作(必须使用MultiBlockRead),并且2个缓冲至少有一个为空,则读取512字节(非阻塞读取)。

问题是,读取第一个和第二个512字节的block没有问题,因为缓冲可用,但是,如果USB速度太慢,导致没有缓冲用的时候,就会有问题。因为SDIO模块读取开启后,无法停止,所以SDIO一直在接收数据,由于缓冲不可用,最后的结果就是SDIO的fifo溢出,数据丢失。写入部分也有类似问题,会使得FIFO空。

是否可以设置SDIO-> POWER来让SDIO停止输出时钟,等到缓冲可用的时候,再继续输出?
并且,从FIFO读取,到停止SDIO时钟之间接收到的数据,仍旧保留在SDIO的FIFO中。
也就是说,对SDIO-> Power的操作来控制SDIO输出时钟,是否可以保持SDIO总线的完整性?

或者,用MultiBlockRead和MultiBlockWrite实现SD读卡器(主机会发送一些读写大块数据,超过实际可用的内存),有什么建议?

突然发现有HW Flow Control,用这个应该可以搞定了吧。
沙发
Simon21ic|  楼主 | 2012-1-30 04:39 | 只看该作者
不会吧,调了2个半小时,发现奇怪的DCRCFAIL一直搞不定,查了才发现貌似是芯片BUG:
When HW Flow Control is enabled by setting bit 14 of SDIO_CLKCR register, some glitches can occur on the SDIO_CK output clock resulting in wrong data being written in the SD/MMC Card or the SDIO device. As consequence a data CRC error is reported to the SD/SDIO MMC host interface (DCRCFAIL bit in the SDIO_STA register is set).

Workaround None. HW Flow Control must not be used. Software has to manage Overrun Errors (Rx mode) and FIFO underrun (Tx mode).

HW Flow Control是不能用的?

使用特权

评论回复
板凳
quqw| | 2012-3-6 09:57 | 只看该作者
兄弟,我也遇到了DCRCFAIL一直搞不定,以上的英文说明你是从哪里看到的?手册上面没找到。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝