大家好!
我用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协议也不是很懂。
问题算是找到了,原因很囧!
主要原因是我格式化的时候簇选择得太小。
我用抓包工具分析了一下正常U盘和我的设备的区别,发现U盘在USB 枚举成功之后,还会有很多次读命令,我不是很了解USB协议的命令集,所以不知道host端具体在读什么,但是次数是和簇的单元划分有关的,分的越大块,读得次数就越少。2K->64K 后,抓包得到的通信数据从1W5千多行下降到2千多行。
我的问题应该是单元划分太小,导致这个读过程很长,加上我自己的设备USB每次通信都比正常U盘要慢一些,两个叠加导致接近20秒的延时。
我把单元划分从2K提高到64K,盘符弹出的这个时间就缩短到1秒以内了。
总结:我推测U盘在USB连接后,文件系统会检测每一个簇的状态是否正常,如果簇划分太小,那么簇的数量就会成倍上升,这个检测时间也会成倍上升,所以盘符就会很长时间才出来。这个只是推测。USB实在不是很懂。
一周热门 更多>