1. USB 基础概念:从起源到物理世界

大家好,欢迎来到《USB接口开发:从协议栈到固件实战》的第一章。

USB,全称 Universal Serial Bus,通用串行总线。这东西我们天天用,但真把它吃透的工程师不多。我刚开始做嵌入式时,觉得 USB 就是插个鼠标键盘,后来被一个枚举失败的问题折磨了三天,才老老实实把协议栈啃了一遍。

这一章,我们先打好地基。聊聊 USB 是怎么来的,版本怎么变的,物理层长什么样,以及整个系统是怎么连起来的。

1.1 USB 的起源:为什么会有它?

90 年代初,PC 外设接口乱成一锅粥。串口、并口、PS/2、游戏口……每个接口速度不同、供电不同、插拔还得关机。Intel、Microsoft、IBM 等几家巨头坐不住了,1994 年开始联合制定一个通用接口标准。

1996 年,USB 1.0 正式发布。目标很明确:

  • 即插即用:插上就能用,不用重启
  • 热插拔:带电插拔不烧设备
  • 统一接口:一个口搞定键盘、鼠标、打印机、调制解调器
  • 供电能力:总线供电,小设备不用额外电源
个人经验: 我第一次做 USB 设备时,觉得热插拔是理所当然的。后来发现,如果硬件设计没做好 ESD 保护,热插拔瞬间的浪涌电流能把主控芯片烧掉。嗯,这个坑我踩过。

1.2 版本演进:从 1.0 到 4.0

USB 版本演进,说白了就是速度越来越快,功能越来越多。我整理了一张表,方便你对比。

版本 发布年份 理论速率 编码方式 关键变化
USB 1.0 1996 1.5 Mbps (Low-Speed)
12 Mbps (Full-Speed)
NRZI 基础规范,定义了 A/B 型接口
USB 1.1 1998 同上 NRZI 修正了 1.0 的 bug,真正商用
USB 2.0 2000 480 Mbps (High-Speed) NRZI 引入微帧、事务拆分、高速模式
USB 3.0 2008 5 Gbps (SuperSpeed) 8b/10b 新增差分对 SSTX/SSRX,全双工
USB 3.1 2013 10 Gbps (SuperSpeed+) 128b/132b 编码效率更高,Type-C 接口出现
USB 3.2 2017 20 Gbps (双通道) 128b/132b 双通道复用,必须用 Type-C
USB4 2019 40 Gbps 128b/132b 基于 Thunderbolt 3 协议,隧道传输
注意: USB 3.0/3.1/3.2 的命名在商业上改过好几次,容易搞混。技术上讲,3.0 就是 5 Gbps,3.1 Gen 2 是 10 Gbps,3.2 2x2 是 20 Gbps。做固件时,你只需要关注速率等级,不用纠结名字。

为什么会从半双工变成全双工?USB 2.0 及以前,D+/D- 是半双工的,同一时间只能一个方向传数据。到了 USB 3.0,加了独立的发送和接收差分对,这才实现了真正的全双工。我调试 USB 3.0 设备时,最直观的感受就是:不再需要等总线空闲再发数据了。

1.3 物理层特性:D+/D- 线缆与供电

物理层是 USB 最接地气的部分。你写固件时,很多问题根源就在这。

1.3.1 D+/D- 差分信号

USB 2.0 及以下使用一对差分信号线:D+ 和 D-。差分传输的好处是抗干扰能力强,共模噪声会被抵消。

  • 空闲状态:D+ 和 D- 都被下拉到 GND(设备端有 15kΩ 下拉电阻)
  • J 状态 / K 状态:通过 D+ 和 D- 的电压差来表示逻辑 0 和 1
  • 速度识别:设备在 D+ 或 D- 上接 1.5kΩ 上拉电阻,Host 检测到后就知道设备速度
避坑指南: 我曾经做过一个项目,设备在 High-Speed 模式下老是掉线。查了两天,发现是 PCB 上 D+ 和 D- 的走线长度差了 5mm,导致信号偏移。USB 2.0 High-Speed 对差分对等长要求很严,建议控制在 2mm 以内。

1.3.2 供电:VBUS 与 GND

USB 通过 VBUS 给设备供电。标准如下:

USB 版本 VBUS 电压 默认电流 最大电流(协商后)
USB 2.0 5V ±5% 100 mA 500 mA
USB 3.0 5V ±5% 150 mA 900 mA
USB BC 1.2 5V 1.5 A 1.5 A
USB PD 5V / 9V / 15V / 20V 协商决定 最高 5A

做低功耗设备时,我习惯先按 100mA 设计,再通过配置描述符申请更多电流。如果一上来就申请 500mA,Host 可能会拒绝枚举。

1.4 拓扑结构:Host、Hub、Device

USB 是主从架构,不是对等的。整个拓扑是一个树形结构,根节点是 Host,叶子节点是 Device,中间可以有 Hub 扩展。

USB 拓扑结构图 USB 拓扑结构(树形) USB Host Root Hub Hub 1 Hub 2 Mouse (LS) Keyboard (FS) Flash Drive (HS) Camera (SS) 说明: • Host 是唯一的主控,所有通信都由 Host 发起 • Hub 用于扩展端口,同时负责速度转换和电源管理 • Device 是功能设备,不能主动发起事务

1.4.1 Host:唯一的主控

Host 是整个 USB 总线的核心。它负责:

  • 检测设备的插入和拔出
  • 管理总线上的枚举过程
  • 分配地址和带宽
  • 发起所有数据传输

你想想看,USB 设备永远不能主动说话。设备想发数据,必须先等 Host 来问。这个设计简化了设备端的复杂度,但也意味着 Host 的调度算法很关键。

1.4.2 Hub:扩展与中继

Hub 的作用不只是分叉。它还要做:

  • 信号中继:恢复信号质量,延长传输距离
  • 速度转换:比如 Host 是 High-Speed,设备是 Full-Speed,Hub 要做事务翻译(TT)
  • 电源管理:每个端口可以单独控制供电
  • 设备检测:检测端口状态变化并报告给 Host
个人习惯: 调试 USB 问题时,我经常先看 Hub 的状态。如果 Hub 不识别设备,问题大概率在物理层或电源上。如果 Hub 识别了但 Host 不枚举,那就要抓包看协议层了。

1.4.3 Device:功能实现者

Device 就是各种外设:鼠标、键盘、U 盘、摄像头、打印机……每个设备都有一个或多个 端点(Endpoint),端点是通信的基本单元。

设备在枚举时,会向 Host 报告自己的 描述符:设备描述符、配置描述符、接口描述符、端点描述符。Host 根据这些信息加载合适的驱动。

避坑指南: 我曾经写过一个设备的固件,枚举总是卡在获取配置描述符那一步。后来发现是配置描述符的长度字段写错了,Host 读到一半就断了。描述符的每个字节都要对着规范仔细核对,少一个字节都不行。

1.5 本章小结

这一章我们聊了 USB 的起源、版本演进、物理层特性和拓扑结构。这些都是后面章节的基础。

  • USB 从 1.0 到 4.0,速度从 1.5 Mbps 飙到了 40 Gbps
  • 物理层靠 D+/D- 差分信号传输,VBUS 供电
  • 拓扑是树形结构,Host 是唯一主控,Hub 负责扩展,Device 实现功能