2. USB设备状态机:USB设备状态详解

USB协议定义了一套严格的状态机,用于管理设备从连接到配置完成的完整生命周期。理解这六个核心状态——Attached、Powered、Default、Address、Configured、Suspended——是进行枚举故障排查的基础。每个状态都对应着总线上的特定电气特征和主机-设备交互行为。

核心原则: USB设备状态转换由主机(Host)通过总线事件(如复位、SETUP事务)驱动,设备必须严格遵循状态机规则响应。任何状态跳转失败都会导致枚举中断。
USB设备状态机转换图 USB设备状态机转换图 Attached 设备物理连接 Powered VBUS供电就绪 Default 总线复位完成 Address SET_ADDRESS成功 Configured SET_CONFIG成功 Suspended 总线空闲3ms+ VBUS检测 总线复位 SET_ADDRESS SET_CONFIG 总线空闲3ms 唤醒信号 状态转换关键点 • 状态不可跳跃 • 复位必须在Default完成 • 地址唯一性由主机保证 • 挂起可来自任何状态

2.1 状态定义与转换条件

每个状态都对应设备在USB总线上的特定行为模式。下表总结了各状态的进入条件、电气特征和关键行为:

状态 进入条件 电气/协议特征 设备行为
Attached 设备物理插入USB端口 D+/D-线路上拉电阻生效,主机检测到电平变化 等待VBUS稳定,准备响应复位
Powered VBUS电压稳定(4.4V~5.25V) 设备从VBUS取电,最大100mA(枚举前) 内部电路初始化,等待总线复位信号
Default 主机发送总线复位(SE0持续≥10ms) D+/D-被主机驱动为SE0,设备检测到复位 复位后默认地址0,等待SETUP令牌
Address 主机成功发送SET_ADDRESS请求 设备切换到非0地址,主机开始使用新地址通信 存储分配地址,响应后续标准请求
Configured 主机成功发送SET_CONFIGURATION请求 设备按配置描述符启用功能端点 进入功能模式,开始数据传输
Suspended 总线空闲超过3ms 总线进入低功耗状态,设备电流≤2.5mA 暂停数据传输,等待唤醒信号或复位
故障排查提示: 枚举失败时,首先检查设备是否卡在 Default 状态(地址0阶段)。如果主机反复复位但设备不响应SET_ADDRESS,通常表明设备描述符读取失败或设备端点0存在硬件问题。

2.2 状态转换的协议细节

状态转换由主机通过特定的USB事务触发。以下是关键转换的协议级描述:

2.2.1 Attached → Powered

设备插入后,主机通过检测D+/D-线路上的上拉电阻识别设备速度(全速/低速/高速)。VBUS稳定后,设备进入Powered状态。此阶段主机尚未与设备通信。

2.2.2 Powered → Default(总线复位)

主机检测到设备连接后,驱动D+和D-线路为SE0(Single-Ended Zero)状态,持续至少10ms。设备检测到复位信号后,执行以下操作:

  • 将USB地址重置为0(默认地址)
  • 端点0(控制端点)进入就绪状态
  • 清除所有配置和端点设置
// 主机复位时序(逻辑分析仪捕获示例)
// 时间轴:0ms 设备插入 → 100ms 主机检测 → 110ms 开始复位
// SE0持续时间:12ms(满足≥10ms要求)
[0ms]    D+ = 3.3V, D- = 0V   → 全速设备连接
[100ms]  主机开始复位
[100ms]  D+ = 0V, D- = 0V     → SE0开始
[112ms]  D+ = 3.3V, D- = 0V   → SE0结束,复位完成
[112ms]  设备地址 = 0,等待SETUP

2.2.3 Default → Address(SET_ADDRESS)

主机通过默认地址0发送SET_ADDRESS请求,分配唯一地址(1~127)。设备必须在收到请求后正确响应并切换地址。关键时序要求:

  • 设备必须在5ms内完成地址切换
  • 切换后,主机使用新地址发送下一个SETUP事务
  • 如果设备未正确切换地址,主机将无法继续枚举

2.2.4 Address → Configured(SET_CONFIGURATION)

主机读取设备配置描述符后,发送SET_CONFIGURATION请求,选择设备要使用的配置(bConfigurationValue)。设备必须:

  • 验证配置值是否有效
  • 按描述符要求初始化端点(分配缓冲区、设置端点类型)
  • 返回成功状态(ACK)
常见故障点: 如果设备在Address状态无法进入Configured,通常原因包括:配置描述符解析错误、端点描述符中指定的端点号/类型与硬件不匹配、或设备电源要求超过主机端口供电能力(如总线供电设备请求超过500mA)。

2.3 挂起(Suspended)状态与唤醒机制

Suspended状态是USB电源管理的关键部分。设备可以在任何非配置状态下进入挂起,但通常发生在Configured状态之后。挂起状态的特征:

参数 规范要求 故障排查意义
进入条件 总线空闲持续≥3ms 如果设备频繁挂起,检查主机是否停止发送SOF帧
设备电流 ≤2.5mA(低功耗模式) 挂起电流超标可能导致主机断开设备
唤醒方式 远程唤醒(设备驱动D+)或主机复位 远程唤醒功能需在配置描述符中声明
退出时间 设备必须在20ms内恢复操作 唤醒延迟可能导致主机认为设备故障
USB挂起与唤醒时序图 USB挂起与唤醒时序图 0ms 3ms 5ms 25ms 正常传输(SOF帧) 总线空闲(≥3ms) Suspended(低功耗) 唤醒 关键时序:挂起进入条件为总线空闲≥3ms;唤醒后设备必须在20ms内恢复SOF帧接收,否则主机可能复位设备。

2.4 状态机与枚举故障的关联

枚举过程中,每个状态转换都是潜在的故障点。以下是基于状态机的常见故障模式:

  • 卡在Attached/Powered: 主机未检测到设备连接。检查VBUS电压、D+/D-上拉电阻、USB线缆完整性。
  • 卡在Default: 总线复位后设备无响应。检查设备端点0是否正常、设备时钟是否稳定、复位时序是否满足10ms要求。
  • 卡在Address: SET_ADDRESS成功但后续请求失败。检查设备描述符是否被正确读取、设备是否在5ms内切换地址。
  • 无法进入Configured: SET_CONFIGURATION失败。检查配置描述符完整性、端点资源分配、电源请求是否超限。
  • 意外进入Suspended: 总线空闲超时。检查主机是否停止发送SOF帧、设备是否错误进入挂起状态。
实战技巧: 使用USB分析仪捕获枚举日志时,重点关注状态转换点:
1. 复位结束后的第一个SETUP事务(获取设备描述符)
2. SET_ADDRESS事务后的设备响应
3. SET_CONFIGURATION事务后的端点配置状态
通过日志中的状态停留时间和错误码,可以快速定位故障状态。

2.5 状态机实现的硬件依赖

设备端的USB状态机通常由硬件SIE(Serial Interface Engine)或固件共同实现。不同实现方式对枚举可靠性的影响:

实现方式 优点 缺点 故障排查关注点
纯硬件SIE 状态转换快,不受固件延迟影响 灵活性低,难以修复协议bug 检查SIE配置寄存器、复位检测电路
固件主导 可灵活处理异常情况 响应延迟可能导致时序违规 检查中断响应时间、固件状态机逻辑
混合模式 兼顾速度和灵活性 软硬件接口复杂 检查硬件状态机与固件状态同步

理解USB设备状态机是枚举故障排查的基石。每个状态转换都对应着特定的总线事件和协议交互,通过分析设备在状态机中的停留位置和转换失败原因,可以系统性地定位问题根源。