You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义STM32F103 USB驱动:设置地址后无后续数据包求助

STM32F103自主编写USB驱动:SET ADDRESS后无后续请求问题排查

针对你遇到的问题,结合STM32F103 USB内核的硬件特性,给出以下排查和解决要点:

  • 严格遵循SET ADDRESS的生效时机
    STM32F1的USB硬件不允许在收到SET ADDRESS请求后立即写入D_ADDR寄存器。正确的操作流程是:

    1. 收到SET ADDRESS请求时,先将Wvalue字段中的地址值暂存到变量中
    2. 发送零长度IN响应包给主机
    3. 等待USB中断触发,确认该IN包已被主机ACK(检查ISTR寄存器的INTR标志,以及端点0的EP0R寄存器中的TX_STAT状态)
    4. 确认ACK后,再将暂存的地址写入D_ADDR寄存器
      提前修改地址会导致主机用新地址发送后续请求时,设备仍处于默认地址接收状态,从而丢失数据包。
  • 检查USB状态机与中断处理
    SET ADDRESS完成后,需确保设备从「默认地址状态」正确切换到「地址状态」:

    • 及时清除ISTR寄存器中的所有未处理中断标志,避免中断阻塞导致状态机停滞
    • 确认CNTR寄存器的中断使能配置正确,尤其是端点0的IN/OUT中断未被禁用
  • 验证端点0的缓冲区与状态配置

    • 确认USB RAM的端点0缓冲区划分正确(STM32F1的USB RAM起始地址为0x40006000,端点0的IN/OUT缓冲区通常各分配64字节)
    • 在SET ADDRESS完成后,重置端点0的EP0R寄存器状态,确保IN/OUT端点处于就绪状态,能接收主机的后续请求
  • 处理第二次复位后的状态初始化
    主机发送SET ADDRESS前的第二次复位,需重新初始化USB的端点状态、中断标志等(暂存的地址信息除外),避免上一次通信的残留状态干扰后续流程

内容的提问来源于stack exchange,提问作者Nguyễn Nam-LRMT15-3N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:22:14