IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 解决STM32虚拟U盘枚举过慢的问题 -> 正文阅读

[嵌入式]解决STM32虚拟U盘枚举过慢的问题

1、最近在一个项目中使用STM32虚拟U盘功能,外接SPI flash,连接到电脑上面后虚拟出一个U盘出来,软件使用RT thread的usb device, mass storte大容量存储设备。代码移植很简单,使用menuconfig打开设置一下。


2、这个代码在测试过程中发现U盘枚举过长,通过增加打印信息观察到如下:

msh />message type 5 reset the port
reset 0
message type 0 ?请求设备描述符:80 06 00 01 00 00 40 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0040
]
_get_device_descriptor
message type 2 ? ep0 out notify
message type 5 ? reset
reset 0
message type 0 ? set address 00 05 3d 00 00 00 00 00?
[
? setup_request : 0x00
? request ? ? ? : 0x05
? value ? ? ? ? : 0x003d 设备地址00 3d
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0000
]
_set_address
message type 0 ? 获取设备描述符 80 06 00 01 00 00 12 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0012 ?设备描述符长度
]
_get_device_descriptor
message type 2
message type 0 ? ?获取配置描述符 80 06 00 02 00 00 ff 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0200 ? 0x02获取配置描述符
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x00ff
]
_get_config_descriptor
message type 2
message type 0 ? ?获取字符串描述符 80 06 03 03 09 04 ff 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0303 ?0x03 获取字符串描述符 ?index:03 获取03位置的字符串,即是320219198301
? index ? ? ? ? : 0x0409 ?语言ID
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
message type 2
message type 0 ? ?获取字符串描述符 80 06 00 03 00 00 ff 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0300 ? 0x03 获取字符串描述符 ?index:00 ?获取语言ID, 返回04 03 09 04
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
message type 2
message type 0 ? ?获取字符串描述符 80 06 02 03 09 04 ff 00
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0302 ? 0x03 获取字符串描述符 ?index:02 ?获取03位置的字符串,即是RTT Composite Device
? index ? ? ? ? : 0x0409
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
message type 2
message type 0 ? ?获取设备限定描述符 80 06 00 06 00 00 0A 00 ?全速设备不响应此请求
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0600 06:设备限定描述符
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x000a
]
这里会有5秒时间
message type 0
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0012
]
_get_device_descriptor
message type 2
message type 0
[
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0200
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0009
]
_get_config_descriptor



? ? ? 根据以上打印信息发现,主机会获取设备限定描述符,对于STM32虚拟U盘来说是全速设备,端点0回复STALL即可,可是这里产生了较长时间的等待,大约5秒,就是这5秒导致U盘枚举过慢。

3、解决办法
? ? ? 通过查看处理设备限定描述符的代码,对比ST 虚拟U盘示例程序代码分析,在对端点0的STALL处理不一样,修改如下,增加对IN端点0的处理:

?

4、再次测试枚举过程,这个5秒的延时没有了,枚举变快了。

usb reset:111.287s
usb connect:111.288s
message type 5
reset 0
message type 6
usb reset:111.675s
message type 5
reset 1
usb ep0_setup_handler:111.712s
message type 0
[time:111.716
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0040
]
_get_device_descriptor
usb ep0 data in stage:111.730s
message type 2
usb reset:111.751s
message type 5
reset 0
usb ep0_setup_handler:111.787s
message type 0
[time:111.791
? setup_request : 0x00
? request ? ? ? : 0x05
? value ? ? ? ? : 0x0021
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0000
]
usb ep0 data in stage:111.804s
_sb ep0 data usb ep0_setup_handler:111.815s
message type 0
[time:111.819
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0012
]
_get_device_descriptor
usb ep0 data in stage:111.833s
message type 2
usb ep0_setup_handler:111.838s
message type 0
[time:111.842
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0200
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x00ff
]
_get_config_descriptor
usb ep0 data in stage:111.857s
usb ep0_setup_handler:111.859s
message type 2
message type 0
[time:111.865
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0303
? index ? ? ? ? : 0x0409
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.880s
usb ep0_setup_handler:111.882s
message type 2
message type 0
[time:111.888
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0300
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.902s
usb ep0_setup_handler:111.905s
message type 2
message type 0
[time:111.911
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0302
? index ? ? ? ? : 0x0409
? length ? ? ? ?: 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.926s
usb ep0_setup_handler:111.928s
message type 2
message type 0 ? 处理获取设备限定描述符操作
[time:111.934
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0600
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x000a
]
EP0 stall set ?不响应读取设备限定描述符, 这里和下面的请求设备描述符时间只有70ms间隔了,枚举变快了。
usb ep0_setup_handler:111.953s
message type 0
[time:111.957
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0100
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0012
]
_get_device_descriptor
usb ep0 data in stage:111.972s
usb ep0_setup_handler:111.975s
message type 2
message type 0
[time:111.980
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0200
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0009
]
_get_config_descriptor
usb ep0 data in stage:111.995s
usb ep0_setup_handler:111.998s
message type 2
message type 0
[time:112.003
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0200
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0020
]
_get_config_descriptor
usb ep0 data in stage:112.18s
usb ep0_setup_handler:112.20s
message type 2
message type 0
[time:112.026
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0300
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0002
]
_get_string_descriptor
usb ep0 data in stage:112.41s
usb ep0_setup_handler:112.43s
message type 2
message type 0
[time:112.049
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0300
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0004
]
_get_string_descriptor
usb ep0 data in stage:112.63s
usb ep0_setup_handler:112.66s
message type 2
message type 0
[time:112.071
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0303
? index ? ? ? ? : 0x0409
? length ? ? ? ?: 0x0002
]
_get_string_descriptor
usb ep0 data in stage:112.86s
usb ep0_setup_handler:112.89s
message type 2
message type 0
[time:112.094
? setup_request : 0x80
? request ? ? ? : 0x06
? value ? ? ? ? : 0x0303
? index ? ? ? ? : 0x0409
? length ? ? ? ?: 0x001a
]
_get_string_descriptor
usb ep0 data in stage:112.109s
usb ep0_setup_handler:112.112s
message type 2
message type 0
[time:112.117
? setup_request : 0x00
? request ? ? ? : 0x09
? value ? ? ? ? : 0x0001
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0000
]
_set_config
rt_usbd_set_config
rt_usbd_find_config
Mass storage function enabled
usb ep0 data in stage:112.137s
usb ep0_setup_handler:112.140s
message type 0
[time:112.144
? setup_request : 0xa1
? request ? ? ? : 0xfe
? value ? ? ? ? : 0x0000
? index ? ? ? ? : 0x0000
? length ? ? ? ?: 0x0001
]
rt_usbd_find_interface
mstorage_interface_handler
USBREQ_GET_MAX_LUN
usb ep0 data in stage:112.163s
message type 2
message type 1
_ep_out_handler 31
ep_out reside 36
_inquiry_cmd
usb ep1 data in stage:112.173s
message type 1
_ep_in_handler
_send_status
usb ep1 data in stage:112.180s
message type 1
_ep_in_handler
return to cbw status
message type 1
_ep_out_handler 31
ep_out reside 36
_inquiry_cmd
usb ep1 data in stage:112.193s
message type 1
_ep_in_handler
_send_status
usb ep1 data in stage:112.200s


?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:35:27  更:2022-04-01 23:35:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:24:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码