搞USB设备调试,最让人抓狂的场景一般是两种:一是设备插上电脑后半点反应没有,枚举失败;二是明明能识别,但一跑大数据量传输就丢包、断连,而且只在某些电脑上复现。前一种情况查电源、查上拉电阻、查ID线还能有点头绪,后一种情况往往和物理层的信号质量有关,但很多人手里只有逻辑分析仪,看不到模拟波形,根本无从下手。这时候就得请出示波器,直接抓USB2.0的D+/D-信号,看波形到底长什么样。
这篇文章就是一次完整的USB2.0物理层实战记录。我会从D+/D-信号的基础知识讲起,再把示波器选型、探头连接、触发设置、波形分析这些环节挨个拆开,最后附上我实际调试中踩过的坑和排查思路。适合刚接触USB的嵌入式工程师、硬件工程师,以及想搞懂“示波器到底怎么测USB”的学生朋友。
1. USB2.0物理层信号基础:D+/D-到底在传什么
1.1 三种速率模式,别再把“高速”和“全速”搞混
USB2.0这个规范其实覆盖了三种速率,很多新手容易绕晕。低速(Low Speed)是1.5Mbps,全速(Full Speed)是12Mbps,高速(High Speed)才是USB2.0标志性的480Mbps。很多人张嘴就是“USB2.0跑480M”,这话不算错,但不完整——USB2.0设备完全可以只工作在12Mbps甚至1.5Mbps,比如鼠标键盘大多是低速,很多HID设备和音频设备是全速,U盘、移动硬盘这类才普遍走高速。
这三种速率在物理层上的区别,直接体现在D+/D-两根线的角色上。设备端会通过一个1.5kΩ上拉电阻把D+或D-拉到3.3V,主机看到哪根线被拉高,就知道设备支持什么速率:D+被拉高表示全速设备,D-被拉高表示低速设备。如果设备能在全速和高速之间切换,那上拉电阻在D+上,枚举时通过高速握手协议再切换到高速模式。
这就引出一个基础但关键的点:测USB信号之前,先搞清楚被测设备跑在哪个速率,因为不同速率的电气特性完全不同,示波器设置也差很远。高速模式下信号幅度只有400mV左右,上升沿快到纳秒级以内,而全速模式是3.3V左右的满摆幅信号,上升沿是4到20ns。用一套参数去测两种信号,要么看不到细节,要么全是假象。
1.2 差分信号的电气本质,为什么D+/D-成对出现
USB的数据线不是两根各说各话的单端线,而是一对差分线。所谓差分,就是逻辑状态由两根线的电压差决定,而不是看单根线相对地的绝对电压。以全速模式为例,J状态是D+高、D-低,K状态是D+低、D-高,接收端读的是(D+减D-)这个差值。
采用差分传输最大的好处是抗共模干扰。外界噪声、地电位波动、电源纹波这类干扰通常同时叠加在D+和D-上,差分相减之后干扰就被抵消掉了,只要差值还在阈值范围内,数据就能正确还原。另外差分信号的回流路径比较集中,对外辐射也小,这对EMI控制很有帮助。
到了高速模式,驱动方式也变了。全速和低速是电压型驱动,输出高电平接近3.3V;高速模式则是电流型驱动配合终端匹配,信号幅度只有约400mV的量级。因为速率上去了,满摆幅的3.3V翻转会产生巨大的瞬态电流和振铃,必须靠小摆幅加阻抗匹配来控制信号完整性。这也是为什么测高速USB信号时,探头的负载效应会非常明显——探头本身的电容和阻抗就可能把信号压垮。
1.3 J、K、SE0状态和枚举握手,抓住该抓的波形
USB物理层的数据编码是NRZI,即电平翻转表示0,电平不变表示1,配合位填充来保证时钟恢复。但抓波形的时候先不用管数据位那么复杂,先把总线状态搞明白。
J和K是两种差分状态,上面提到过;SE0则是D+和D-都为低电平,表示复位或EOP(包结束)。全速模式下总线空闲时处于J状态,也就是D+高、D-低。数据包传输前,发送端会把总线从J切到K,这个J到K的边沿就是SOP(包起始),紧跟其后的是同步字段SYNC,然后是数据、CRC、EOP。
高速握手的过程也值得抓一抓。全速设备插入后,D+被上拉,主机检测到这个状态后先发出至少10ms的SE0复位信号,然后如果主机和终端都支持高速,主机会发出Chirp K,设备检测到后再回应Chirp K,随后两方交替发送KJ序列,完成高速握手后切换到高速模式。这一整套过程中,D+/D-上会呈现一系列特征极强的波形,非常适合用示波器验证。
| 总线状态 | D+电平 | D-电平 | 典型含义 |
|---|---|---|---|
| J(全速) | 高 | 低 | 空闲状态、数据1 |
| K(全速) | 低 | 高 | 数据0 |
| SE0 | 低 | 低 | 复位、EOP |
| Chirp K | 低(相对) | 高(相对) | 高速握手起始 |
2. 测试准备:示波器、探头与信号引出的讲究
2.1 示波器带宽和采样率怎么算,才不至于白花钱
测USB信号,第一道坎就是示波器的带宽。很多人拿着100MHz的入门示波器兴冲冲去测480Mbps的高速USB,出来一条圆滚滚的“正弦波”,还以为自己抓到了。这其实是带宽不够,高频谐波全被滤掉了。
经验做法是给信号基频留至少5倍带宽余量。全速12Mbps信号,基频大约6MHz,要看清楚上升沿至少需要50到60MHz带宽,100MHz的示波器勉强够用,这也是DS1054Z这类机器能看全速USB的原因。但高速480Mbps信号基频在240MHz左右,上升沿更是快到几百皮秒,带宽没有500MHz以上的示波器根本别想看到真实波形,推荐直接上1GHz。
采样率也马虎不得。按照示波器通用经验,采样率至少是带宽的5倍,测高速USB建议至少2.5GSa/s到5GSa/s。采样率不够会出现混叠,波形上会出现实际上不存在的频率成分,误导判断。特别提醒:示波器标称采样率只是最高值,打开多通道同时测量时采样率往往对半砍,测D+/D-要占两个通道,这点必须提前确认。
2.2 探头选型:x1和x10差距很大,阻抗匹配别忽略
探头选择直接影响测量结果,尤其是高速信号。x1探头带宽通常只有6到10MHz,输入电容高达几十到上百皮法,接上去就把信号带崩了,只适合看低频调试。x10探头输入电容小得多,一般在8到20pF,带宽能做到100MHz甚至500MHz以上,测USB全速以上必须用x10。
这里有一个新手很容易踩的坑:x10探头本身是1MΩ高阻抗输入,但高速信号测量里,1MΩ并联的十几皮法电容在高频下已经构成不小的负载。测12Mbps的全速信号问题不大,但测480Mbps高速信号时,探头电容会改变信号边沿,甚至导致测出来的幅度偏小、上升沿变缓。仪器厂家之所以推荐有源差分探头,就是因为其输入电容只有1pF上下,且阻抗平坦。
测D+/D-还有一个方案问题:用单端探头分别测D+和D-,然后在示波器上做A减B的数学运算得到差分波形。这个方法看全速信号完全够用,看高速信号则要求两根探头型号相同、延迟一致(示波器有deskew功能的话先校一下),而且只能作为一种参考,不能替代真正的差分探头。如果条件允许,哪怕去实验室借一支有源差分探头,测试结果的信服力会高很多。
提示:测量前务必做探头补偿校准。把探头接到示波器自带的1kHz方波输出,调节探头上的可调电容,直到方波顶角平整、无过冲无圆角。这一步不做好,后面所有波形细节都不可信。
2.3 把信号从板上引出来,比选示波器更容易翻车
示波器和探头都到位了,信号从哪儿抓?我见过不少人把探头地夹直接夹在USB连接器金属外壳上,探头针尖怼到D+焊盘上,结果波形一塌糊涂,还怪示波器不行。
问题是探头地线太长。无源探头标配的地线是一条长长的鳄鱼夹线,这会在测量回路里引入寄生电感,高频下形成严重谐振,表现为波形上叠加一大堆振铃。正确做法是使用探头自带的短接地弹簧,或者用极短的导线把探头地和测试点地连起来,让测量回路尽量小。这是高速信号测量的基本功。
更稳妥的办法是在PCB设计阶段就预留测试点。D+和D-信号线上预留焊盘或测试孔,附近预留地过孔,串阻、测试点之类都安排好,调试时直接焊线上去。如果没有预留,一个实用的替代方案是自制USB延长线夹具,把D+/D-和地单独引到排针上,注意引线尽量短,D+/D-两根线等长,避免引入额外阻抗不连续。
还有一个坑是地环路。示波器通过电源线接地,如果被测设备或电脑是两脚适配器悬浮供电,两者地电位可能有明显差异,接上探头地线的瞬间电流会通过探头地和信号地形成环路,轻则波形噪声大,重则烧接口。测之前先确认所有设备共地,必要时用万用表量一下探头地和USB地之间的电压差,超过几伏就要想想办法了。
3. 示波器抓取D+/D-信号的完整操作步骤
3.1 第一步:通道设置和探头补偿,别跳过
把示波器打开,通道1接D+,通道2接D-,都用x10探头。通道输入阻抗设为1MΩ,耦合方式用直流耦合——因为要看到信号的直流电平(比如全速的3.3V高电平、SE0的0V),交流耦合会把平台电平滤掉,直接影响状态判断。如果示波器有带宽限制功能,测全速信号可以开20MHz限带滤掉噪声,但测高速信号千万别开。
然后做探头补偿。把探头针尖接到示波器前面板的补偿信号输出端(一般是1kHz方波),用探头自带的小一字螺丝刀调节补偿电容,直到屏幕上出现完美的方波,边沿挺拔、顶部平直、无过冲无圆弧。这一步花不了30秒,但它决定了你能不能在波形上分辨真实的信号边沿。
存储深度也顺手调大。如果示波器支持,把存储深度调到最大或较大档位,这样抓长时基信号时还能保持足够采样率,不会出现波形细节全丢的情况。很多示波器默认存储深度很小,时基一放大波形就失真,这是测USB这类快慢混合信号的大忌。
3.2 第二步:触发设置,决定你能否抓到想看的信号
抓USB信号,触发是整个操作的灵魂。测全速或低速USB时,最简单的做法是把触发源设为D+通道,触发边沿选下降沿,触发电平设置在1V到2V之间。为什么选D+下降沿?因为全速设备空闲时D+是高电平,SOP起始时D+由高跳低,在D+下降沿触发就能抓到数据包的起始位置。
如果要用Single单次捕获模式(示波器上的single键),务必先把触发模式设为Normal(普通触发),然后把时基和触发电平都设好,再按single准备就绪。插上USB设备后,示波器检测到满足触发条件的边沿就会完成一次捕获。因为USB枚举过程只发生一次,Single模式是首选,不然屏幕会被后续不断刷新的波形覆盖,你还没看清就没了。
抓高速握手的话,思路略有不同。要抓主机发出的Chirp K,触发源可以选D-通道、上升沿触发,因为Chirp K起始时D-从低跳高;要抓完整的枚举过程,先触发在D+下降沿,用较大时基(比如5ms/div)把复位和Chirp整体框住,再放大观察细节。高端示波器如果带USB协议触发功能,能直接按SOP、复位等事件触发,省很多事,但普通机器靠边沿触发也完全能做。
注意:如果示波器支持多窗口或Zoom功能,建议用时基先抓全局,再用水平缩放看局部波形。USB枚举过程是ms级别的,而高速信号细节是ns级别的,一幅固定时基的截图往往是看不全的。
3.3 第三步:插入设备,捕获完整的枚举过程
设置都完成后,实际操作很简单。以抓U盘枚举为例:示波器时基先设到5ms/div,触发源D+下降沿,触发电平约1.5V,触发模式Normal,按Single进入等待。然后插上U盘,示波器应当自动捕获从插入到枚举结束的一段波形。
这时屏幕上的原始波形可能密密麻麻,别急着放大。先从大时基看整体过程:D+从0V跳到3.3V(上拉生效),然后拉低到0V并保持(主机发出SE0复位),复位结束后进入高速握手阶段,D+/D-上出现一系列小幅度的交替跳变,最后总线进入高速空闲状态(D+和D-都接近0V,因为高速模式空闲时没有FS那样的3.3V上拉偏置)。
放大到Chirp K细节时,会看到这一阶段信号幅度明显比全速的3.3V小很多,大约几百毫伏级别,这正是高速驱动器在工作。再放大到一条完整的高速数据包,可以看到D+和D-彼此镜像翻转的随机波形,总线空闲时没有差分电压。这个波形形态基本就是USB2.0高速物理层的典型画像。
4. 波形分析:抓回来了,怎么判信号好坏
4.1 全速波形的判读要点,先看电平再看边沿
抓回一段全速USB数据包波形后,第一件事是看总线状态对不对。全速空闲时D+应该在3.3V附近,D-在0V附近;数据包传输过程中,两线交替翻转,翻转方向符合NRZI编码的规则;包结束时可以看到一段D+和D-同时为低的SE0,这是EOP的最典型特征。
接下来看信号质量。重点测量上升时间和下降时间,全速信号规范要求边沿时间在4ns到20ns之间,过慢的边沿说明驱动能力不足或线上负载太重。再看过冲和下冲,理想的方波边沿应该是单调的,如果边沿顶部出现上冲尖峰,或者边沿中途出现台阶、回退,都说明阻抗不连续或反射存在。
我遇到过一种常见情况:测出来的全速波形上升时间只有2ns左右,比规范还“快”,这其实不一定是好事,往往意味着驱动器过强或走线阻抗偏高,信号反射明显,表现出来就是严重的振铃。这种振铃如果幅度超过接收端的阈值区间,数据就可能误判。判断标准不是“能不能跑”,而是“留有多少余量”。
测全速信号还有一个技巧:把D+和D-做A减B差分运算,看差分波形。差分波形看起来更像一个干净的双极性信号,J状态是正电平,K状态是负电平,SE0是零电平。差分波形的对称性能直观反映D+/D-两路的匹配程度,如果正半周和负半周幅度明显不一样,那问题多半出在其中一路的走线、焊盘或保护器件上。
4.2 高速握手和480Mbps的数据波形,重点是幅度和抖动
全速波形大家都会看,真正难的是高速信号。因为幅度只有400mV左右,很多习惯看3.3V逻辑波形的人会觉得“这信号是不是有问题”,其实这是正常现象。高速模式下D+/D-空闲时没有偏置电压,传输数据时两线在0V和约400mV之间高速切换,差分波形则是约正负400mV的双极性信号。
看高速信号,第一关注点是眼图的“张开度”。用示波器的无限余辉模式,让大量数据位不断叠加显示,就能看到类似眼睛的形状。眼高代表信噪比余量,如果眼高明显小于模板要求,信号抗噪能力就差;眼宽代表时序余量,眼宽越小说明抖动越大,接收端时钟恢复越容易失败。带有USB一致性测试功能的示波器可以直接套用眼图模板和抖动分析,普通示波器只能靠无限余辉做一个定性观察。
第二关注点是信号完整性的几个硬指标:上升时间、过冲、单端信号幅度。高速模式的上升时间大约在500ps到几个ns的范围,如果明显偏慢,要看探头负载、走线长度、保护器件电容是不是太大。信号幅度如果在有效值明显偏离400mV,要检查端接电阻是否正常,测量点是否离驱动器太远。
针对高速信号,有个值得尝试的做法:把CSV格式的波形数据从示波器导出到电脑,用Python或MATLAB做进一步分析,比如做眼图、测抖动、算上升沿的统计分布。示波器屏幕上看不到的细节,在软件里往往一目了然。这也是为什么我建议存储深度选大一点,数据量不够就分析不出东西。
4.3 实战案例:批量枚举失败的一块板子,波形一眼定位
去年调试过一块USB设备板子,现象很典型:十块样板里有两三块插到电脑上偶尔枚举失败,重插一次可能又好了。查电源、换芯片、重新刷固件都试过,问题还在。最后用示波器测全速枚举波形,立刻发现了问题。
抓到的波形里,复位结束后的高速握手阶段,Chirp K信号幅度明显偏小,而且D-上升沿很缓慢,带着一个明显的不单调台阶。对比正常板子的波形,差距一眼就能看出来。进一步检查D-线路上的一颗ESD保护管,发现它的寄生电容偏大,手册上标注5pF,实测反而接近10pF。这个额外电容在高速握手时形成了低通滤波效果,导致边沿变缓、幅度衰减,偶尔触发不了随后主机与设备之间的KJKJ交换,于是枚举失败。
替换掉那批ESD器件后,同型号示波器下波形恢复正常,枚举失败率归零。这个案例没什么玄学,纯粹是物理层信号质量问题导致的偶发故障。如果不是直接看D+/D-波形,而是靠调固件、换驱动,可能几天都定位不到根因。
5. 常见问题与排查经验速查
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 插上USB设备后示波器没有任何反应 | 触发电平设置不对、触发源选错、时基太长或太短、Single模式没有正确等待 | 先按Auto或Normal确认D+/D-上电平时正常,再调触发电平到信号中间位置,重试Single捕获 |
| 抓到的波形噪声巨大、叠加高频振铃 | 探头地线过长、地环路、探头未补偿、带宽限制没开 | 换短接地弹簧、确认共地、重新做探头补偿、全速信号打开20MHz带宽限制 |
| 全速波形上升沿明显过缓 | 线上容性负载偏大(ESD器件、走线过长)、驱动弱、探头x1误用为x10 | 检查保护器件电容,确认x10探头,检查测量点位置 |
| 高速信号测出来幅度只有200mV甚至更低 | 探头负载效应、单端探头测量引入衰减、测量点离终端电阻太远、带宽不足 | 尽量用有源差分探头测高速信号,确认示波器带宽不低于500MHz |
| D+/D-两路波形明显不对称 | 单端驱动不平衡、D+/D-走线不对称、某一端保护器件参数离散 | 对比两路上升时间和幅度,检查PCB布局对称性 |
| 接上示波器后原本正常的USB设备开始异常 | 探头电容负载过大、地环路引入干扰、共地不良 | 换低电容探头,检查地电位差,必要时加隔离措施 |
排查时还要记住一个原则:协议逻辑问题和物理层问题是两个层面。如果逻辑分析仪显示数据包内容错误、CRC失败,那是协议层问题,用示波器也能看到对应位置但难以直接定位;如果逻辑分析仪看到的总线时序混乱、电平跳变不对,那大概率是物理层问题,一定要回到示波器看模拟波形。两者配合使用,而不是互相替代。
再提一个实用技巧:现在不少示波器(比如普源、鼎盐的中端型号)支持USB协议解码选项,可以同时显示物理波形和解码出的PID、地址、端点信息。调试USB设备时,把协议解码打开,你能把“某个数据包传输异常”直接对应到波形上的具体位置,比对着NRZI编码手工数位(那真的是折磨)高效太多。如果手里示波器没有USB解码,抓波形后用导出的CSV数据在PC端用软件解码分析也是可以的。
最后分享一个我自己的习惯。每次测USB信号,我都会先看一眼设备在全速模式下的完整枚举波形,确保D+上拉、SE0复位这些基本过程都正常,再逐级放大看高速握手和数据包细节。这套流程虽然看起来多花了几分钟,但能避免很多“抓了半天才发现触发条件没设对”的返工。工具好不好用,往往不在于多贵,而在于你对它的使用场景理解得有多透。