STM32F446ZE USB设备ENUMDNE中断异常问题求助
STM32F446ZE USB设备ENUMDNE中断异常问题排查方向
以下是针对你遇到的ENUMDNE中断未按预期触发、软复位误触发该中断问题的具体排查点:
ENUMDNE中断使能时机或配置错误
检查OTG_FS_GINTMSK寄存器是否在正确阶段使能了ENUMDNE中断位。按照RM0390要求,应在USB复位(USBRST)处理完成后,重新初始化端点、清除地址配置后,再次使能ENUMDNE中断。若仅在初始化阶段一次性使能,USBRST中断触发后可能因模块状态重置导致中断使能位被清除,后续无法触发ENUMDNE。SET_ADDRESS请求处理不规范
ENUMDNE中断的触发条件是设备成功响应SET_ADDRESS请求并完成地址设置。需确认:- 是否在收到SETUP包中的SET_ADDRESS请求后,正确将地址值写入
OTG_FS_DCFG寄存器的DADR位; - 是否向主机返回了ACK响应;
- 地址设置完成后是否更新了设备状态机至已枚举状态。
若以上步骤缺失,主机端枚举流程未完成,ENUMDNE中断不会触发;而软复位时模块状态异常,可能触发残留的中断标志。
- 是否在收到SETUP包中的SET_ADDRESS请求后,正确将地址值写入
USBRST中断处理流程不完整
USB复位中断触发后,必须严格执行RM0390规定的重置流程:- 清除USBRST中断标志;
- 重置设备状态机至默认状态;
- 清空所有端点的传输状态、配置;
- 重新配置端点0为双向控制端点;
- 重新使能ENUMDNE、SETUP等必要中断;
- 清零
OTG_FS_DCFG中的DADR位(清除之前的地址配置)。
若跳过上述任意步骤,模块可能处于异常状态,无法正确处理后续枚举流程。
OTG_FS_GCCFG寄存器配置遗漏
强制设备模式下,需确保GCCFG寄存器的以下配置正确:- 启用内部FS PHY(设置
PHYSEL位,F446内置FS PHY); - 根据硬件配置设置VBUS检测相关位(即使外部没有VBUS,也需确保模块不会因VBUS状态异常进入错误状态);
- 确认
OTG_FS_GCCFG中的PWRDWN位未置1(避免PHY断电)。
若PHY未正确启用,即使逻辑分析仪能捕获到SETUP包,OTG模块也无法正确解析并处理。
- 启用内部FS PHY(设置
端点0初始化错误
端点0作为控制端点,必须严格配置为:- 双向端点(同时配置IN和OUT方向);
- 最大包长设置为64字节(全速设备默认值);
- 端点状态设置为ENABLED。
若端点0配置错误(如仅设置单方向、包长不符),主机的SETUP包无法被正确接收和响应,枚举流程卡住,ENUMDNE中断无法触发。
OTG_FS_DCTL寄存器配置异常
检查DCTL寄存器的SIGNAL_FUNC位是否在初始化时正确设置,确保模块能正常发送USB信号。另外,USBRST中断触发后,需重置DCTL中的相关控制位,避免残留状态影响后续枚举流程。软复位时设置SDIS位触发ENUMDNE,大概率是因为模块状态机残留了之前未处理的枚举相关标志,软复位触发了标志的释放。
内容的提问来源于stack exchange,提问作者Toun
相关产品推荐
相关产品推荐

