1. USB基础概念回顾
USB(Universal Serial Bus)自 1996 年问世以来,已成为嵌入式系统中最通用的外设总线。在深入调试枚举失败与 URB 超时之前,必须牢固掌握 USB 的物理与逻辑基础。本节从拓扑结构、角色分工和协议代际差异三个维度进行回顾。
1.1 USB 拓扑结构:分层星形
USB 采用分层星形(Tiered Star)拓扑,由主机控制器(Host Controller)、根集线器(Root Hub)、集线器(Hub)和功能设备(Function Device)组成。整个拓扑最多支持 7 层(Tier),包括根集线器层。
关键约束:USB 2.0 最大线缆长度 5 m(全速/高速),USB 3.x 建议 3 m(超高速)。超过层数或线长限制将直接导致枚举失败或信号质量劣化。
1.2 主机与设备角色
USB 是严格的主从(Host-Device)总线。主机(Host)负责调度所有事务,设备(Device)只能被动响应。嵌入式 Linux 系统中,主机角色通常由 EHCI(USB 2.0)或 XHCI(USB 3.x)控制器驱动承担。
| 角色 | 职责 | 典型硬件 | Linux 驱动 |
|---|---|---|---|
| 主机(Host) | 产生帧起始包(SOF)、调度传输、管理枚举、处理错误 | EHCI / XHCI 控制器 | ehci-hcd / xhci-hcd |
| 设备(Device) | 响应主机请求、报告描述符、传输数据 | USB 外设芯片(如 FTDI、CDC ACM) | 设备类驱动(如 usb-storage) |
| 集线器(Hub) | 端口扩展、速度协商、电源管理、信号中继 | USB Hub 控制器 | hub 内核线程 |
| OTG(双角色) | 可在 Host 与 Device 间切换 | 支持 OTG 的 SoC(如 i.MX、STM32MP) | dwc2 / dwc3 |
调试提示:枚举失败时,首先确认主机控制器是否识别到设备插入(检查
dmesg 中的 usb 1-1: new high-speed USB device number ... 消息)。若主机未打印任何信息,问题通常出在硬件连接或根集线器驱动层。
1.3 USB 2.0 与 USB 3.x 差异概述
USB 3.x(SuperSpeed)在物理层、协议层和电源管理上与 USB 2.0 有显著差异。调试时必须区分设备工作在哪种模式,因为 URB 超时的根因可能完全不同。
1.3.1 关键差异速查表
| 特性 | USB 2.0 (High-Speed) | USB 3.x (SuperSpeed) | 调试影响 |
|---|---|---|---|
| 信号线 | D+ / D-(差分,半双工) | SSTX+/- / SSRX+/-(独立收发,全双工)+ 保留 D+/D- | 3.x 需检查两对差分线;D+/D- 用于兼容模式 |
| 编码方式 | NRZI + 位填充 | 128b/132b(8b/10b 在 Gen1) | 信号完整性分析工具不同 |
| 传输方向 | 半双工(主机轮询) | 全双工(异步通知) | URB 超时在 3.x 更可能由链路训练失败引起 |
| 电源管理 | 挂起/恢复(全局) | LTSSM 状态机(U0/U1/U2/U3) | 3.x 设备进入低功耗后需链路训练恢复 |
| 最大速率 | 480 Mbps | 5 Gbps (Gen1) / 10 Gbps (Gen2) | 高速信号对 PCB 布线更敏感 |
| 包开销 | 较大(SOF 每 125 µs) | 较小(支持突发传输) | 批量传输吞吐量差异明显 |
1.3.2 枚举流程差异
USB 2.0 与 3.x 的枚举流程在复位速度协商阶段分叉。USB 3.x 设备在复位后通过 LTSSM(链路训练与状态机)进入 U0 状态,然后主机读取设备描述符。如果 LTSSM 训练失败,设备将回退到 USB 2.0 模式或完全不可见。
常见陷阱:在调试 USB 3.x 枚举失败时,不要只盯着 D+/D- 信号。检查 SSTX/SSRX 差分对的交流耦合电容(通常 0.1 µF ~ 0.33 µF)是否缺失或损坏,这是导致 LTSSM 训练失败的 Top 1 硬件原因。
1.4 小结
- 拓扑:分层星形,最多 7 层,集线器级联不超过 5 个。
- 角色:主机调度一切,设备被动响应;OTG 可切换角色。
- 代际差异:USB 3.x 引入全双工、LTSSM 和独立收发通道,调试方法需相应调整。
- 调试起点:枚举失败时,先确认主机控制器是否检测到设备(dmesg),再根据速度模式(2.0 vs 3.x)选择信号测量点。