[STM32F4] STM32F429用作 USB 主机经全速集线器接入低速设备时枚举失败

[复制链接]
211|23
east森林 发表于 2026-8-27 17:51 | 显示全部楼层 |阅读模式
我将 STM32F429‑Discovery 开发板配置为 USB 主机。目前已经可以正常驱动多款 HID 设备。
我修改了 ST 主机库,使其支持多设备;同时自行开发了集线器 类驱动,该驱动本身工作正常。只要接在集线器上的全部都是全速设备,整套系统就可以稳定运行。

由于主机与集线器工作在全速模式,我添加了 PREamblePID,用于和 USB 低速设备通信。但出现了一个很奇怪的现象:低速设备的枚举成功率大约只有 50%。一旦低速设备枚举成功之后,后续中断输入通信完全正常,不会出任何问题。
但另外 50% 的场景,把低速设备插到集线器上之后,USB 内核状态机会卡死在枚举流程当中。

我想请教是什么问题?

公羊子丹 发表于 2026-9-3 12:23 | 显示全部楼层
随机50%成功率,很像PreamblePID发送之后的时序间隙没有满足USB规范。DWC2控制器软件手动发PRE码,要保证PRE结束到低速包之间留够全速位间隔,时序差一点就会偶发失败。
周半梅 发表于 2026-9-3 12:25 | 显示全部楼层
我怀疑是hub端口复位流程有坑,低速设备经过hub,端口复位不能直接用主机全局复位,必须下发HUB类的PORT_RESET命令。直接总线复位,会出现设备状态随机不对。
帛灿灿 发表于 2026-9-3 12:26 | 显示全部楼层
提醒下,ST原生USB主机库本身对hub下游低速设备支持就不完善,自己加PRE-PID很容易漏掉错误重传逻辑。枚举失败的时候,最好加上重试机制,重试2-3次再判定设备失联。
童雨竹 发表于 2026-9-3 12:27 | 显示全部楼层
调侃一句,枚举成功之后通信完全正常,这种现象最折磨人。运行没问题,只上电枚举抽风,大多不是业务逻辑,是初始化阶段的时序或者握手细节问题。
万图 发表于 2026-9-3 12:28 | 显示全部楼层
你检查过48MHz USB时钟吗?F429的USB PLL如果使用HSI做源,时钟精度差。时钟微小偏移,经过hub转发之后,低速设备采样出错,就会出现概率性枚举失败。
Wordsworth 发表于 2026-9-3 12:29 | 显示全部楼层
建议有条件拿USB协议分析仪抓枚举波形,重点看失败那几次PRE-PID、SET_ADDRESS这几个关键包。对比成功的波形,一眼就能看出是丢包还是时序不对。
Bblythe 发表于 2026-9-3 12:30 | 显示全部楼层
留意中断处理,USB主机状态机不要被其他高优先级中断打断。枚举流程中间一旦被长时间抢占,hub和低速设备的握手超时,状态机就卡死在半路。
Pulitzer 发表于 2026-9-3 12:30 | 显示全部楼层
想问下,你测试过多款不同品牌全速hub吗?部分廉价集线器对PRE前导码处理兼容性差。换几个hub对比测试,可以区分是自家驱动bug还是hub兼容性问题。
Uriah 发表于 2026-9-3 12:32 | 显示全部楼层
有个踩坑点,切换低速通信模式之后,访问完低速设备,记得切回全速模式。如果状态没有正确复原,下一次枚举流程上来直接错乱,表现就是概率性失败。
Clyde011 发表于 2026-9-3 12:33 | 显示全部楼层
可以做个简单实验,把失败卡死的状态下,软件主动触发一次hub端口断电再上电。如果复位之后大概率枚举成功,基本指向端口初始化时序或者握手超时问题。
classroom 发表于 2026-9-3 13:04 | 显示全部楼层
你只说了全速集线器下插低速设备会卡死,但没说明卡死在哪一步,是获取设备描述符超时还是设置地址失败,这个信息很关键。
cr315 发表于 2026-9-3 15:16 | 显示全部楼层
PREamblePID 只是让全速主机能发出低速包,但集线器本身在转发低速事务时对帧起始包和时序有严格要求,你的集线器驱动可能没正确处理分帧间隔。
duo点 发表于 2026-9-3 17:10 | 显示全部楼层
50% 的成功率强烈暗示是竞争条件或超时窗口问题,比如主机在发送低速事务前没有等待足够长的总线空闲时间,导致低速设备没准备好响应。
flycamelaaa 发表于 2026-9-3 18:48 | 显示全部楼层
ST 官方主机库原本就不原生支持通过集线器接入低速设备,你修改后的调度逻辑可能没有在每次低速传输前重新设置集线器的端口速度和前导使能位。
jcky001 发表于 2026-9-3 20:26 | 显示全部楼层
枚举失败时,你有没有检查集线器端口状态变化的中断?低速设备插入后,集线器会报告速度检测结果,如果驱动读取该状态的时间点不对,后续事务就会错配速度。
onlycook 发表于 2026-9-3 21:59 | 显示全部楼层
全速集线器对低速设备使用事务翻译器,但你的集线器驱动是自行开发的,可能没有正确实现TT的调度机制,尤其是低速批量或控制传输的拆分处理。
powerantone 发表于 2026-9-4 10:07 | 显示全部楼层
卡死在枚举流程中,很可能是因为主机发送了SETUP令牌后,集线器没有正确将响应数据从低速设备转换回全速握手,导致主机一直等待事务完成超时。
probedog 发表于 2026-9-4 11:45 | 显示全部楼层
你提到“多设备支持”是自己改的,那原本的主机库只管理单个设备,你修改后的设备列表和端点分配可能在低速设备枚举失败时没有正确释放资源,造成死锁。
solty 发表于 2026-9-4 13:17 | 显示全部楼层
供电问题也要考虑,低速设备功耗通常很小,但插入瞬间的浪涌电流如果导致集线器端口电压跌落,会触发端口复位异常,而你的驱动可能没有重试机制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

804

帖子

0

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