2. USB设备状态机:USB设备状态详解
USB协议定义了一套严格的状态机,用于管理设备从连接到配置完成的完整生命周期。理解这六个核心状态——Attached、Powered、Default、Address、Configured、Suspended——是进行枚举故障排查的基础。每个状态都对应着总线上的特定电气特征和主机-设备交互行为。
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 | 暂停数据传输,等待唤醒信号或复位 |
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)
2.3 挂起(Suspended)状态与唤醒机制
Suspended状态是USB电源管理的关键部分。设备可以在任何非配置状态下进入挂起,但通常发生在Configured状态之后。挂起状态的特征:
| 参数 | 规范要求 | 故障排查意义 |
|---|---|---|
| 进入条件 | 总线空闲持续≥3ms | 如果设备频繁挂起,检查主机是否停止发送SOF帧 |
| 设备电流 | ≤2.5mA(低功耗模式) | 挂起电流超标可能导致主机断开设备 |
| 唤醒方式 | 远程唤醒(设备驱动D+)或主机复位 | 远程唤醒功能需在配置描述符中声明 |
| 退出时间 | 设备必须在20ms内恢复操作 | 唤醒延迟可能导致主机认为设备故障 |
2.4 状态机与枚举故障的关联
枚举过程中,每个状态转换都是潜在的故障点。以下是基于状态机的常见故障模式:
- 卡在Attached/Powered: 主机未检测到设备连接。检查VBUS电压、D+/D-上拉电阻、USB线缆完整性。
- 卡在Default: 总线复位后设备无响应。检查设备端点0是否正常、设备时钟是否稳定、复位时序是否满足10ms要求。
- 卡在Address: SET_ADDRESS成功但后续请求失败。检查设备描述符是否被正确读取、设备是否在5ms内切换地址。
- 无法进入Configured: SET_CONFIGURATION失败。检查配置描述符完整性、端点资源分配、电源请求是否超限。
- 意外进入Suspended: 总线空闲超时。检查主机是否停止发送SOF帧、设备是否错误进入挂起状态。
1. 复位结束后的第一个SETUP事务(获取设备描述符)
2. SET_ADDRESS事务后的设备响应
3. SET_CONFIGURATION事务后的端点配置状态
通过日志中的状态停留时间和错误码,可以快速定位故障状态。
2.5 状态机实现的硬件依赖
设备端的USB状态机通常由硬件SIE(Serial Interface Engine)或固件共同实现。不同实现方式对枚举可靠性的影响:
| 实现方式 | 优点 | 缺点 | 故障排查关注点 |
|---|---|---|---|
| 纯硬件SIE | 状态转换快,不受固件延迟影响 | 灵活性低,难以修复协议bug | 检查SIE配置寄存器、复位检测电路 |
| 固件主导 | 可灵活处理异常情况 | 响应延迟可能导致时序违规 | 检查中断响应时间、固件状态机逻辑 |
| 混合模式 | 兼顾速度和灵活性 | 软硬件接口复杂 | 检查硬件状态机与固件状态同步 |
理解USB设备状态机是枚举故障排查的基石。每个状态转换都对应着特定的总线事件和协议交互,通过分析设备在状态机中的停留位置和转换失败原因,可以系统性地定位问题根源。