1. USB协议概述:从2.0到4.0的演进之路
大家好,我是你们这期课程的老朋友。做嵌入式硬件十几年,USB接口是我打交道最多的协议之一。今天咱们先聊聊USB协议的整体面貌——标准怎么演进的、电气上有什么讲究、拓扑长什么样、设备插上去之后到底发生了什么。
说白了,搞懂USB,你就能搞定90%的外设连接问题。我刚开始做项目时,经常被USB枚举失败折腾得够呛,后来才发现,很多坑其实在协议层面就有答案。
1.1 USB标准演进:速度与兼容性的博弈
USB从1996年诞生到现在,经历了几个关键阶段。我整理了一张表,方便大家对照:
| 标准版本 | 发布年份 | 理论速率 | 编码方式 | 信号电平 |
|---|---|---|---|---|
| USB 1.0/1.1 | 1996/1998 | 1.5 Mbps (Low Speed) 12 Mbps (Full Speed) |
NRZI + 位填充 | 3.3V (差分) |
| USB 2.0 | 2000 | 480 Mbps (High Speed) | NRZI + 位填充 | 400mV (差分) |
| USB 3.2 Gen 1 | 2013 | 5 Gbps (SuperSpeed) | 8b/10b | 1V (差分) |
| USB 3.2 Gen 2 | 2017 | 10 Gbps | 128b/132b | 1V (差分) |
| USB4 | 2019 | 20/40 Gbps | 基于Thunderbolt 3 | 兼容USB 3.x |
关键点:USB 2.0 High Speed虽然速率比Full Speed高了40倍,但信号摆幅反而从3.3V降到了400mV。为什么?速率高了,压摆率必须跟上,低摆幅才能保证信号完整性。我在一个项目中用过3.3V的Full Speed器件去兼容High Speed总线,结果眼图完全闭合——教训深刻。
1.2 物理层电气特性:信号完整性从这里开始
做硬件设计,电气参数是绕不开的。USB 2.0和USB 3.x的物理层差异很大,我分别说一下。
USB 2.0 电气特性
- 差分信号:D+和D-两条线,差分阻抗90Ω ± 15%
- 信号电平:Low Speed/Full Speed用3.3V摆幅,High Speed用400mV摆幅
- 边沿速率:High Speed要求上升/下降时间在500ps左右
- 抖动要求:总抖动不超过±100ps
避坑指南:我曾经在一个USB 2.0高速设计中,PCB走线长度差了200mil,结果眼图测试时数据眼宽只剩不到300ps。USB 2.0高速对等长要求很严,建议D+和D-走线长度差控制在50mil以内。
USB 3.x 电气特性
- 差分信号:SSTX+/-和SSRX+/-两对独立差分对,阻抗85Ω ± 15%
- 信号电平:摆幅约1V,预加重和去加重可选
- 编码方式:8b/10b(Gen 1)或128b/132b(Gen 2)
- 交流耦合:发送端必须串接100nF电容
嗯,这里要注意:USB 3.x的阻抗是85Ω,不是90Ω。很多人习惯性按90Ω去设计,结果回损超标。我见过一个案例,厂商按90Ω做了USB 3.0的PCB,眼图测试时裕量只剩5%,后来改到85Ω才通过。
1.3 拓扑结构:树形还是星形?
USB的拓扑是树形结构,一个Host下面最多挂127个设备。但实际设计中,我建议不要超过5层Hub级联,否则延迟和电源问题会让你头疼。
个人经验:我习惯在原理图上给每个USB端口加一个TVS管和共模扼流圈。别小看这两个元件,有一次客户现场设备频繁掉线,查了半天发现是共模干扰导致D+信号畸变,加了扼流圈后问题解决。
1.4 枚举流程:设备插上后发生了什么?
你插上一个U盘,系统怎么知道它是什么设备?这个过程叫枚举。我把它拆成几个步骤:
- 设备插入检测:Host检测到D+或D-上的上拉电阻(Full Speed设备在D+上拉1.5kΩ,Low Speed在D-上拉)
- 复位:Host拉低D+和D-至少10ms,设备进入默认状态
- 获取设备描述符:Host发送Get_Descriptor请求,设备返回18字节的设备描述符
- 设置地址:Host分配一个唯一地址(1-127),设备确认后切换地址
- 获取配置描述符:Host获取配置、接口、端点等详细信息
- 选择配置:Host发送Set_Configuration,设备进入工作状态
我曾经踩过的坑:有一次设计USB设备,枚举总是卡在获取配置描述符这一步。用USB分析仪抓包发现,设备返回的配置描述符长度字段写错了。USB协议对描述符格式要求极其严格,多一个字节或少一个字节都会导致枚举失败。建议大家在固件中做描述符校验,或者先用标准工具验证。
1.5 速率协商:设备怎么告诉Host自己能跑多快?
你想想看,一个USB 2.0 Host插上一个USB 3.0设备,它们怎么知道彼此的能力?
USB 2.0的速率协商靠D+/D-上的上拉电阻:
- Low Speed:D-上拉1.5kΩ到3.3V
- Full Speed:D+上拉1.5kΩ到3.3V
- High Speed:先以Full Speed上拉,然后通过Chirp J/K序列协商切换到高速
USB 3.x的速率协商则通过边带信号完成。设备插入后,Host通过检测Rx端子的电气状态来判断是否支持SuperSpeed。这个过程独立于USB 2.0的枚举,所以USB 3.x设备实际上有两套物理层在同时工作。
核心要点:USB 3.x的Type-C接口有CC引脚用于协商供电和角色。我在一个项目中忽略了CC逻辑,结果设备插上后Host不识别——因为CC引脚没有正确上拉。Type-C的CC逻辑比传统Type-A/B复杂得多,后面章节我会专门讲。
1.6 本章小结
USB协议从2.0到4.0,速率提升了近千倍,但底层思想没变:差分信号、树形拓扑、描述符枚举。做硬件设计时,我建议大家先搞清楚你的设备属于哪个速率等级,然后针对性地设计PCB和固件。
嗯,这一章就到这里。记住一句话:USB的物理层决定了信号能不能传过去,协议层决定了传过去之后能不能用。两者缺一不可。