[STM32F4] STM32F4 USB OTG 全速模式大容量存储

[复制链接]
85|26
故里说长安 发表于 2026-9-19 11:11 | 显示全部楼层
你提到 usb-host-device_lib_v2.1.0,这个库的 MSC Device 示例是给探索板写的,探索板用的是 OTG_FS 控制器。你把代码移植到 STM3220G-EVAL 上,但 STM3220G 的 OTG_FS 引脚可能和探索板不一样,需要确认板子上 OTG_FS 的 DP/DM 是否真的引到了 USB 座。
海滨消消 发表于 2026-9-19 12:35 | 显示全部楼层
有一个容易被忽略的点:OTG_HS 内核跑在 FS 模式下时,端点最大包长必须从 512 改成 64。如果你用的是 HS 内核的 FS 模式,usbd_conf.h 里 MSC_MAX_PACKET 或类似宏如果还是 512,枚举阶段就会因为端点尺寸协商失败而报 code 10。
甜心puppy 发表于 2026-9-19 14:02 | 显示全部楼层
你用的 usb-host-device_lib_v2.1.0 是 ST 的老库,这个库配套的 MSC 示例默认是按 HS 模式配置的。如果你的板子只支持 FS,在 usbd_conf.h 里检查 USE_USB_OTG_HS 和 USE_USB_OTG_FS 的定义是否和实际硬件一致,定义错了会导致底层驱动的时钟和 FIFO 配置全错。
等凌晨日出 发表于 2026-9-19 15:09 | 显示全部楼层
调试打印能到 USB_device_configured 说明控制传输和描述符交互没问题,问题大概率出在 BOT 协议层。MSC 设备枚举成功后,主机会发 CBW,设备需要回 CSW,如果 usbd_msc_bot.c 里的状态机卡在某个状态没推进,主机等超时后就复位设备。
茉璃夏 发表于 2026-9-19 17:19 | 显示全部楼层
关于 SD 卡侧,你在 USB_device_configured 之后没有看到任何 SD 读取的打印,说明 MSC 的 SCSI 处理层根本没被调用。检查 usbd_msc_scsi.c 里的 SCSI_ReadCapacity 和 SCSI_Read10 函数有没有被正确链接进去,老库的工程配置有时会漏掉这些文件。
豌豆爹 发表于 2026-9-19 19:30 | 显示全部楼层
STM3220G 用 HS 外设能工作,说明问题不在 SD 卡和 FatFS,而在 FS 模式下的 USB 底层配置。FS 和 HS 在 FIFO 分配、端点缓冲策略上差异很大,直接照搬 HS 的配置参数到 FS 模式大概率跑不起来。
进入猫次元 发表于 2026-9-19 20:45 | 显示全部楼层
Win11 对 USB MSC 设备的枚举行为比 Win10 更严格,有些在 Win10 下勉强能识别的设备在 Win11 下会直接报 code 10。如果你手头有 Win10 机器,可以插上去对比一下,看是否枚举结果不同,这能帮助判断是协议层问题还是兼容性问题。
麻花油条 发表于 2026-9-19 22:30 | 显示全部楼层
检查 usbd_storage.c 或 usbd_msc_storage.c 里的 STORAGE_GetCapacity 和 STORAGE_Read 函数返回值。如果这些函数在 FS 模式下因为 SD 卡初始化时序问题返回了错误值,主机会认为设备容量为零,从而拒绝挂载驱动并报 code 10。
elephant00 发表于 2026-9-17 15:31 | 显示全部楼层
有一种可能性是 VBUS 检测引脚的问题。STM3220G-EVAL 和 STM3210C-EVAL 的 USB 座可能带有 VBUS 检测电路,如果 usbd_conf.c 里的 VBUS 检测回调返回了错误状态,USB 库会在 USB_device_configured 之后主动触发一次 reset 来重新协商,这和你打印里看到的第二个 reset 现象吻合。
才没有脸红 发表于 2026-9-18 15:10 | 显示全部楼层
如果折腾老库 usb-host-device_lib_v2.1.0 太久没进展,可以考虑换到 STM32Cube 的 USB Device 中间件,Cube 版本的 MSC 设备栈对 FS 模式的支持更规范,usbd_conf.h 里的宏定义和时钟配置都有 CubeMX 帮忙生成,不容易出现手动配置遗漏。
云上漫步 发表于 2026-9-18 12:29 | 显示全部楼层
全速模式要注意DP/DM引脚上拉配置,检查软件设置是否正确,可能硬件上缺少上拉或软件未使能内部上拉。
MessageRing 发表于 2026-9-20 09:54 | 显示全部楼层
检查MSC类初始化端点配置,确保端点0是控制端点,端点1是MSC数据端点,同时确认USB_OTG_FS的DP/DM引脚上拉配置正确。可以考虑更换晶振调整时钟精度,看是否能解决问题。
pixhw 发表于 2026-10-1 20:52 | 显示全部楼层
USB MSC设备需在枚举时读取SD卡信息,确保SD卡初始化在USB设备初始化之前完成。
bestwell 发表于 2026-10-4 11:35 | 显示全部楼层
替代Clive示例,CubeMX示例移植注意事项?
cashrwood 发表于 2026-10-4 17:56 | 显示全部楼层
选择“USB Device → MSC”配置,自动生成包含SDIO和USB联动的完整工程,对比您当前代码的差异;
mmbs 发表于 2026-10-5 17:24 | 显示全部楼层
USB枚举失败的具体错误码是什么?
earlmax 发表于 2026-10-6 13:54 | 显示全部楼层
最稳妥、高效且免费的方案?              
chenci2013 发表于 2026-10-6 19:25 | 显示全部楼层
先加上详细的调试打印,看看主机到底有没有调用 STORAGE_GetCapacity() 和 STORAGE_IsReady()
usysm 发表于 2026-10-6 20:23 | 显示全部楼层
通过STM32F4的以太网接口,将SD卡文件通过TFTP/FTP协议共享,避免USB OTG_FS的限制。
robincotton 发表于 2026-10-7 11:17 | 显示全部楼层
表明USB设备在枚举过程中反复重置,可能是配置阶段失败后触发的恢复机制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部