1. USB协议概述:从USB 1.0到USB 4,物理层与拓扑结构

大家好,我是你们的老朋友。今天咱们正式开讲USB协议栈开发的第一章。说实话,USB这个协议,我前前后后折腾了十几年,从最早的USB 1.1鼠标,到现在的USB 4高速数据采集卡,踩过的坑能绕办公室三圈。但别怕,我会把这些经验都揉碎了讲给你听。

这一章,我们先搭个骨架。把USB的来龙去脉、电气特性、还有Host-Hub-Device这套拓扑结构搞清楚。说白了,就是先让你知道USB这玩意儿到底是怎么连的、怎么跑的。

1.1 USB总线发展史:从1.0到4的进化

USB标准从1996年诞生到现在,经历了多次迭代。每次升级,核心目标就两个:更快、更通用。我整理了一张表,把几个关键版本的特征列出来,你一眼就能看明白。

版本 推出时间 理论速率 编码方式 核心变化
USB 1.0 / 1.1 1996 / 1998 1.5 Mbps (低速)
12 Mbps (全速)
NRZI + 位填充 定义了基础协议框架
USB 2.0 2000 480 Mbps (高速) NRZI + 位填充 引入微帧、事务分割
USB 3.0 / 3.1 2008 / 2013 5 Gbps / 10 Gbps 8b/10b 双总线架构、全双工
USB 3.2 2017 20 Gbps (双通道) 128b/132b 多通道聚合
USB4 2019 40 Gbps 128b/132b 基于Thunderbolt 3协议

你看,从1.0到USB4,速率提升了近三万倍。但有意思的是,底层的枚举流程、描述符结构、传输类型这些核心概念,从1.0开始就没变过。我经常跟团队里的新人说:“搞懂USB 1.1的枚举,你就搞懂了USB 4的枚举”。底层逻辑是相通的。

个人经验: 我在2010年做过一个项目,需要兼容USB 1.1的全速设备和USB 2.0的高速设备。当时被一个兼容性问题卡了两周——全速设备在高速Hub上枚举失败。后来发现是Hub的事务翻译器(TT)配置不对。从那以后,我养成了一个习惯:做USB开发,先看Hub的规格书。

1.2 USB物理层与电气特性

物理层,说白了就是信号怎么在线上跑。USB用的是差分信号传输,两根数据线D+和D-。这个设计很巧妙,抗干扰能力强。

不同速率下,电气特性差异很大。我列个表,你调试的时候对照着看。

速率模式 信号电平 终端电阻 线缆最大长度 关键特征
低速 (1.5 Mbps) 3.3V D+ 上拉 1.5kΩ
D- 下拉 15kΩ
5 m D- 上拉识别
全速 (12 Mbps) 3.3V D+ 上拉 1.5kΩ
D- 下拉 15kΩ
5 m D+ 上拉识别
高速 (480 Mbps) 400 mV (摆幅) D+/D- 各 45Ω 对地 5 m 先全速握手再切高速
超高速 (5 Gbps+) 差分摆幅 差分阻抗 100Ω 3 m (推荐) 独立发送/接收对

这里有个关键点:设备的速度识别是靠D+或D-上的上拉电阻完成的。低速设备在D-上拉,全速/高速设备在D+上拉。Host就是通过检测哪根线被拉高,来判断设备的速度等级。

避坑指南: 我曾经在调试一个全速HID设备时,发现Host总是识别为低速。查了两天,最后发现是PCB上D+和D-的走线交换了位置。上拉电阻接在D-上,Host自然认为它是低速设备。所以,画PCB时一定要再三确认D+/D-的极性。

再说说编码。USB 1.x和2.0用的是NRZI编码加位填充。NRZI的意思是:数据0翻转电平,数据1保持电平不变。位填充是为了保证时钟同步——连续6个1之后,强制插入一个0。USB 3.x开始改用8b/10b和128b/132b编码,效率更高,但原理更复杂。

1.3 USB拓扑结构:Host、Hub、Device

USB的拓扑结构是典型的星型树状结构。一个Host下面可以挂多个Hub,每个Hub下面又可以挂设备或者下级Hub。但注意,最多支持7层(包括Host和根Hub)。

我画了一张图,把USB的拓扑结构展示出来。你看一眼就明白了。

USB拓扑结构示意图 USB 拓扑结构(Host - Hub - Device) USB Host (根) 根 Hub (第1层) Hub (第2层) Device (第2层) Hub (第3层) Device Device (第4层) 拓扑规则 • 最多支持 7 层(含 Host) • 每个 Hub 最多挂 7 个下游端口 • 所有通信由 Host 发起 • Device 不能主动发送数据

这张图里,Host在最顶层,下面是根Hub,再往下可以级联Hub,最终挂载Device。注意看,所有通信都是由Host发起的。Device只能被动响应。这就是USB协议的核心——轮询机制。

1.3.1 Host的角色

Host是整个USB系统的大脑。它负责:

  • 检测设备插拔:通过D+/D-上的电平变化判断
  • 枚举设备:分配地址、读取描述符、加载驱动
  • 调度传输:管理所有端点的事务
  • 电源管理:控制设备的挂起和唤醒

我刚开始做USB Host驱动时,觉得枚举流程特别复杂。后来发现,只要把状态机画清楚,代码就是填表的事。枚举的核心就是:复位 -> 分配地址 -> 读设备描述符 -> 配置 -> 开始传输。

1.3.2 Hub的职责

Hub就是个信号中继器。但它不是简单的转发,它要做几件事:

  • 信号再生:把衰减的信号恢复成标准电平
  • 速度转换:USB 2.0 Hub内部有事务翻译器(TT),能让高速Host和全速/低速设备通信
  • 端口管理:检测设备插拔、控制端口电源

小技巧: 调试Hub时,我最常用的工具就是USB分析仪。抓一次枚举过程,看看TT是怎么工作的。你会发现,全速设备在高速Hub上通信时,数据会被拆成多个微帧。理解了这一点,很多兼容性问题就迎刃而解了。

1.3.3 Device的组成

一个USB设备,从协议角度看,由以下部分组成:

  • 设备描述符:描述设备的基本信息(厂商ID、产品ID、版本号等)
  • 配置描述符:描述设备的配置信息(功耗、接口数量等)
  • 接口描述符:描述设备的功能接口(HID、Mass Storage、CDC等)
  • 端点描述符:描述数据传输的端点(方向、类型、最大包长等)

每个设备至少有一个端点0,用于控制传输。其他端点根据功能需求配置。我见过最夸张的设备有16个端点,那是一个高速视频采集卡,同时传输多路视频流。

1.4 本章小结

这一章,我们走马观花地看了USB的整个框架。从1.0到USB4的演进,从差分信号到拓扑结构。你可能会觉得信息量有点大,没关系。记住三个核心点就行:

  1. USB是Host主导的轮询总线,所有通信由Host发起
  2. 速度识别靠上拉电阻,D+上拉是全速/高速,D-上拉是低速
  3. 拓扑是星型树状,最多7层,Hub负责信号中继和速度转换