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 电气特性全景

下面这张图把本章的核心知识点串起来了。你可以把它当作一个快速参考。

USB 电气特性与信号知识体系 USB 电气特性与信号知识体系 差分信号 (D+/D-) • 差分 vs 单端 • Vdiff = V(D+) - V(D-) • 抗共模噪声 • 降低 EMI • 等长/紧耦合布线 电源管理 (VBUS/GND) • VBUS: 4.75V - 5.25V • 最大 500mA 供电 • 热插拔浪涌保护 • TVS + 缓启动 • 去耦电容布局 速度识别 (上拉电阻) • 低速: D- 上拉 1.5kΩ • 全速: D+ 上拉 1.5kΩ • 高速: 全速→Chirp • 电阻精度 ±1% • 3.3V 上拉电压 USB 总线信号状态 J 状态 (空闲) K 状态 SE0 (复位) SE1 (非法) Chirp 握手 设计要点总结 1. D+/D- 走线等长紧耦合,差分阻抗 90Ω ±15% 2. VBUS 走线宽度 ≥30mil,加 TVS 和缓启动保护 3. 上拉电阻用 1% 精度,靠近 IC 引脚放置

2.6 实际设计中的避坑指南

最后,我把自己这些年踩过的坑整理一下,你设计时可以直接对照检查:

我的检查清单:

  • 上拉电阻别接错线——低速接 D-,全速/高速接 D+。我见过有人把全速设备的上拉电阻接到了 D-,结果主机一直认为是低速设备,枚举到一半就超时了。
  • 注意 3.3V 电源的纹波——上拉电阻的 3.3V 必须干净,纹波不要超过 50mV。否则主机检测到的电平可能不稳定,导致速度识别失败。
  • 高速设备需要额外的终端电阻——D+ 和 D- 各接一个 45Ω 到地,用于阻抗匹配。这个很多人会忘,结果高速模式根本跑不起来。
  • VBUS 上的电容不要太大——有些工程师喜欢在 VBUS 上放一个大电容(比如 470μF),觉得能滤波。但热插拔时电容充电电流太大,会导致主机 VBUS 电压跌落,触发过流保护。我一般控制在 47μF 以内。

嗯,这一章的内容就到这里。电气特性是 USB 的根基,你把它搞扎实了,后面讲协议和枚举的时候就会顺很多。记住一句话:信号在线上走对了,软件才有机会跑对。