关于USB接口+SD卡的问题求助

2019-08-23 15:02发布

大家好!
我用STM32 103 的片子做一个测量小设备,因为需要存储测量的数据,所以用了SD 卡,并且用了FATFS文件系统,然后用USB接口读取数据到PC分析。
USB和SD的程序都是在官方给的程序上改的。

现在的问题是这样:
之前存数据到4G之后,USB连接后显示盘没有格式化,我搜索了一下,在论坛里找到了解决办法,是要修改文件系统和SD读写函数的参数类型,把 uint32_t 的 addr 参数改成 uint64_t  类型。这样就可以访问4G以上的地址了。
但是自从出了这个问题,我重新格式化SD卡之后,每次连接电脑USB就非常慢,需要至少17、8秒盘符才会出现,而以前基本都是秒出的。

我试了下U盘,都是好的,设备换在另外的电脑上也是很慢,这就说明是我这个设备出了问题。可是我程序除了那个参数类型外都没有改,为什么现在USB枚举过程(这个应该是枚举过程吧)这么长?我把参数改回去试过,也依然很慢,请教大家,这可能是什么原因?应该怎么追踪?

PS:我USB协议基本不懂,只了解一个大概过程。SD协议也不是很懂。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-08-23 15:44
 精彩回答 2  元偷偷看……
xy228
2楼-- · 2019-08-23 19:57
补充:
我看了一下变量,发现USB的 bDeviceState 随着插拔很快就会变化,但是有个SD transferEND 的标识会在这十几秒里 在零和一之间变化好多次,似乎是SD 在不停进行数据传输
,这个次数不一定,有时6、7次,有时10来次,这是什么情况?是不是说USB连接上之后,文件系统不停地通过USB接口来读取SD 卡的文件信息?
xy228
3楼-- · 2019-08-24 01:40
正点原子 发表于 2017-3-29 20:28
移植一下我们mini板的例程,速度就比较快啊。

问题算是找到了,原因很囧!

主要原因是我格式化的时候簇选择得太小。

我用抓包工具分析了一下正常U盘和我的设备的区别,发现U盘在USB 枚举成功之后,还会有很多次读命令,我不是很了解USB协议的命令集,所以不知道host端具体在读什么,但是次数是和簇的单元划分有关的,分的越大块,读得次数就越少。2K->64K 后,抓包得到的通信数据从1W5千多行下降到2千多行。

我的问题应该是单元划分太小,导致这个读过程很长,加上我自己的设备USB每次通信都比正常U盘要慢一些,两个叠加导致接近20秒的延时。
我把单元划分从2K提高到64K,盘符弹出的这个时间就缩短到1秒以内了。

总结:我推测U盘在USB连接后,文件系统会检测每一个簇的状态是否正常,如果簇划分太小,那么簇的数量就会成倍上升,这个检测时间也会成倍上升,所以盘符就会很长时间才出来。这个只是推测。USB实在不是很懂。
小陀螺爱炒蛋
4楼-- · 2019-08-24 03:45
SD簇一般都是512字节,效率较高~业界通用
xy228
5楼-- · 2019-08-24 07:06
小陀螺爱炒蛋 发表于 2017-3-31 10:27
SD簇一般都是512字节,效率较高~业界通用

512是扇区吧?
也就是块大小。簇大小和扇区不是一个概念好像。
小陀螺爱炒蛋
6楼-- · 2019-08-24 07:38
 精彩回答 2  元偷偷看……

一周热门 更多>