1. USB协议概述:USB 2.0与USB 3.0体系结构、主机-设备拓扑、物理层与协议层分层

1.1 USB体系结构演进:从2.0到3.0

通用串行总线(USB)自1996年问世以来,经历了多次重大迭代。在嵌入式Gadget开发与枚举故障定位中,USB 2.0与USB 3.0是两个最关键的协议版本。两者在拓扑结构、信号机制、传输速率和协议分层上存在本质差异,理解这些差异是诊断枚举失败的前提。

特性 USB 2.0 (Hi-Speed) USB 3.0 (SuperSpeed)
最大信号速率 480 Mbps 5 Gbps
编码方式 NRZI + 位填充 8b/10b 编码
信号线数量 4 线 (VBUS, D+, D-, GND) 9 线 (增加 SSTX+, SSTX-, SSRX+, SSRX-)
传输方向 半双工 (共享D+/-) 全双工 (独立发送/接收差分对)
主机调度 轮询帧/微帧 异步通知 + 轮询
电源管理 挂起/恢复 U0-U3 链路电源状态
向后兼容 — 独立物理层,兼容2.0
枚举故障提示: USB 3.0 设备在插入USB 2.0端口时,物理层会自动降级为2.0模式。如果Gadget的硬件设计未正确处理这一降级握手,会导致设备描述符请求超时,枚举失败。

1.2 主机-设备拓扑结构

USB采用树形星型拓扑,由一个主机(Host)控制整个总线。主机通过根集线器(Root Hub)连接外部集线器或设备,最多支持127个设备(含集线器)。

USB 主机-设备拓扑结构图 USB 主机 (Host) 根集线器 (Root Hub) 集线器 1 集线器 2 设备 A 设备 B 设备 C 设备 D USB Gadget (设备角色) 说明:Gadget 在拓扑中扮演设备角色,接受主机枚举与配置。最多支持 127 个设备(含集线器)。
关键概念: 在USB Gadget开发中,嵌入式设备通常作为设备(Device)角色接入主机。Gadget驱动通过软件模拟设备描述符和端点,使主机将其识别为键盘、存储或网卡等标准设备。

1.3 物理层分层详解

USB协议栈采用分层架构,从物理介质到应用逻辑逐层封装。物理层位于最底层,直接处理差分信号、电气特性和位同步。

1.3.1 USB 2.0 物理层

  • 信号线: D+ 和 D- 差分对,半双工通信。
  • 速度识别: 设备通过上拉电阻(D+ 1.5kΩ 表示全速/高速,D- 1.5kΩ 表示低速)向主机宣告速度。
  • 位编码: NRZI(非归零反转码) + 位填充(连续6个1后插入0)。
  • 帧结构: 主机每1ms(全速)或125μs(高速)发送SOF(Start-of-Frame)包。

1.3.2 USB 3.0 物理层

  • 信号线: 增加 SSTX+/-(发送对)和 SSRX+/-(接收对),实现全双工。
  • 编码: 8b/10b 编码,直流平衡,内嵌时钟。
  • 链路训练: 上电后先进行电气握手(Rx Detect → Polling → U0),协商速率与电源状态。
  • 电源管理: 支持 U0(活动)、U1/U2(省电)、U3(挂起)状态。
USB 2.0 与 USB 3.0 物理层对比 USB 2.0 物理层 4 线:VBUS, D+, D-, GND 半双工 | NRZI + 位填充 速度:1.5 / 12 / 480 Mbps 上拉电阻识别速度 USB 3.0 物理层 9 线:增加 SSTX+/- SSRX+/- 全双工 | 8b/10b 编码 速度:5 Gbps (SuperSpeed) 链路训练 + 电源状态机 枚举故障关键点 USB 3.0 设备插入 2.0 端口时,物理层必须降级为 2.0 模式。若 Gadget 未正确实现降级握手,主机将无法获取设备描述符。

1.4 协议层分层模型

USB协议栈从底向上分为物理层 → 链路层 → 事务层 → 协议层 → 应用层。每一层对上层屏蔽细节,对下层定义接口。

层次 职责 USB 2.0 实现 USB 3.0 实现
应用层 设备功能实现(HID、Mass Storage、CDC) 类驱动 + 固件 类驱动 + 固件
协议层 描述符管理、请求处理、枚举流程 控制传输 (Setup包) 控制传输 + 扩展描述符
事务层 Token/Data/Handshake 包交换 IN/OUT/SETUP 事务 DPP (数据包有效载荷) + 链路管理
链路层 包定界、CRC校验、流量控制 SOP/EOP, CRC5/CRC16 链路命令、信用量控制
物理层 差分信号、电气特性、位同步 NRZI + 位填充 8b/10b + 链路训练
USB 协议栈分层架构图 应用层 (Application Layer) 协议层 (Protocol Layer) 事务层 (Transaction Layer) 链路层 (Link Layer) 物理层 (Physical Layer) 枚举故障定位 描述符错误 Setup包解析失败 事务超时 CRC校验错误 信号完整性 电气特性 上拉电阻 链路训练

1.5 枚举流程与分层交互

USB设备枚举是主机通过控制传输逐层获取设备信息的过程。理解枚举在协议栈中的位置,是定位Gadget枚举故障的基础。

  1. 物理层检测: 主机检测到D+或D-上的上拉电阻,识别设备插入。
  2. 复位与速度协商: 主机发送复位信号(SE0),设备根据上拉电阻响应速度标识。
  3. 获取设备描述符: 主机通过控制传输(Setup包 + IN事务)读取前8字节(含bcdUSB、bDeviceClass等)。
  4. 地址分配: 主机发送SetAddress请求,设备进入地址状态。
  5. 完整描述符获取: 主机再次读取完整设备描述符、配置描述符、接口描述符、端点描述符。
  6. 配置选择: 主机发送SetConfiguration,设备进入配置状态,枚举完成。
常见枚举故障: 如果Gadget在步骤3返回的设备描述符中bMaxPacketSize0字段错误(例如USB 2.0高速设备应返回64,却返回8),主机将无法正确调度后续事务,导致枚举中断。这是最典型的描述符故障之一。

1.6 本章小结

USB 2.0与USB 3.0在物理层信号、拓扑结构和协议分层上存在显著差异。Gadget开发者必须掌握:

  • 主机-设备树形拓扑中Gadget的角色定位;
  • 物理层速度识别机制(上拉电阻 vs 链路训练);
  • 协议栈分层及各层在枚举中的职责;
  • 枚举流程中描述符交互的协议层细节。