1. 抓波形前必须弄清的事:D+/D- 的三种速度模式与信号特征
1.1 差分信号与单端判断逻辑的关系
USB2.0 总线看着只有四根线,VBUS、GND、D+、D-,但真正承担数据传输的只有 D+ 和 D- 这两根。这里的难点在于,它的电气逻辑不是“绝对电压高低”,而是“两根线之间的相对差值”。实际工作中最容易犯的错误,就是把 D+ 或 D- 单独拎出来当普通方波看,然后对着一个 3.3V 或几百毫伏的信号犯迷糊。
从结构上看,USB 物理层使用差分传输,D+ 和 D- 线的差分阻抗通常设计在 90Ω 左右,单端对地阻抗大概在 45Ω 到 50Ω。传输数据时,驱动端会根据要发送的位状态,让两根线呈现相反的电位极性。示波器要还原真正的总线逻辑,要么用差分探头直接测两根线的差值,要么用两台通道分别接 D+ 和 D-,再用数学运算做减法。后者更常见,因为大部分硬件工程师手头没有差分探头。
但这里有个非常基础的判断,我在很多新手那儿都见过:你必须在抓波前先知道当前设备处于哪种速度模式,不然你看到的信号幅度、时间刻度、甚至触发条件都是错的。这一点决定了整个测量方案。
1.2 低速、全速、高速:别用同一个电气标准套所有设备
USB2.0 协议涵盖三种速度,电气特性差异非常大。我先把关键参数列出来,后面所有测量操作都围绕这张表展开。
| 速度模式 | 线路速率 | 位时间 | 差动驱动幅度 | 上升沿典型时间 |
|---|---|---|---|---|
| 低速 Low-Speed | 1.5 Mbps | 667 ns | 约 3.3V | 75 ns 左右 |
| 全速 Full-Speed | 12 Mbps | 83.3 ns | 约 3.3V | 4 ns ~ 20 ns |
| 高速 High-Speed | 480 Mbps | 2.08 ns | 约 400 mV | 500 ps ~ 1 ns |
低速和全速的驱动电压基本一致,接近 3.3V,但位时间相差了 8 倍。高速模式则是完全另一套玩法:设备在完成高速握手后,会把 D+ 的上拉电阻断开,改由终端电阻配合电流源驱动,差动幅度只有 400mV 左右。你如果按照全速 3.3V 的量程去抓高速信号,波形会被压缩到屏幕底部;反过来,你用高速的高灵敏度档位去抓全速信号,又很容易把示波器打到限幅。
这就解释了为什么“把示波器接上就想看到漂亮波形”这条路走不通。你需要在动手前就清楚设备是 USB2.0 哪个速度等级,然后据此选探头、选带宽、设定触发电平和时基。
1.3 J、K、SE0 是理解波形的底层语言
USB 物理层用 J 和 K 两个状态来表示差分信号的两种极性。具体定义取决于速度模式:全速/高速设备在空闲时通常处于 J 状态,数据线上的表现为 D+ 高、D- 低;而低速设备的上拉电阻在 D- 上,所以空闲的 J 状态是 D+ 低、D- 高。
还有一个关键状态叫 SE0,也就是 Single-Ended Zero,指 D+ 和 D- 同时被拉低。SE0 在 USB 通信里有特殊含义——它出现在复位信号、包结束 EOP、断开检测这些场景中。你在示波器上看到一个“双低”的凹槽,这往往就是包的结束标志,而不是异常毛刺。
很多新手把 SE0 当成故障,觉得“怎么两根线都变 0V 了”,实际上那是 USB 包结束的正常形态。反过来,如果两根线同时为高,那是单端一状态,正常通信中一般不会出现,一旦出现,通常意味着驱动端或者线缆存在问题。这些状态判断是整个波形分析的基础,理解了 J/K/SE0,你才能把一个包从同步字段到 EOP 完整地“读”出来。
1.4 什么时候该去抓 D+/D- 波形
把示波器搬到 USB 总线上,通常是为了回答下面几类问题:
- 设备间歇性枚举失败,或者换一台电脑表现完全不同。
- 产品在实验室跑得好,到了客户现场频繁掉线,且掉线时间没有明显规律。
- 自己设计了 USB 接口电路,加了 ESD 保护、共模电感、滤波电容,想验证这些器件有没有把信号质量搞坏。
- 批量生产时出现“有的板子行,有的板子不行”的稳定性问题。
这些问题用逻辑分析仪或协议分析仪很难一眼定位,因为问题不出在“字节对不对”,而出在“电平够不够、沿够不够陡、噪声够不够小”。抓 D+/D- 波形,就是直接看物理层是否满足 USB 规范,把“协议栈背后的模拟真相”拉到你面前。
2. 测量配置选型:示波器带宽、探头与被测点准备
2.1 示波器带宽:全速使用 100MHz 就行,高速需要上 500MHz 以上
很多工程师习惯性认为,测数字信号只需要带宽比信号频率高就可以。这个想法在低速场景勉强成立,但测 USB 不能这么算。真正的约束条件不是数据速率本身,而是信号上升沿携带的高频能量。
信号的有效带宽可以近似用 0.35 / 上升沿时间来估算。全速 USB 的上升沿通常在 4ns 到 20ns,取最快的 4ns,0.35 / 4ns ≈ 87.5MHz。也就是说,一台 100MHz 带宽的示波器刚好能够正确显示全速信号的基本形态。如果上升沿更快,或者你想看细节,125MHz 到 250MHz 会更从容。
高速 USB 就不同了。典型上升沿在 500ps 左右,按公式算 0.35 / 500ps = 700MHz。老实说,想真正测准高速信号的边沿,500MHz 带宽的示波器是入门配置,1GHz 更理想。如果你用 100MHz 示波器去抓高速波形,会看到一条被“抹圆”的曲线,上升沿变缓,幅度也可能被拉低,进而误判为信号完整性故障。
采样率也别忘了。500MHz 带宽的示波器至少要 2GSa/s,否则波形重构质量很差。千万不要在高速测量时开启示波器的带宽限制功能,那个功能默认情况下会把带宽砍到 20MHz,全速信号都会被搞成圆头圆脑。
2.2 探头方案:单端无源探头、数学减法与差分探头怎么选
手头没有专用 USB 差分探头时,最实用的方案是拿两个无源探头分别接 D+ 和 D-,然后在示波器上做 CH1 - CH2 的数学运算。这个方案对于全速和低速信号非常有效,因为信号幅度大、边沿相对宽松,两个通道之间的延迟差异影响有限。
但做减法测量前,必须做通道校准。多数示波器提供 Deskew 功能,把两个探头同时接到同一个校准信号源上,调整通道间延迟偏差到最小。否则 1ns 到 2ns 的通道延迟差在高速信号上会直接造成波形变形,量产阶段这点偏差就会让判断失真。
差分探头当然是最好的选择。有源差分探头带宽做到 500MHz 甚至 1GHz 时,能直接输出真正的 D+/D- 差分波形,共模噪声也会被抑制掉。缺点是价格相对较高,很多小团队未必常备。
至于那种带鳄鱼夹的长接地线探头,在测 USB 这种高速信号时非常不推荐。长接地线会引入明显电感,波形上会出现莫名其妙的振铃,甚至把真实信号淹没掉。最好的做法是给无源探头配上短接地弹簧,尽量缩短探头尖端到地的回路。
2.3 测试夹具:别把信号引到“理想测量点”之外
测量点选在哪,直接决定抓到的波形有没有参考价值。我最推荐的位置是 USB 连接器引脚或者 PCB 测试焊盘,也就是靠近芯片端但又能表征总线负载的位置。
自己处理线缆时,可以剪一小段 USB 线,把屏蔽层剥开,露出 D+、D-、GND 三根线,分别焊上测试钩。但要注意,剥线长度尽量短,缠在一起的部分越长,测量点离真实信号节点就越远,引入的寄生电感和电容会让波形“看起来”比实际糟糕。
还有一种做法是买一个 USB 测试夹具板,把设备插到夹具的 A 口,示波器探针接夹具上引出的测试点。这种夹具板一般会把差分信号走线做成可控阻抗,保证信号在测试点处不会因为分支线而严重反射。手头没有夹具时,优先选 PCB 上靠近连接器的过孔或焊盘,不要直接去刮线缆中间的位置。
3. 制造稳定波形:让 USB 设备按需输出可触发的事务
3.1 为什么一开机就是一堆乱码
示波器触发靠的是“重复的、稳定的事件”。USB 总线上平时可能很安静,偶尔出一个控制传输,你怎么抓都可能错过。所以抓波形的第一步不是调示波器,而是让设备产生一个你能预测、能反复触发的事件。
我见过不少人把 U 盘插上以后,对着屏幕按 Single 等半天,等到的全是波形碎片。这是因为 U 盘插入后的枚举过程是单次事件,等你想起来按捕获,整个过程早结束了。正确思路是让总线上的数据流持续出现,比如循环读写 U 盘、循环发送控制请求,或者给设备写一段固件让它周期性发送数据包。
3.2 用 U 盘循环读写制造高速数据流
抓高速 USB 波形,最简单可靠的办法是用一个 U 盘配合电脑做循环读写。在 Linux 下可以用 dd 命令配合 shell 循环,在 Windows 下可以用一些磁盘测试工具设置持续读写,让 U 盘不停处于数据传输状态。
操作步骤大概是:先把 U 盘插上主机,确认枚举成功,然后用脚本执行“写 1MB 文件、读回来、删除、再写”的循环。循环间隔尽量短,这样总线上的 BULK 传输几乎是无缝的。示波器触发就可以设置为 D+ 上的边沿触发,配合时基拉到单包级别,反复捕获多次以后,能看到稳定的数据包波形。
这里要提一句,U 盘的主控芯片不同,传输节奏会有差异。有的 U 盘在完成一个传输后会停顿几毫秒等待主机调度,但总体上 BULK IN/BULK OUT 事务出现的频率足够高,比干等枚举过程好抓得多。
3.3 利用系统枚举过程抓复位 Chirp 序列
如果你想抓的是设备从插入到完成高速握手的全过程,也就是复位信号和 Chirp 时序,那必须采用另一种策略。此时不能只盯着数据包,要把示波器时基放到毫秒级别,并且在设备上电之前就进入 Single/预触发模式。
你可以先给示波器设置一个 D+ 上升沿或下降沿触发,时基放在 10ms/格左右,然后在电脑开机状态下直接插入设备。示波器捕捉到的这段波形会包含:VBUS 上电产生的瞬态、主机发出的复位 SE0、设备回应的 Chirp K、主机回应的 Chirp J/K、以及双方切换高速后的数据传输。这是分析“设备为什么只能全速而不能高速”这类问题的关键片段。
3.4 自己改固件时,让 MCU 周期性发送全速包
如果设备由自己研发的 MCU 控制,你有一种最灵活的手段:在固件里写一个循环,让端点周期性发送固定数据包。比如 STM32 的 USB 外设,可以在主循环里不断往一个 IN 端点写数据,或者直接操作 USB 寄存器触发一个 IN 事务。
这种方式的好处是总线行为完全可控。你可以准确知道发送的包长、包间隔,甚至可以在不同代码位置插入延时,观察逐步变化。抓这样的信号,示波器触发几乎一击即中。
4. 示波器设置与完整抓取流程:从接线到冻结波形
4.1 连接与通道校准
先把示波器两个通道分别接到 D+ 和 D-。建议 CH1 接 D+,CH2 接 D-,之后做数学运算 M = CH1 - CH2,这样屏幕上可以同时看单端波形和差分波形。CH1 和 CH2 都设为 DC 耦合,探头衰减比根据探头拨档选择,常见是 10x。
连接完成后,把两个探头同时接到示波器自带的方波校准输出上,检查波形幅度和时间刻度是否一致。如果发现两个通道显示波形没有完全重合,需要在通道设置里调整 Deskew。全速测量时通道偏差少于 2ns 基本可接受,高速测量时尽量调到 1ns 以内。
4.2 带宽限制、输入阻抗与通道灵敏度的设置
测全速信号时,示波器带宽限制可以关闭,让 100MHz 或更高带宽如实呈现信号。测高速信号时也关闭带宽限制,否则上升沿会被明显抑制。输入阻抗一般选 1MΩ,除非你用的是 50Ω 主动探头那一类,才需要切换成 50Ω。
通道灵敏度需要根据速度模式设置。全速信号幅度接近 3.3V,档位设在 500mV/div 到 1V/div 合适。高速信号幅度只有约 400mV 差动,单端信号也在 0.4V 量级,档位要放到 100mV/div 甚至 50mV/div。触发源选 CH1,触发类型选边沿,触发耦合选直流,避免高频抑制滤波把边沿判断搞迟钝。
4.3 触发设置:让它每次都抓到包的同一位置
USB 数据包通常以一段同步序列开始,对高速设备来说就是交替的 KJ 信号。在示波器上看到的第一个边沿可能是 D+ 下降沿,也可能先出现 D+ 上升沿,取决于当前总线的空闲极性。全速/高速设备空闲时 D+ 为高,所以包开始的第一个可见变化往往是 D+ 下降沿,建议触发到 D+ 下降沿。
触发电平设置:全速信号设为 1.5V 到 2V 之间,高速信号设为 200mV 左右。触发模式选 Normal,时基根据目标调整。抓单包时,全速用 500ns/div,高速用 50ns/div 到 100ns/div。如果想抓整段枚举过程,时基放到 2ms/div 甚至 10ms/div,并配合预触发深度把设备插入事件包含进来。
4.4 单次捕获与余晖:别再对着自动滚动模式发呆
抓 USB 波形,我强烈建议使用 Single 模式而不是 Run 模式。Run 模式在总线持续传输时看起来有波形,但屏幕每帧都在刷新,很多细节一闪而过,根本来不及分析。Single 模式捕获一屏后自动停止,你可以放大、测量、分析后再决定要不要重新抓。
抓重复数据包时,用 Single 模式连续抓 10 次,对比每次波形是否一致。起止位置如果不是同样类型的包,波形会乱七八糟,这往往说明触发没有对齐,需要重新调整触发电平或触发边沿。
做余晖测量时,在 Single 模式下连续捕获几十上百次,把每次波形叠加起来,可以模拟出类似眼图的效果。对于只有有限缓存但支持余晖显示的示波器,这是一种测试高速信号质量的实用“土办法”。
4.5 抓完波形先看一眼全貌
别急着放大波形。抓到一屏数据后,先看整体结构:几次明显的包、包与包之间是否有 SE0 复位段、整体幅度是否正常。很多情况下,问题的答案恰恰在包与包之间的大尺度时基上,比如两个包之间出现了意外的毛刺,或者每隔一段时间就出现一次异常的 SE0。先把大画面看清,再逐级放大到单 bit 级别,这个顺序能帮你省下大量时间。
5. 波形判读:识别速度模式、SOF 包与信号完整性问题
5.1 看幅度和位宽,反推当前处于什么速度
把之前那三种速度模式的参数表拿过来对照。波形上最直观的两个特征是幅度和位时间。
如果示波器显示 D+、D- 单端信号都是 3.3V 级别,位宽在 83ns 左右,那基本可以判定是全速。如果是 3.3V 级别,位宽却接近 667ns,那就是低速设备。如果单端信号幅度只有 0V 到 0.4V 左右,位宽约 2ns,那是高速信号无疑。
还有一种情况:速率切换瞬间,波形上能看到高幅度的 Chirp 序列后猛然变为低幅度数据流。这种从 3.3V 降到 400mV 的跳变,是 USB 完成高速握手最典型的视觉标志,也是判断设备有没有成功进入高速模式的最直观证据。
5.2 识别 SOF 包:找到固定节奏的“心跳”
在 USB 总线上,主机每隔约 1ms 会发一个 SOF 包,也就是 Start of Frame 帧起始包。即使设备不进行任何数据通信,全速和高速总线上也会持续出现 SOF。这简直是示波器抓包的“免费固定节奏源”。
SOF 包的结构是:同步序列 + PID + 帧号 + CRC5 + EOP。在波形上识别它时,先看是否周期性地出现一串短促的脉冲,间隔大约 1ms。全速 SOF 包很短,一包大约 1.5µs 左右,高速 SOF 更是微秒级别的窄脉冲。连续几个周期看到同样位置、同样长度的信号,基本可以确定是 SOF,这也说明总线枚举阶段已经完成,主机和设备已经建立了基本连接。
如果在总线上只看到 SOF,但看不到任何数据事务,那可能是设备处于空闲状态或者是设备地址分配后没有主机访问。如果想抓 BULK 传输,就要用实际读写操作来制造事务。
5.3 上升沿变缓、振铃、共模噪声,怎么判别
测量上升沿时,要看 10% 到 90% 的跨度。全速信号上升时间如果超过 20ns,或者高速信号上升时间明显超过 1ns,都说明信号链路存在额外负载。
常见原因是 PCB 走线过长、ESD 保护二极管电容过大、共模电感选择不当、母线和子板连接线太长等。还有一种很隐蔽的情况:示波器探头接地线过长造成的假振铃。当你看到波形边缘出现“叮叮当当”的振荡时,先换个短接地弹簧再测一次,别急着改硬件。
共模噪声的观察方法是看 CH1 和 CH2 两个单端信号是否“同方向上下乱跳”。差分信号的有效信息在两者之差里,如果两根线同时抬高或同时压低,差分波形不变,但单端波形会出现明显毛刺。差分探头能直接压制共模噪声,单端减法测量则会把共模噪声也带进结果里,所以测出差分波形上有毛刺时,要分清楚是真实共模噪声还是探头方式带来的。
5.4 用余晖模式仿造眼图轮廓
现代示波器如果自带 USB 眼图分析,可以直接启用。没有这项功能时,可以手动制造一个近似的眼图轮廓:把时基设置为刚好容纳一个位或几个 bit 的长度,触发设置为与数据边沿对齐,然后把余晖时间调到无限。连续捕获多次后,数据跳变沿会叠加,形成类似眼图的交叉线。
眼图中心区域的“眼睛”越干净、越开阔,信号质量越好。“眼睛”闭合变小,意味着存在较大的抖动或幅度衰减。注意,这种方式只能做定性观察,不能替代正式的一致性测试,但对于手头没有专用软件的老工程师来说,已经足够排查大多数信号完整性问题了。
6. 失败波形实例:幅度不足、边沿过缓与振铃的排查思路
6.1 幅度只有标称值一半,先查负载与上拉/下拉
抓到一个高速信号峰值只有 200mV 左右,而规范要求输出差动幅度通常在 360mV 到 440mV 之间。这种情况大致有几种可能:驱动端电流不足、终端电阻偏离、信号被分压或衰减、测试点反射叠加导致幅度被抵消。
排查路径要从探头本身开始。先确认探头衰减比和示波器档位是否匹配,再用标准方波校准源验证探头读数。排除了测量问题后,看 PCB 上的终端电阻:高速模式下,芯片内部或外部接收端有 45Ω 左右的终端网络,如果该电阻值异常,信号幅度就会跑偏。
全速信号如果幅度从 3.3V 掉到 2.2V 左右,重点检查 D+ 和 D-上的上拉电阻是否过大或电源被拉低。有些 ESD 保护器件在遭受静电后会发生漏电,导致信号幅度下降。把保护器件临时拆掉,再测一次,就能判断它是不是元凶。
6.2 上升沿缓得像在爬坡,优先排除探头和电容负载
全速信号的上升沿如果出现在 30ns 甚至更慢的量级,说明数据线的容性负载偏高,或者探头补偿有问题。先把探头补偿电容调到标准方波能干净显示方波角,再测一次。如果波形仍然缓慢,就要看线缆长度、PCB 走线、ESD 电容、滤波电容。
大量新手在接口上并联了一个 0.1µF 的去耦电容想“滤除干扰”,这在 USB 数据线上是致命的。USB 数据线的电容预算非常有限,全速模式下总线上允许的电容负载通常要求在几十皮法内,加一个 100nF 电容等于直接把信号边沿毁掉。如果看到上升沿特别缓,最可能的原因就是数据线上被放了不该放的电容。
6.3 波形振铃严重,阻抗匹配与接地回路两手抓
波形在上升沿之后出现明显的过冲和振铃,通常指向阻抗不连续。比如在 USB 线中间位置做测试点、使用杜邦线转接到示波器探头、或者经过过长的排针转接板,都会产生反射。这些外接附件形成的桩线越短越好,否则振铃会掩盖真实总线信号。
另一个容易被忽略的是地回路。示波器探头的地和被测电路的地之间如果存在较大噪声电位差,波形上也会出现振铃或高频分量。这种情况尤其在设备由适配器供电、示波器又接了保护地时容易出现。给示波器接一个隔离变压器或者把探头地直接接到设备 GND 的最近点上,往往能明显改善波形“脏”的问题。
6.4 只看到复位 Chirp,却没有后续高速数据包
高速设备插入后,如果波形上只有 3.3V 的 Chirp 序列,然后总线就回到空闲状态,没有出现 400mV 的高速数据流,说明高速握手失败,设备最终可能回退到了全速模式,或者根本没有完成枚举。
这时重点看 Chirp 序列是否完整。主机发出 Chirp K 后,设备要从 D+ 上拉状态切换为 Chirp K 响应;如果设备根本没有能力响应,波形上就不会出现完整的 KJ 交换。原因可能是设备固件不支持高速、芯片内部终端配置错误、或者晶体/时钟精度不足导致无法进入高速模式。示波器抓出这段时序后,再去查代码和芯片手册,定位范围会小很多。
| 波形现象 | 最可能原因 | 排查动作 |
|---|---|---|
| 高速幅度低于 300mV | 终端电阻异常、芯片驱动弱 | 查终端电阻与芯片配置 |
| 全速幅度低于 3V | 上拉电阻偏大、保护器件漏电 | 检查上拉和 ESD 器件 |
| 上升沿明显变缓 | 探头接地线过长、线上电容过大 | 换短接地弹簧、检查滤波电容 |
| 波形振铃明显 | 阻抗不连续、测试点桩线过长 | 缩短转接线路、改到连接器附近测 |
| 只看到 Chirp 无数据流 | 高速握手失败、固件不支持 | 抓完整复位时序、检查固件配置 |
6.5 写到最后想分享的一个习惯
我自己的习惯是每抓到一组波形,就把屏幕截图/导出 CSV 存下来,标注测试条件、设备状态、示波器型号与探头型号。等哪天产品出问题回头排查时,这些“历史波形”就是最好的参照物。没有这些对照,判断当前波形“好还是不好”全靠记忆,那真的不太靠谱。
如果你刚接触 USB 物理层,第一次抓波抓到一堆看不懂的信号是非常正常的。别急着怀疑示波器坏了,先把时基拉大,看看有没有周期性的 SOF 包;再放大,看看单端和差分的区别;最后再调触发,反复抓几个同类型的数据包做对比。按这个顺序走几轮,D+/D- 的脾气你也就摸清楚了。