1.1 USB 协议概述
USB(Universal Serial Bus,通用串行总线)自 1996 年正式发布 1.0 规范以来,已成为嵌入式系统中最普及的外设连接标准。对于从事 USB 枚举移植与适配的开发者而言,理解 USB 的发展脉络、版本差异以及物理拓扑结构,是分析设备描述符与枚举失败问题的前提。
1.1.1 USB 发展历史与版本演进
USB 标准的演进始终围绕三个核心目标:更高的传输速率、更强的供电能力、更优的协议兼容性。下表梳理了主要版本的关键参数:
| 版本 | 发布时间 | 信号速率 | 编码方式 | 供电能力 | 关键特性 |
|---|---|---|---|---|---|
| USB 1.0 | 1996 | 1.5 Mbps (Low Speed) 12 Mbps (Full Speed) |
NRZI + 位填充 | 5V / 500 mA | 热插拔、即插即用、Hub 扩展 |
| USB 1.1 | 1998 | 同上 | 同上 | 同上 | 修正 1.0 规范歧义,成为首个广泛部署版本 |
| USB 2.0 | 2000 | 480 Mbps (High Speed) | NRZI + 位填充 | 5V / 500 mA | 引入微帧、事务分割、高速握手 |
| USB 3.2 Gen 1 | 2013 | 5 Gbps (SuperSpeed) | 8b/10b | 5V / 900 mA | 双总线架构(USB 2.0 + SuperSpeed) |
| USB 3.2 Gen 2 | 2017 | 10 Gbps (SuperSpeed+) | 128b/132b | 5V / 1.5 A | Type-C 接口、双通道 |
| USB4 | 2019 | 20 Gbps / 40 Gbps | 128b/132b | 5V / 3 A (PD) | 基于 Thunderbolt 3 协议隧道 |
枚举适配提示: 在移植 USB 设备固件时,设备描述符中的 bcdUSB 字段必须如实声明设备支持的 USB 版本。例如,一个仅支持 Full Speed 的 HID 设备若错误填写 0x0200(USB 2.0),主机可能尝试以 High Speed 复位设备,导致枚举失败。
从版本演进可以看出,USB 3.x 及 USB4 引入了全新的物理层和协议层,与 USB 2.0 及之前的版本在电气特性、数据包格式、枚举流程上存在显著差异。嵌入式开发者在进行枚举移植时,必须首先明确目标设备属于 USB 2.0 体系还是 USB 3.x / USB4 体系,因为两者的描述符结构和枚举状态机完全不同。
1.1.2 USB 物理拓扑结构:Host – Device – Hub
USB 采用树形星型拓扑,由且仅由一个 Host(主机) 控制整个总线上的所有通信。设备不能主动发起事务,所有数据传输均由主机调度。Hub 用于扩展端口,使一个主机可以连接多达 127 个设备(含 Hub 自身)。
下图展示了 USB 物理拓扑的核心结构:
上图体现了 USB 拓扑的三个关键层级:
- Host(主机):唯一的总线主控,负责管理枚举、调度事务、分配地址。在嵌入式系统中,Host 通常由 MCU 的 USB OTG 控制器或专用 Host 控制器实现。
- Hub(集线器):负责端口扩展和速度中继。Hub 在枚举过程中扮演关键角色——它检测设备插入/拔出事件,并向主机报告端口状态变化。
- Device(设备):功能端点,通过描述符向主机报告自身能力。设备的速度类别(Low/Full/High/SuperSpeed)决定了枚举时的复位时序和描述符格式。
枚举失败常见陷阱: 在移植 USB 设备固件时,开发者常忽略 Hub 的延迟特性。设备插入后,Hub 需要一定时间(通常 2–10 ms)完成端口去抖和速度检测。若设备固件在复位后过早发送描述符,可能因 Hub 尚未完成速度协商而导致数据包丢失。建议在设备固件中等待至少 50 ms 再响应主机的 GET_DESCRIPTOR 请求。
1.1.3 拓扑结构对枚举移植的影响
USB 的树形拓扑决定了枚举流程的分层特性。主机无法直接感知设备的存在,必须通过 Hub 的中继。在移植 USB 设备固件时,以下拓扑相关因素直接影响枚举成功率:
| 拓扑要素 | 对枚举的影响 | 移植适配建议 |
|---|---|---|
| Hub 端口去抖 | 设备插入后,Hub 需 2–10 ms 去抖,期间端口状态不稳定 | 设备上电后至少等待 100 ms 再使能 D+ 上拉电阻 |
| 速度检测 | Hub 通过 D+/D- 线路上的上拉电阻位置判断设备速度 | 确保上拉电阻连接正确:Full Speed 上拉 D+,Low Speed 上拉 D- |
| 复位信号传播 | 主机发出的复位信号经 Hub 中继后,时序可能产生偏移 | 设备固件应容忍复位信号持续 10–20 ms,而非严格按规范 10 ms 判断 |
| 地址分配 | 主机通过 SET_ADDRESS 请求分配唯一地址,Hub 负责转发 | 设备收到 SET_ADDRESS 后必须在 50 ms 内完成地址切换 |
| 多级 Hub 延迟 | 设备经过多级 Hub 后,主机与设备间的往返延迟增加 | 设备响应控制传输的延迟应控制在 5 ms 以内,避免超时 |
核心要点: USB 枚举移植的本质,是让设备固件在 Host – Hub – Device 的拓扑约束下,按照规范时序正确响应主机的标准请求。任何对拓扑延迟或速度检测机制的忽视,都可能导致枚举失败。本章后续内容将深入分析设备描述符的结构与常见枚举失败案例。