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的拓扑结构展示出来。你看一眼就明白了。
这张图里,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的演进,从差分信号到拓扑结构。你可能会觉得信息量有点大,没关系。记住三个核心点就行:
- USB是Host主导的轮询总线,所有通信由Host发起
- 速度识别靠上拉电阻,D+上拉是全速/高速,D-上拉是低速
- 拓扑是星型树状,最多7层,Hub负责信号中继和速度转换