我正在使用带有 STM32_USB-FS-Device_Lib_V3.2.1 USB 库的 STM32F105 微控制器,并为我们的目的调整了 VCP 示例(与 RTOS 和串行 API 集成)。
问题是,如果连接了 USB 电缆,但 Windows 主机上的端口未打开,几分钟后设备最终会永久重新进入 USB ISR,直到端口打开,然后一切都开始正常工作。
我已经检测了中断处理程序,可以看到当故障发生时,ISR 处理程序退出,然后立即重新进入。这是因为从中断退出时,OTG_FS_GINTSTS 中的 IEPINT 标志不明确。此时的 OTG_FS_DAINT 包含 0x00000002(IEPINT1 设置),而 DIEPINT1 包含 0x00000080(TXFE)。调用 OTGD_FS_Handle_InEP_ISR() 中清除 TXFE 的行,但该位要么不清除,要么立即重新置位。当主机上的 COM 口重新打开时,中断结束时 OTG_FS_GINTSTS 和 OTG_FS_DAINT 的状态始终为零,进一步的中断以正常速率发生。请注意,仅当正在输出数据但主机没有打开端口时才会出现此问题。如果端口打开或没有数据输出,系统将无限期运行。
VCP 代码有一个状态变量,它采用以下枚举值:
UNCONNECTED,
ATTACHED,
POWERED,
SUSPENDED,
ADDRESSED,
CONFIGURED
我们使用 CONFIGURED 状态来决定是否将数据放入驱动缓冲区进行发送。然而,当连接电缆时设置 CONFIGURED 状态,而不是在主机打开端口并连接应用程序时设置。我看到当 Windows 确实打开端口时,会出现一连串中断,因此似乎在此事件上发生了一些通信;我想知道是否有可能因此检测主机是否打开了端口。
我可能需要两件事之一:
- 防止 USB 代码一开始就卡在 ISR 中
- 从设备端判断主机是否打开了端口,打开时才推送数据发送。