第一章 USB协议概述:从历史到物理层
大家好,我是你们这趟USB协议栈之旅的向导。做嵌入式这些年,我调试过无数USB设备,从鼠标键盘到高速摄像头,从U盘到复合设备。说实话,USB协议看着复杂,但只要你把它的骨架摸清楚了,剩下的就是往上面填肉。
这一章,我们先搭好地基。我会从USB的发展史讲起,然后对比2.0和3.x的核心差异,最后深入到物理层和电气特性。嗯,这些内容可能有点干,但相信我,后面做状态机实现和枚举调试时,你会感谢今天认真看完了这一章。
1.1 USB的发展历史:为什么会有USB?
90年代初,电脑外设的接口简直是灾难。串口、并口、PS/2、游戏口……每个接口长得不一样,速度参差不齐,还不能热插拔。我记得那时候装个打印机,得先关机,插上线,再开机,装驱动,搞不好还得调IRQ中断号——现在年轻人可能都没听过这个词。
1994年,Intel、Microsoft、IBM等七家公司坐在一起,决定搞一个统一的通用串行总线。目标很明确:
- 热插拔:插上就能用,不用重启
- 即插即用:系统自动识别设备
- 统一接口:一个口子通吃所有外设
- 低成本:比SCSI、FireWire便宜得多
1996年,USB 1.0正式发布,速度只有1.5 Mbps(低速)和12 Mbps(全速)。说实话,初期推广并不顺利,直到1998年iMac率先取消串口和并口,全部改用USB,这才引爆了市场。
2000年,USB 2.0来了,速度飙到480 Mbps(高速)。这一版统治了市场十几年,直到今天,很多嵌入式设备还在用USB 2.0。
2008年,USB 3.0发布,速度跳到5 Gbps(超高速)。后来3.1(10 Gbps)、3.2(20 Gbps)一路升级。2019年,USB4基于Thunderbolt 3协议,速度达到40 Gbps。
核心观点: USB的成功,说白了就是解决了「插拔麻烦、接口混乱」这个痛点。你想想看,现在谁还愿意关机插外设?
1.2 USB 2.0与USB 3.x的核心区别
很多初学者会问:USB 3.0的接口不是也能插USB 2.0的设备吗?它们到底差在哪?
我直接说结论:USB 3.x不是USB 2.0的升级版,而是并行增加了一套全新的物理层和协议层。 两者共用物理接口,但内部走的是两套完全不同的总线。
| 对比项 | USB 2.0 | USB 3.x |
|---|---|---|
| 信号速率 | 480 Mbps(高速) | 5 Gbps(3.0)/ 10 Gbps(3.1)/ 20 Gbps(3.2) |
| 编码方式 | NRZI + 位填充 | 8b/10b(3.0)/ 128b/132b(3.1+) |
| 传输模式 | 半双工(主机轮询) | 全双工(异步传输) |
| 物理层 | D+/D- 差分对 | 增加 SSTX+/SSTX-、SSRX+/SSRX- 两对差分线 |
| 电源管理 | 挂起/唤醒(简单) | U0-U3多级电源状态 |
| 协议架构 | 基于事务(Token-Data-Handshake) | 基于包(Header + Payload,支持多流) |
| 向后兼容 | 兼容USB 1.1 | 兼容USB 2.0(共用物理接口) |
个人经验: 我在做USB 3.0摄像头驱动时,踩过一个坑——以为USB 3.0只是速度更快,结果发现它的枚举流程和USB 2.0完全不同。USB 3.0设备必须先以USB 2.0模式完成基本枚举,然后通过「链路训练」切换到超高速模式。这个细节,后面枚举章节我会重点讲。
1.3 USB的物理层与电气特性
做嵌入式开发,物理层是你必须面对的第一道关。信号好不好,直接决定枚举能不能过、传输稳不稳。
1.3.1 线缆与连接器
USB 2.0使用4线制:VBUS(电源)、D+、D-(数据)、GND(地)。USB 3.x在此基础上增加了两对差分线:SSTX+/-(发送)和SSRX+/-(接收),所以Type-A的USB 3.0接口内部有9个触点。
连接器类型很多:Type-A(主机端)、Type-B(设备端)、Mini/Micro(移动设备)、Type-C(正反插,支持USB 3.1+)。我个人最喜欢Type-C,不用看方向,插就完了。
1.3.2 电气特性关键参数
| 参数 | 低速 (1.5 Mbps) | 全速 (12 Mbps) | 高速 (480 Mbps) |
|---|---|---|---|
| 驱动电压 | 3.0V ~ 3.6V | 3.0V ~ 3.6V | 400mV(差分摆幅) |
| 终端电阻 | D+上拉1.5kΩ | D-上拉1.5kΩ | D+/D-各接45Ω到地 |
| 信号边沿 | 75ns ~ 300ns | 4ns ~ 20ns | 500ps ~ 1ns |
| 电缆最大长度 | 3m | 5m | 5m(建议3m以内) |
避坑指南: 我曾经在一个项目中,USB全速设备总是枚举失败。查了两天,最后发现是D+的上拉电阻焊成了10kΩ。USB协议对上拉电阻的精度要求是±5%,别用5%精度的普通电阻,老老实实用1%的。还有,PCB走线时D+/D-要等长,差分阻抗控制在90Ω±15%。
1.3.3 设备速度检测机制
USB主机是怎么知道插上来的是低速、全速还是高速设备?这个机制很有意思:
- 设备插入:主机检测到D+或D-上的电平变化(从0到高电平)
- 上拉电阻识别:
- D+上拉1.5kΩ → 全速设备
- D-上拉1.5kΩ → 低速设备
- 高速握手(Chirp):如果是全速设备,主机先复位总线,然后发送Chirp K信号。设备如果能响应Chirp K/J序列,就切换到高速模式;否则保持全速
说白了,速度检测就是靠上拉电阻的位置和一套握手协议。这个流程在枚举调试中非常关键,很多故障就出在这一步。
1.4 USB系统拓扑结构
USB采用星型-菊花链混合拓扑。一个主机(Host)下面可以挂最多127个设备,通过集线器(Hub)扩展。
我画了一张图,帮你理清这个结构:
这个拓扑结构决定了USB协议栈的设计思路:所有通信都由主机发起,设备只能被动响应。你想想看,这就好比老师点名,学生才能回答问题——设备不能主动给主机发数据。
1.5 本章小结
这一章我们覆盖了三个核心内容:
- USB发展史:从1.0到USB4,核心驱动力是速度和易用性
- 2.0 vs 3.x:不是升级关系,是两套并行总线,物理层和协议层完全不同
- 物理层与电气特性:上拉电阻决定速度,差分信号保证抗干扰,拓扑结构决定通信模式