OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3301|回复: 6

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

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-3-29
在线时间
6 小时
发表于 2017-3-29 14:11:10 | 显示全部楼层 |阅读模式
2金钱
大家好!
我用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协议也不是很懂。

最佳答案

查看完整内容[请看2#楼]

移植一下我们mini板的例程,速度就比较快啊。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-29 14:11:11 | 显示全部楼层
移植一下我们mini板的例程,速度就比较快啊。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-3-29
在线时间
6 小时
 楼主| 发表于 2017-3-29 15:41:45 | 显示全部楼层
补充:
我看了一下变量,发现USB的 bDeviceState 随着插拔很快就会变化,但是有个SD transferEND 的标识会在这十几秒里 在零和一之间变化好多次,似乎是SD 在不停进行数据传输
,这个次数不一定,有时6、7次,有时10来次,这是什么情况?是不是说USB连接上之后,文件系统不停地通过USB接口来读取SD 卡的文件信息?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-3-29
在线时间
6 小时
 楼主| 发表于 2017-3-31 10:17:00 | 显示全部楼层
正点原子 发表于 2017-3-29 20:28
移植一下我们mini板的例程,速度就比较快啊。

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

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

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

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

总结:我推测U盘在USB连接后,文件系统会检测每一个簇的状态是否正常,如果簇划分太小,那么簇的数量就会成倍上升,这个检测时间也会成倍上升,所以盘符就会很长时间才出来。这个只是推测。USB实在不是很懂。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-31 10:27:51 | 显示全部楼层
SD簇一般都是512字节,效率较高~业界通用
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-3-29
在线时间
6 小时
 楼主| 发表于 2017-3-31 10:31:10 | 显示全部楼层
小陀螺爱炒蛋 发表于 2017-3-31 10:27
SD簇一般都是512字节,效率较高~业界通用

512是扇区吧?
也就是块大小。簇大小和扇区不是一个概念好像。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-31 10:40:17 | 显示全部楼层
xy228 发表于 2017-3-31 10:31
512是扇区吧?
也就是块大小。簇大小和扇区不是一个概念好像。

对,是扇区,也就是block,簇是有扇区组成的~感谢纠正,SD在1.X协议的时候block是可以设置的,2.0后都是定死了512字节
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 12:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表