2. USB 电气特性与信号:差分信号、电源管理与速度识别
好,咱们进入第二章。这一章讲的是 USB 的物理层——说白了,就是信号在线上到底怎么跑。你写再好的协议栈,如果电气上没搞定,设备就是枚举不起来。我早年吃过这个亏,焊了一块板子,软件怎么调都不认设备,最后发现是 D+ 的上拉电阻焊错了封装。嗯,这种坑,踩过一次就忘不了。
2.1 差分信号:为什么 USB 要用 D+ 和 D- 两根线?
USB 用两根线传数据,分别叫 D+ 和 D-。它不是各传各的,而是传一对差分信号。什么意思?就是信号电平看的是 D+ 减 D- 的差值,而不是单根线对地的电压。
核心公式(理解即可):
Vdiff = V(D+) - V(D-)
逻辑 "1":Vdiff > 200mV(典型值约 400mV)
逻辑 "0":Vdiff < -200mV(典型值约 -400mV)
为什么用差分?两个原因:
- 抗共模噪声——外界干扰同时耦合到两根线上,差值不变。你想想,工业现场电机一启动,单端信号很容易被拉偏,差分就稳得多。
- 降低 EMI——两根线电流方向相反,磁场互相抵消。这对做产品认证很有帮助。
我在一个消费电子项目里遇到过,D+ 和 D- 走线长度差了 5mm,结果高速模式眼图直接闭合。差分对必须等长、紧耦合,这不是玄学,是物理。
2.2 电源管理:VBUS 和 GND 的规矩
USB 用四根线:VBUS、D+、D-、GND。VBUS 是 5V 供电,GND 是地。别小看这两根电源线,坑比信号线还多。
| 参数 | USB 2.0 规范值 | 实际设计建议 |
|---|---|---|
| VBUS 电压 | 4.75V - 5.25V | 尽量靠近 5.0V,压降不超过 0.25V |
| 最大电流(低/全速) | 100mA(枚举前)/ 500mA(枚举后) | 加 PTC 自恢复保险丝,别省 |
| VBUS 跌落 | 不超过 330mV | 用宽走线,至少 20mil |
| 去耦电容 | ≥1μF + 0.1μF | 靠近 VBUS 引脚放置 |
我曾经踩过的坑: 一个量产项目,设备偶尔枚举失败。查了三天,发现是 VBUS 走线太细,长距离压降到了 4.6V,主机检测到电压过低直接复位。从那以后,我所有板子的 VBUS 都走 30mil 以上,并且靠近连接器放一个 47μF 电解电容。
另外,热插拔是 USB 的招牌特性。但热插拔瞬间会有浪涌电流,VBUS 上会有一个很大的电压跌落。我建议你在 VBUS 入口加一个 TVS 管(比如 SMAJ5.0A),再加一个缓启动电路或 eFuse,不然主机端的 USB 控制器容易锁死。
2.3 速度识别:上拉电阻决定一切
USB 设备的速度不是靠软件协商的,而是靠硬件上拉电阻来告诉主机。主机在枚举之前,先检测 D+ 和 D- 上的电平状态,就知道设备是什么速度。
速度识别规则:
- 低速(1.5 Mbps): D- 上拉 1.5kΩ 到 3.3V
- 全速(12 Mbps): D+ 上拉 1.5kΩ 到 3.3V
- 高速(480 Mbps): 先以全速上拉识别,再通过 Chirp 握手切换到高速
为什么高速要先假装全速?因为主机一开始不知道设备支持高速。设备先以全速上拉让主机发现它,然后主机发起复位信号,设备用 Chirp J/K 序列告诉主机“我支持高速”。这个握手过程我后面会详细讲。
这里有个关键点:上拉电阻的精度。规范要求 1.5kΩ ±5%,我建议用 1% 精度的电阻。你想想,如果电阻偏到 1.6kΩ,上拉电压可能不够,主机检测不到设备。我见过一个案例,用了 5% 的电阻,批次偏差导致部分设备无法识别,换 1% 的就好了。
2.4 信号电平与状态定义
USB 总线上有几种基本状态,用 D+ 和 D- 的组合来表示:
| 状态 | D+ | D- | 说明 |
|---|---|---|---|
| J 状态(空闲) | 高 | 低 | 全速/高速空闲 |
| K 状态 | 低 | 高 | 与 J 相反 |
| SE0(复位) | 低 | 低 | 主机拉低至少 10ms |
| SE1(非法) | 高 | 高 | 不允许出现 |
低速设备的 J/K 定义是反过来的:J 状态是 D- 高、D+ 低。这个容易记混,我每次画原理图都要看一眼规范确认。
2.5 知识体系图:USB 电气特性全景
下面这张图把本章的核心知识点串起来了。你可以把它当作一个快速参考。
2.6 实际设计中的避坑指南
最后,我把自己这些年踩过的坑整理一下,你设计时可以直接对照检查:
我的检查清单:
- 上拉电阻别接错线——低速接 D-,全速/高速接 D+。我见过有人把全速设备的上拉电阻接到了 D-,结果主机一直认为是低速设备,枚举到一半就超时了。
- 注意 3.3V 电源的纹波——上拉电阻的 3.3V 必须干净,纹波不要超过 50mV。否则主机检测到的电平可能不稳定,导致速度识别失败。
- 高速设备需要额外的终端电阻——D+ 和 D- 各接一个 45Ω 到地,用于阻抗匹配。这个很多人会忘,结果高速模式根本跑不起来。
- VBUS 上的电容不要太大——有些工程师喜欢在 VBUS 上放一个大电容(比如 470μF),觉得能滤波。但热插拔时电容充电电流太大,会导致主机 VBUS 电压跌落,触发过流保护。我一般控制在 47μF 以内。
嗯,这一章的内容就到这里。电气特性是 USB 的根基,你把它搞扎实了,后面讲协议和枚举的时候就会顺很多。记住一句话:信号在线上走对了,软件才有机会跑对。