本帖最后由 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,用这个应该可以搞定了吧。 |