ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

USB 2.0物理层实战:示波器抓取D+/D-信号波形指南

USB 2.0物理层实战:示波器抓取D+/D-信号波形指南 做 USB 调试这几年我越来越觉得物理层才是整个 USB 链路里最“真实”的一层。协议分析仪能告诉你总线上跑了什么包但信号到底长什么样、边沿干不干净、幅度够不够、有没有反射振铃这些只有示波器抓下来才知道。这篇博文我想完整复盘一遍 USB2.0 物理层的实战测量方法从示波器选型、探头设置到如何触发抓取 D/D- 波形再到波形分析和常见问题的排查方向。无论你是做嵌入式开发、硬件设计还是刚入门想搞懂 USB 总线的小白只要手里有一台示波器跟着这篇文章走一遍就能自己动手抓 USB 信号了。1. 项目概述与核心需求解析1.1 USB2.0 物理层到底测什么USB 2.0 总线有三种速率模式低速 1.5Mbps、全速 12Mbps、高速 480Mbps。日常我们接触最多的是全速和高速这两种。物理层测试的核心就是把 D 和 D- 这对差分线上的电信号完整抓下来然后检查它的电压幅度、边沿速率、时序关系是否符合 USB 2.0 规范中的电气要求。很多人会问协议分析仪不也能抓到总线数据吗为什么非要用示波器看物理层这两个工具的定位完全不同。逻辑分析仪和协议分析仪看的是“0 和 1”把差分信号解码成包然后告诉你这是 SOF、这是 SETUP、这是 DATA0。但信号在传输过程中如果幅度衰减、边沿变缓、或者出现了振铃协议分析仪不一定能及时发现因为解码层面可能还是通的只是裕量已经很小了。等到温度变化、线缆加长、负载加重问题就会突然爆发。用示波器抓 D/D- 信号本质上是在看信号“健不健康”而不是只看“有没有数据”。对于嵌入式工程师来说最常见的排查场景是设备插上电脑偶尔不识别或者识别了但跑大流量时丢包甚至高速模式协商不上只能降级到全速。这些问题十有八九根因在物理层需要抓波形定位。1.2 一次完整的物理层测量需要哪些装备在开始动手之前先盘一下装备。一套能用的 USB 2.0 物理层测量环境包含示波器、探头、被测设备和一段能触发总线活动的“导演工具”。示波器是核心设备但这里有个误区不是所有示波器都能测 USB 的。高速 480Mbps 的模式对示波器带宽有一定要求这个问题我们后面详细说。总的原则是测全速和低速不需要特别好的示波器但测高速模式必须注意带宽和采样率。被测设备可以是任何带 USB 接口的板子比如 STM32 开发板、树莓派、USB 转串口模块、U 盘都可以。关键是你要能控制它发起 USB 活动比如插拔设备触发枚举或者持续进行数据传输。“导演工具”指的是能主动创造 USB 总线事件的手段。最简单的是手动插拔 USB 设备来触发枚举过程也可以用上位机脚本让设备持续跑 bulk 传输。比如用 Python 的 pyusb 库写个循环让设备不断读取数据示波器就能稳定抓到大量总线活动。最后还需要一个可靠的接地参考。很多人在这一步图省事结果抓出来的波形全是噪声。探头的接地夹子要牢固地夹在 USB 连接器的金属外壳或电路板的 GND 焊盘上接地线也要尽量短。2. 示波器与探头的选型配置2.1 带宽和采样率怎么选才够用示波器选型是决定测量成败的第一关但很多人恰恰在这一步上栽了跟头。我见过不少朋友拿一台 100MHz 带宽的示波器直接去测 480Mbps 的高速信号结果屏幕上显示的全是边沿圆滑的“正弦波”根本看不出数字信号该有的陡峭跳变。为什么会这样原因在于 USB 2.0 高速模式的信号上升沿非常快典型值在 500ps 到 1ns 量级。根据测量经验要想比较准确地观察数字信号的边沿示波器带宽至少要是信号最高频率分量的 3 到 5 倍。480Mbps 的数据率基频是 240MHz但实际信号包含丰富的三次、五次谐波成分如果示波器带宽不够这些高次谐波会被滤掉波形自然就“圆”了。具体到选型建议我给的参数是这样的测低速 1.5Mbps 和全速 12Mbps100MHz 带宽示波器完全够用200MHz 更好测高速 480Mbps500MHz 是底线推荐 1GHz 以上带宽的示波器。采样率方面按照奈奎斯特定理至少需要 2 倍于信号最高频率的采样率但实际操作中这个下限远远不够。抓 USB 2.0 高速信号建议采样率不低于 4Gs/s这样每个 bit 大约能采到 8 到 9 个点重建出的波形才比较平滑可靠。如果是学校实验室或者个人工作室只有一台 200MHz 左右的示波器是不是就没法测 USB 了也不完全是。测全速模式绰绰有余测高速模式时也能抓到包级别的波形看到信号的大致轮廓和触发时序只是边沿分析、眼图测量这些精细活就做不了了。这种条件下的定位思路是“先确认大框架对不对”把示波器作为逻辑分析仪的补充来用。2.2 探头 x1 和 x10 的差异与阻抗匹配探头是示波器测量链路里最容易被忽视的环节但它直接影响你看到的波形是“真相”还是“假象”。市面上常见的无源探头顶端通常有一个拨挡可以切换 x1 和 x10 两种衰减模式。x1 档的模式下信号直接进入示波器没有经过电阻分压灵敏度最高。但代价是输入电容很大通常超过 100pF而且带宽只有 6MHz 到 10MHz 左右。用 x1 档去测 USB 高速信号探头自身的电容会严重加载被测电路信号被衰减和畸变看到的波形和真实信号完全是两回事。x10 档则通过探头内部的 9MΩ 电阻和示波器输入端的 1MΩ 电阻构成 10:1 分压输入电容显著降低典型值在 10pF 左右带宽可以达到 500MHz 甚至更高。测 USB 信号无论是全速还是高速默认都应该用 x10 档这是测高速数字信号的基本常识。阻抗匹配这件事也得说清楚。USB 差分对的特性阻抗是 90Ω差分阻抗两条线对地的单端阻抗则是 45Ω 左右。示波器探头接上去以后探头输入阻抗越高对被测电路的影响越小。x10 探头的输入阻抗是 10MΩ 并联约 10pF对绝大多数 USB 测试点来说这个负载已经足够轻微了。但有一个细节大家在实操中很容易忽略探头的接地方式。普通的长接地鳄鱼夹在低频下没问题但在高频测量时接地引线会引入寄生电感和探头输入电容形成谐振导致波形上叠加明显的振铃。测 USB 高速信号时建议换上探头自带的短接地弹簧也叫接地针把接地回路的长度缩短到最短这样抓到的边沿和振铃才是真实的信号特性。还有一个容易踩的坑如果示波器有 50Ω 输入阻抗模式千万别把 x10 无源探头接到这个模式上。x10 探头是按照 1MΩ 输入阻抗设计的接到 50Ω 模式以后分压比完全错乱信号会被大幅衰减测出来的幅度会严重偏低。50Ω 模式通常是给有源探头或专用射频探头用的普通无源探头老老实实用 1MΩ。3. 抓取 D/D- 信号的核心操作流程3.1 测量前的准备链路搭建与测试点选择测量准备这一步看起来简单但做得不好后面抓到的波形全是废的。先解决测试点选择的问题。最理想的测量位置是在 PCB 上预留测试焊盘比如在 D 和 D- 走线上各引出一个过孔或焊盘标注在丝印层方便示波器探头接入。如果板子没有预留也可以直接在 USB 连接器的 D、D- 针脚上测量。要注意的是飞线要尽量短D 和 D- 两条线最好等长、靠近保持差分对称性如果一根飞线特别长另一根特别短测出来的差分波形会变形。接下来设置示波器通道。把 D 接到 CH1D- 接到 CH2探头拨到 x10垂直标度先放在 500mV/div。为什么从 500mV/div 开始因为全速模式的单端信号摆幅是 0 到 3.3V而高速模式差分摆幅典型值是 400mV 左右500mV/div 能把两种模式的主要信号都涵盖进来不至于一开始就削顶或者看不到。时基设置上不同场景差别很大。抓枚举全过程先放到 10ms/div 或 20ms/div抓高速握手细节缩到 20us/div 左右抓单个包再缩到 100ns/div 甚至更小。我的习惯是从大时基开始看整体确认信号存在之后再逐渐缩小时基看细节。在测量前还有一个很重要的准备动作确认探头接地可靠。把探头接到 D 通道观察示波器底噪。如果噪声幅度超过 50mV多半是接地夹子接触不良或者接地线太长。这个问题不解决后面抓到的波形会很难看。另外如果示波器有带宽限制功能建议先关掉否则它会影响高频成分的显示。3.2 触发设置与单次捕获示波器抓 USB 总线信号最大的难点不是怎么接线而是怎么让示波器在正确的时刻触发。如果是抓枚举过程标准做法是把示波器切到 Single单次触发模式触发源设为 CH1D 通道触发类型选上升沿触发电平设为 1V 左右。然后把 USB 设备插入电脑。当 D 上出现第一个由低到高的跳变时示波器立即触发捕获整个事件前后的一段波形。为什么触发源用 D 而不是 D-因为 USB 2.0 规范里设备连接检测就是通过 D 或 D- 的上拉电阻实现的。全速和高速设备会在 D 上接一个 1.5kΩ 上拉电阻低速设备则在 D- 上接上拉电阻。所以当全速或高速设备插入时D 会从低电平被拉到高电平这个跳变就是示波器最理想的触发点。还有一个小技巧合理设置预触发Pre-trigger时间。预触发让示波器在触发事件来临之前就持续记录波形这样捕获到的数据里既有触发点之前的内容也有触发点之后的内容。抓 USB 枚举时我习惯把预触发设在 10% 到 20% 的水平这样能看到设备插入前 D/D- 处于空闲状态的电平方便对照。如果是要抓高速传输的数据包而且示波器不带 USB 触发功能可以用两个土办法。第一个是用 D 的上升沿触发抓取高速握手序列第二个是把时基拉长到 100us/div 以上用长时基连续采集捕获一段包含多个包的总线活动之后在暂停的波形上用缩放功能慢慢找目标包。第二种方法看起来笨但能同时看到空闲态、SOF、数据包之间的完整时序关系对排查帧间隔异常之类的问题特别有效。3.3 抓取枚举过程的完整时序USB 2.0 的枚举过程是整个物理层调试里最值得抓的场景因为它在很短的时间内完整覆盖了从设备插入、复位、高速握手到正常传输几乎所有的物理层事件。只要设备存在识别问题抓一轮完整枚举波形基本就能定位到是哪个阶段出了岔子。先梳理一下枚举过程中的物理层事件时间线。设备插入瞬间D 被上拉电阻拉到 3.3V全速/高速设备。主机检测到这个电平变化后开始发送复位信号也就是 SE0 状态D 和 D- 同时拉低这个状态需要持续至少 10ms。如果是高速设备在复位期间会有一个特殊动作设备端发出 chirp K 序列D 低、D- 高以此告诉主机“我支持高速模式”。主机收到后以自己的 chirp K-J-K-J 序列回应双方完成高速握手。握手成功后设备切换到高速模式驱动方式从电压驱动变为电流驱动信号摆幅从 3.3V 降到约 400mV。之后主机才开始发送 SOF 包进入正常的枚举流程。把示波器时基放到 10ms/div 到 20ms/div抓完整条序列你会看到整个过程中信号幅度会发生两次明显跳变一次是插入时 D 从 0 跳到 3.3V另一次是高速握手后信号幅度从 3.3V 级别降到 400mV 级别。如果第二次跳变没有出现说明高速握手失败了设备可能以全速模式继续工作或者枚举失败。实际操作中我的做法是分两轮测量。第一轮用 20ms/div 抓完整枚举过程确认整体框架大致判断设备是在复位、握手、还是地址配置阶段出了问题。第二轮根据第一轮发现的疑点把时基缩到 20us/div 到 200ns/div专门抓高速握手那一段或者单个包的结构做精细化分析。4. 波形分析与实测记录4.1 看懂 USB2.0 的差分信号状态抓到了波形还得会看。很多人第一次把 D/D- 波形抓下来看到一团不断翻转的信号完全不知道从哪下手。这里先讲清楚 USB 2.0 物理层最基本的状态定义。USB 总线上的信号状态是由 D 和 D- 两条线的电平组合决定的。最常见的几个状态是J 状态、K 状态、SE0 状态和 SE1 状态。J 和 K 是相反的两个状态在高速和全速模式下J 状态是 D 高、D- 低K 状态是 D 低、D- 高但在低速模式下正好反过来J 状态是 D 低、D- 高。SE0 指的是 D 和 D- 同时为低SE1 指的是两条线同时为高后者是非法状态正常总线上不应该出现。为什么需要区分钟状态因为 USB 数据并不是简单的“高电平代表 1、低电平代表 0”。USB 2.0 用的是 NRZI 编码有电平翻转表示逻辑 0没有翻转表示逻辑 1。为了防止连续传多个 1 导致总线上长时间没有翻转规范还规定数据里连续出现 6 个 1 之后必须插入一个 0这叫位填充bit-stuffing。这些规则在物理层波形上的体现就是你不会在波形里看到长时间没有边沿变化的情况。实际看波形时我习惯把 CH1 标成 D、CH2 标成 D-然后在示波器上开一个数学通道设置为 CH1 减去 CH2这就是差分信号 M1。差分波形的高度直接反映信号摆幅高速模式差分摆幅约 400mV峰峰值约 800mV全速模式差分摆幅约 3.3V。同时也可以观察共模电压高速模式下差分波形会围绕 200mV 左右的中心电平上下摆动。在波形上标注这几种状态你会看到空闲状态一般是 J 状态数据包开始时是 J 到 K 的跳变SOP数据结束后是 SE0EOP。一套标准的枚举波形里这些状态会依次出现非常有规律。4.2 从波形中识别包结构和时序异常识别包结构是波形分析的进阶技能。一旦你学会在示波器上认出 SOF、SETUP、DATA 这些包的物理特征调试效率会大幅提升。一个 USB 包在物理层由几部分组成SOP包起始、SYNC同步字段、PID包标识、数据字段、CRC校验、EOP包结束。以全速模式为例SOP 表现为从空闲的 J 状态跳变到 K 状态这标志着包里第一个 bit 的开始。SYNC 字段是一串固定的位序列全速是 8 个 bit“00000001”高速是 32 个 bit在波形上就是一段密集、均匀的高低翻转容易被识别出来。SYNC 之后是 PID 字段8 个 bit其中低 4 位是包类型编码高 4 位是低 4 位的反码用于校验。比如 SOF 包的 PID 是 0xA5二进制 10100101SETUP 包是 0xB4DATA0 是 0xC3DATA1 是 0x4B。EOP 在 USB 全速/低速模式下是 SE0 状态持续 2 个位时间然后回到 J 状态。在看单个包波形时我会按三步走。第一步看 SYNC 之后是否出现预期的 PID 波形确认这个包的类型。第二步看包内数据的边沿质量——边沿是否陡峭、有没有过冲、有没有平坦平台。第三步看 EOP 是否完整SE0 的持续时间是否合规收尾是否干净。如果边沿很缓或者出现明显的振铃大概率是走线阻抗不连续、ESD 器件电容过大、或者 PCB 走线上有过孔阻抗突变导致的反射。如果差分幅度偏低尤其是高速模式低于 300mV可能是链路损耗太大或者 D、D- 两条走线长度不匹配导致差分信号被共模化。4.3 眼图测量与信号质量评估眼图分析是物理层信号质量评估的终极手段几乎所有 USB 一致性测试都会用到带模板的眼图。当你把所有 bit 的波形叠加在一起显示屏幕上就会出现类似人眼的图案“眼图”由此得名。眼图能直观反映三个关键参数眼高也就是眼图的垂直开口大小反映电压裕量眼宽即水平开口大小反映时序裕量抖动即边沿位置的随机波动反映时序稳定性。示波器内部会用标准模板去匹配眼图如果信号落在模板的禁区里就说明信号质量不达标。测眼图是有门槛的。首先示波器带宽至少要 1GHz 以上采样率不低于 5Gs/s否则测出来的眼图失真严重没有说服力。其次需要捕获足够多的数据量通常要几千上万个 bit 才有统计意义。普通的低频示波器抓到的“眼图”波形稀疏、开口巨大参考价值不大。如果你的示波器没有内置眼图功能还有一个土办法使用长余晖模式Persist。把示波器切到余晖显示并让它持续采集总线上的数据屏幕上会逐渐叠加出类似眼图的轮廓。这种方法能定性看出信号大致裕量但不能替代标准的眼图模板测试。我的经验是日常调试不要一上来就测眼图。眼图更像是“验收工具”适合产品定型、量产前做一致性验证而平时排查问题阶段先用单次触发抓包分析边沿、幅度、时序效率反而更高。先把能用普通手段定位的问题解决掉最后再上眼图确认信号裕量这是性价比最高的流程。5. 常见问题与排查技巧实录5.1 抓不到信号的常见原因与对策在实际操作中最容易让人抓狂的问题就是“示波器没反应”。我总结了一下抓不到 USB 信号的原因不外乎以下几种。第一种是触发设置不对。触发源选错通道或者触发电平高于信号实际摆幅。比如全速模式下 D 高电平是 3.3V你把触发电平设在 2.5V 是可以的但如果你测的是高速模式、D 信号摆幅只有 400mV触发电平还设在 2.5V那示波器永远触发不了。对策是仔细确认设备的速率模式设置合理的触发电平。第二种是探头带宽不够。100MHz 示波器去测 480Mbps 高速信号不是完全看不到信号而是信号幅度被严重衰减、边沿变得非常平缓看上去就像一团“慢吞吞”的波形。这种情况下先得确认自己测的是全速还是高速模式再匹配仪器。第三种是接地问题。探头接地鳄鱼夹接触不良或者接地引线太长会导致波形上叠加大量高频噪声甚至触发不稳定。对策是换用短接地弹簧找最近的接地参考点。第四种是测试点位置不合理。在 USB 连接器引脚上测到的波形和芯片引脚处的波形可能差异很大尤其当 D/D- 走线非常长或者经过 ESD 器件时。对策是优先在靠近芯片端预留测试点或者对比芯片端和连接器端的波形差异。第五种是探头负载影响了设备工作。有些低功耗或高阻抗的 USB 设备被探头一接信号直接被拉偏导致设备甚至主机的工作状态都变了。这种情况下看到的波形可能已经是“被探头干扰后的假象”。对策是使用低电容探头或者接受接入探头后的状态作为参考别把它当成设备真实的空载信号。5.2 波形异常速查表在调试现场很多时候问题不是抓不到波形而是抓到了但看不懂。我把几种典型波形异常和排查方向整理成一个速查表方便大家对照。波形现象可能原因排查方向高速模式下差分幅度低于 300mV走线阻抗不连续、ESD 防护器件电容过大、链路损耗大检查 PCB 走线宽度与参考平面、更换低电容 ESD 器件、缩短链路长度边沿过缓上升时间明显大于 1ns示波器带宽不足、测试点负载电容过大、走线过长换用更高带宽示波器、减小测试点电容、检查过孔和内层走线信号跳变后出现明显振铃探头地线太长、走线阻抗突变、连接器处反射使用短接地弹簧、检查阻抗匹配、检查连接器焊接是否虚焊高速握手后无 SOF 包主机驱动问题、链路不稳定、设备高速握手未完成更换主机 USB 口、检查 VBUS 供电、抓取更长时间窗口确认握手是否成功D 和 D- 幅度不对称差分走线不等长、单端负载不平衡检查 PCB 布线差分等长、检查测试点附近的元件布局枚举过程中 D 高电平只有 2V 左右D 上拉电阻值偏离、主机端下拉负载过大检查 1.5kΩ 上拉电阻、确认是否在 USB HUB 后端测量设备插入后反复复位VBUS 供电跌落、ESD 器件漏电、地弹噪声用示波器同时抓 VBUS 和 D/D-检查上电时序这个表基本覆盖了我日常调试中碰到的大部分波形异常碰到问题先对照排查方向效率会高很多。5.3 几个容易踩的坑和独家心得最后分享几个我在实际操作中总结出来的小经验算不上什么高深技术但确实能帮你少走弯路。第一个是抓“设备插入”这一步别用 Auto 触发模式一定要用 Single 模式。Auto 模式下示波器如果没有触发事件会自动触发一次。当你插入设备时示波器可能早就在屏幕中央画满了之前的波形真正的事件发生位置不确定甚至被忽略了。Single 模式配合预触发设置第一次捕获到的就是设备插入关键事件信息量最大。第二个是示波器时基的切换策略。不同阶段的目标不同时基必须跟着调整。抓枚举全过程用 10ms/div 到 20ms/div 的大时基看清整体框架抓高速握手用 20us/div 量级抓单个数据包再缩到 100ns/div。一上来就盯着单个包看很容易错过前面的握手和复位过程。第三个是差分测量的通道利用技巧。示波器只有两个通道的话D/D- 各占一个用数学通道做差分即可。如果示波器有四通道我建议再引一路接 VBUS5V 电源观察供电时序与 D/D- 信号的相对关系。设备插入瞬间VBUS 先上升之后 D 才被上拉到高电平。如果 VBUS 上升和 D 上拉时序错乱枚举可能会失败。第四个经验是波形数据要保存别只截图。现在很多示波器支持 U 盘导出 CSV或者通过以太网与上位机连接。把波形数据导出来以后可以用 Python 的 matplotlib 库重新绘制做进一步分析计算上升时间、测量幅度、生成自己定义的眼图模板甚至批量分析多条波形。这等于免费拥有了一个半自动的信号分析工具非常实用。有一次我调试一个高速设备“偶尔识别失败”的疑难问题断断续续排查了两周换了主控、换了线缆、改了固件都没解决。后来就是用示波器抓取完整枚举波形对比正常和不正常两种情况的 D/D- 幅度发现异常时高速模式差分幅度只有 280mV 左右明显低于规范要求的 400mV。顺藤摸瓜查下去问题出在 PCB 上 ESD 保护二极管的结电容过大对高速信号造成了过度衰减。换用低电容 ESD 器件后幅度恢复正常问题彻底消失。这件事给我最大的启发是USB 调试不能一上来就怀疑协议栈和固件先用示波器把物理层的底摸清楚用数据说话才能少走弯路。示波器抓 D/D- 信号这件事看起来只是一个测量动作但它是整个 USB 调试链条里最基础也最可靠的一环。只要把波形抓准、看懂了大部分 USB 疑难杂症都能找到突破口。
返回列表