尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

USB PD快充调试实战:用逻辑分析仪抓BMC波形并解码协议

发布时间:2026/9/24 9:30:33

资讯中心
01
ARTICLE

USB PD快充调试实战:用逻辑分析仪抓BMC波形并解码协议

USB PD快充调试实战:用逻辑分析仪抓BMC波形并解码协议
做USB PD快充调试时最头疼的往往不是协议本身而是“看不见”。你接上一个诱骗器它死活只输出5V没有日志没有报错整个系统像台沉默的机器。这时候先别急着怀疑芯片坏了逻辑分析仪往CC线上一接抓一把波形很多问题当场就能判断个大概。今天这篇就聊怎么抓、怎么看、怎么把一段BMC波形还原成一条USB PD消息这也是我前两年做快充兼容性测试时反复在用的一条路子。这篇内容适合三类人看一是刚接触PD协议、想搞懂CC线上到底在传什么的工程师二是手头有逻辑分析仪但不知道怎么下手的新手三是被诱骗器或PD协议栈折腾到头秃想从物理层直接找答案的硬件玩家。我会尽量避免堆术语但BMC编码、5b4b映射、SOP、消息头这些绕不开的名字会逐一说清楚。1. 为什么USB PD协议分析难又为什么必须靠逻辑分析仪1.1 USB PD不是普通的UART/I2CUSB PD跑在Type-C接口的CC引脚上和I2C、SPI、UART这类我们熟悉的数字协议完全是两回事。CC线不仅要承担连接检测、角色发现、供电能力协商这些低速率逻辑还要在很短的时间里把BMC编码后的数据调制成射频载波发出去。换句话说CH340串口那种“TXD一拉高RXD一拉低”的直观逻辑在PD里根本看不到你在CC线上量到的不是普通的0/1电平而是一段被高频载波包裹着的信号。另外一个麻烦点在于PD通信是半双工的突发式通信。一次Source_Capabilities消息可能只有几十微秒发完就安静了。你要是拿示波器去碰运气往往抓了半天只看到一条平坦的电平线什么都没录到。这时候就需要一个能持续监听、触发后自动记录、并且能把数据导出来做后处理的工具也就是逻辑分析仪。1.2 逻辑分析仪相比示波器的三个核心优势示波器并不是不能测PD信号但用起来非常别扭。首先示波器的存储深度普遍有限你要用高采样率去录几毫秒的信号很容易把存储深度耗尽其次示波器的解码能力偏弱很多型号就算带协议解码也不支持PD这种FSKBMC的组合。逻辑分析仪则正好反过来它有几个优势是示波器比不了的。一是长时间捕获能力。逻辑分析仪的存储深度通常很大可以以较高的采样率连续记录几秒钟甚至更久这对捕捉突发包非常友好。二是多通道同步分析。PD协商牵扯到CC1、CC2、VBUS有时候还要顺带看I2C和GPIO逻辑分析仪八通道起步能够把这些信号放在同一时间轴上对比。三是后处理灵活。原始数据导出来以后可以用Python自己写解码脚本这是示波器几乎做不到的。正因为如此我在实际调试中基本是“示波器看模拟特性逻辑分析仪看协议内容”的分工。1.3 为什么逻辑分析仪不能直接怼在CC线上这里有一个很容易踩的坑直接拿逻辑分析仪的探头去夹Type-C线缆里的CC线很大概率什么都解不出来因为PD物理层不是普通的数字电平。USB PD的发送端先把数据做BMC编码再用FSK方式调制到24MHz附近的高频载波上送到CC线。逻辑分析仪本质上是电压比较器它看到的是载波信号被阈值切割后的高频方波而不是一颗颗干净的BMC位。所以要抓PD波形实践中有两种做法。一种是在板子上找到PD控制芯片解调后的BMC输出测试点直接从那里引线进逻辑分析仪这个信号是300kbps左右的基带方波非常干净适合解码学习。另一种是直接采CC线上的FSK射频信号然后通过软件或者外部电路做解调这个过程要复杂不少对采样率和工具链要求都高。我在下面的实战里用的是第一种方案也就是抓解调后基带BMC波形这也是我强烈建议新手先走通的路先把协议层看明白再回头啃物理层。2. 工具准备与环境搭建2.1 逻辑分析仪选型与采样率估算先说采样率怎么定。PD的BMC基带速率是300kbps一个位周期大约是3.33微秒。BMC编码里数据1在周期中间有一次额外翻转所以我们要分辨的最短脉冲宽度是一个位周期的一半也就是大约1.67微秒。根据奈奎斯特的工程经验至少要有5到10倍的采样密度才能稳定还原这种波形所以逻辑分析仪的采样率不能低于10MS/s。我自己用过25MS/s和50MS/s都足够再高当然更好但文件体积也会变得很大没必要一上来就开100M。选型方面市面上常见三类。一类是Saleae Logic系列软件体验确实好自带USB PD解码器但价格摆在那里另一类是国产兼容方案配合Saleae软件使用性价比高不过稳定性参差不齐还有一类是开源的fx2lafw固件逻辑分析仪搭配PulseView用二十块钱左右就能买到一套非常适合学习。我最初就是从PulseView入门的虽然它的解码器列表里没有现成的USB PD协议但它能导出数据这个功能已经够我们手工解码了。2.2 从CC线/测试点引线到逻辑分析仪接线是整个流程里最需要耐心的一步。如果你是拿一个调试板做实验强烈建议先看原理图找到PD芯片的RX/TX测试点。很多PD控制芯片在内部完成FSK解调之后会有一个BMC数字信号的测试点这个点就是我们要接的地方。如果板子上没有留测试点可以尝试在PD芯片和Type-C座之间的滤波网络后面找信号但那要求你对板级设计很熟新手不建议上来就这么干。接线有三个细节要注意。第一逻辑分析仪的GND一定要和调试板的GND共地否则采出来的波形全是毛刺。第二CC线并不总是CC1Type-C正反插以及线缆里的电子标记芯片会决定究竟哪根CC在工作比较稳妥的办法是把CC1和CC2都接到逻辑分析仪的两个通道上抓完再判断哪路有数据。第三是耐压问题有些逻辑分析仪的输入范围只有0到5V如果直接去接带有上拉电阻的CC线一定要确认电平在范围内不然会烧坏仪器。2.3 软件准备与触发策略软件端我推荐两个组合。一个是用PulseView做采集它免费、开源、跨平台配合几十块钱的逻辑分析仪足够用另一个是更省事的方案用带USB PD协议解析的商用软件直接自动帮你解出包类型和数据对象。如果你是纯学习先用PulseView手动抓、手动解一遍收获会大得多。触发设置上由于PD消息是突发式的你不能指望每次都能精准抓到发起瞬间。比较笨但有效的办法是连续采集一段比较长的时间比如触发设为“任意边沿”然后把采集时长拉到几十毫秒甚至几百毫秒之后在波形里找一个个的突发串。实操中我更喜欢设置一定的“预触发”长度把触发点之前的波形也记录下来这样即使信号在触发之前已经开始也不会漏掉。3. BMC编码原理与波形特征3.1 BMC双相标记编码为什么每个位周期必然翻转BMC的全称是Biphase Mark Code双相标记编码。它的核心规则一句话就能概括每个位周期的开始处必定有一次信号翻转如果这个周期要传输的数据是1那么在周期中间还会再翻转一次如果传输的是0则中间不翻转。这里的“翻转”指的是电平从高变低或从低变高。用生活类比来理解的话可以把每个位周期看成一间房房间的门口你进出时总会把门关一下这是固定动作。如果房间里还有一扇窗也开着那就代表数据1如果房间里没动静那就代表数据0。接收端只要盯着每个周期边缘的翻转来对齐时钟再检测中间有没有跳变就能还原出0和1。这一点和UART完全不一样。UART靠起始位分手帧BMC则是每个位都在制造跳变沿接收端可以一直跟着波形做时钟恢复。也是因为这个特性BMC信号在示波器上看起来就像一串形状不规则的方波频率不是恒定的不能说“这个波形是300kHz”只能说它平均速率是300kbps。3.2 从波形上识别0和1手工观察跳变如果把PulseView里抓到的BMC波形放大你会看到类似这样的结构数据0周期开始翻转一次之后电平保持不变量到周期结束。数据1周期开始翻转一次中间再翻转一次然后保持到周期结束。所以判断方法很简单先按照位周期3.33微秒在心中画好竖线每根竖线对应一个周期的起点然后看两个竖线之间有没有额外的跳变。同一个电平方向上有两个跳变的就是1只有一个跳变的就是0。我最初手工观察时经常看花眼后来养成了一个习惯把PulseView的测量光标设置成两个相邻位周期的起点间距然后再去数每个间距内的跳变次数这样就不容易错了。这里有几个容易混淆的点。第一BMC里的“0”和“1”不是电平高低而是跳变模式所以用电平去分析永远理不清。第二周期边界上的固定翻转是发送端主动做的接收端不认为它是数据只用来同步。第三BMC波形里两个相邻周期之间是连续的前一周期末的电平和后一周期初经过固定翻转后可能衔接得很自然不要因为看上去没有明显间隔而误判。3.3 为什么还要5b4b编码如果只用BMC数据位流里可能会出现连续很多个0或者很多个1虽然BMC会在每个周期开始翻转但长时间看某些图案仍然不利于接收端的时钟恢复。USB PD的做法是在BMC编码之前先做一层5b4b编码也就是把原始数据每4比特映射成5比特的符号然后再把这5比特的符号送进BMC。这层编码带来的好处是编码后的符号流里0和1的分布更均衡跳变密度更高接收端更容易锁定比特边界。另外5b4b编码表里还专门定义了一些特殊的“K码”符号它们不代表普通数据而是用来做同步的头标比如SOP的起始标志就是一连串K码。实际解码的时候我们要先查表把每5比特还原成4比特数据关键是要认识K码因为K码出现的地方就是一条PD消息开始的位置。这个编码过程你不需要手动实现只要理解原理就行。真正动手时解码器或脚本会自动完成5b4b到4b的映射。4. 实战抓取一次USB PD协商过程4.1 搭一个最小化的实验台我先说一个能复现的实战环境。用一个USB PD充电器作为Source端用一个带有PD诱骗功能的开发板作为Sink端两者之间用普通Type-C线缆连接。诱骗端的目标很明确向充电器请求9V或者12V电压。关键操作是把逻辑分析仪接到PD芯片的BMC解调测试点上同时把CC1和CC2两个通道都接出来。如果你手头没有调试板也有个取巧的办法买一个带USB PD协议分析功能的诱骗器它上面通常会有串口或者调试引脚能输出它收到的BMC数据。把那个引脚接到逻辑分析仪上效果是一样的。整个实验台不需要额外供电因为充电器上电后自己就会工作逻辑分析仪用USB供电即可。触发逻辑我是这么设置的先做一次长时连续采集然后手动在波形里找突发包。因为PD Source上电后会定时广播Source_Capabilities消息所以只要等一小会儿一般都能抓到包。你不需要做任何触发条件把采样率设到25MS/s采集时长设几十毫秒开始采集后给Sink发一个Request请求就能录到一次完整的5V到9V协商过程。4.2 抓到波形后的第一反应录制完成后在PulseView里你会看到好几段突发的波形每一段就是一次PD消息传输。把其中一段展开才能看到BMC方波。这时候如果你看到的是一团高频载波而不是几微秒宽度的方波说明你抓的是FSK射频信号而不是BMC基带信号需要检查是不是接错了测试点。我在调试中就遇到过好几次这种问题那时第一反应不是怀疑逻辑分析仪坏了而是回到原理图确认信号路径。拿到一段干净的BMC波形后接下来的工作就是把它转换成0/1序列。用PulseView的测量功能先找到波形的起始跳变沿然后按3.33微秒的位周期一格一格往后推。我更推荐把波形导出成CSV再用脚本自动提取跳变沿和时间戳这样既快又不会看花眼。手工方式在短波形上练一次可以但一旦要分析一整个包的几百个比特手工数位会让人崩溃。4.3 从波形到原始位序列举个我实际抓过的例子下面数字已经做过脱敏处理结构保持真实解调后的BMC位流前几十位大概是这样的01001011010100101101001010110100101101...这段序列看起来没有规律但它其实是由BMC编码后的多个5比特符号组成的。我们先把BMC解码成“原始编码位”也就是把每个位周期内的中间跳变信息提取出来。以“周期开始翻转中间有跳变1中间无跳变0”的规则上面的序列还原成编码符号后会变成一排5比特一组的符号比如01001 01011 01101 00101 01101 ...到这里物理层的工作就完成了。剩下的就是协议层的活了后面的章节我会详细拆解怎么从这一串符号里找SOP、解析消息头、校验CRC。这里有个重要的经验千万不要试图在逻辑分析仪的屏幕上直接看完整条消息人的眼睛和耐心都撑不住。正确的做法是先把它导成数据文件再用脚本或表格工具辅助处理手工数位只适合校验一小段。5. BMC解码实战从位流到完整PD消息5.1 找SOP一条PD消息的起点拿到BMC解码后的5比特符号流第一件事就是在里面找SOPStart of Packet。USB PD规范规定包起始是由若干个特定的K码组成的SOP序列比如SOP、SOP、SOP分别用于不同方向或不同目标的通信。SOP在5b4b编码表里是固定符号不会出现在普通数据载荷里所以一旦看到这些K码连续出现就可以确定一条新消息开始了。在实际操作里我会先在解码脚本里定义一个查找函数扫描符号流搜索等于SOP符号组合的位置。有些消息是用SOP传输的有些是用SOP传输的二者在逻辑分析仪上看起来前几个符号略有差异但定位方法完全一样。找到SOP后接下来SOP之后的符号才真正属于这条消息。这里有一个坑要提醒SOP本身不计入消息数据的长度也不参与CRC校验。CRC计算的起点是消息头的第一个字节而不是SOP。很多新手刚上手时会把SOP符号当成头字段的一部分导致后面的字段对不齐。5.2 解析消息头Type、计数、ID都在前16位里SOP之后紧接着的16位就是消息头Message Header这16位被切成了多个位域。下表是我常用的解析方式位域位数含义Message Type5 bit消息类型比如Source_Capabilities、Request、Accept等Port Number1 bit端口编号Specification Revision2 bitPD版本号Number of Data Objects3 bit后面跟着几个数据对象Reserved1 bit保留位Message ID4 bit消息编号举个例子假设消息头解出来的字节是0x01 0x02转换成二进制就是00000 0 01 001 0 0010。拆开看就是Message Type0Revision00? 这种时候不要背数值直接把位域拆出来填进上表。其中最重要的两个字段是Message Type和Number of Data Objects前者决定这条消息是干什么的后者告诉你后面要读几个32位数据对象。消息类型你可以边用边积累比如Source_Capabilities、Request、Accept、PS_RDY这些是协商里最常见的。一开始不用硬背看到解析结果再去翻规范或网上资料就好。5.3 数据载荷与CRC32校验消息头之后就是数据载荷。对于数据消息载荷由若干个32位的Data Object组成每个数据对象里包含电压、电流上限等信息对于控制消息则没有数据对象载荷部分直接就是CRC。解析数据对象时需要按照PD规范里的位域定义逐个拆解PDO类型、固定电压、最大电流等字段这部分需要用计算器做进制转换我一般写个Python脚本来处理。CRC放在消息的最末尾占32位。USB PD使用的CRC32并不完全等同于常见的ZIP或以太网CRC32规范定义里有一套自己的多项式。好在开源库里能找到现成的实现下面是一段简化示意import zlib # 这只是示意实际要用PD规范定义的CRC32 raw b\x01\x00\x01\x00\x00... # 消息头 载荷 crc_calc zlib.crc32(raw) 0xFFFFFFFF crc_recv 0x12345678 # 从包尾解出的32位 if crc_calc crc_recv: print(CRC OK) else: print(CRC FAIL, expect, hex(crc_calc))判断一条PD消息有没有被干扰最简单的方法就是看CRC。我在调试中遇到过不少“波形看起来很正常但诱骗器就是不响应”的情况结果一用CRC校验发现几乎每条被抓到的消息CRC都错说明物理层信号质量有问题而不是协议栈逻辑错了。5.4 一个完整的示例包分析我整理一个经过脱敏处理的真实抓包片段完整包的结构大概如下SOP由K码组成仅在屏幕上确认即可不参与数据和CRC。消息头0x00 0x02解析后Message Type为1Number of Data Objects为5。数据对象10x2C 0x91 0x1E 0xDC表示一个PDO电压、电流数值按PDO格式换算。数据对象2到5类似每个4字节。CRC320xA3 0x4B 0x08 0x1F用脚本校验通过。这个包就是一个典型的Source_Capabilities广播。从SOP之后开始前16位是消息头知道了后面跟着5个数据对象所以脚本会继续读20个字节的载荷最后再读4字节CRC。如果Number of Data Objects是3那载荷就是12字节长度完全由消息头决定。到这里一条PD消息就算完整解出来了。你不需要每次都手工走一遍把解码逻辑写成脚本以后抓到新波形就能秒出结果。6. 常见问题与排查技巧实录6.1 一抓就是高频载波看不到BMC方波这是我自己第一次抓PD时踩过的坑。现象是逻辑分析仪屏幕上全是密密麻麻的高频脉冲根本没有3.33微秒宽的方波。原因很简单信号源接的是CC线的FSK射频信号没有经过BMC解调。解决办法是先确认测试点找到PD芯片的BMC输出引脚如果板子没有测试点就得加一个外置FSK解调前端或者用带模拟输入的高速示波器先看模拟波形。6.2 采样率该选多少才够有些朋友拿20元逻辑分析仪开2M采样就去抓结果波形全是锯齿位周期根本分不清。其实计算很直接BMC位速率300kbps位周期约3.33微秒BMC里的最小脉冲宽度约为1.67微秒采样率至少要能在这1.67微秒里采到5到10个点也就是10MS/s以上。低于这个值解码结果就别抱期望了。6.3 抓到了包但CRC一直报错CRC报错不一定代表协议有问题。最常见的原因是地线没接好逻辑分析仪的GND和调试板GND之间出现压差导致波形叠加了噪声毛刺。其次是触发电平设得不对逻辑分析仪的阈值不匹配信号电平导致采样点刚好卡在上升沿上。还有一种情况是解调前端带宽不足把BMC中间的那个跳变沿给平滑掉了。排查顺序建议是先看地线、再看采样率、最后检查测试点信号完整性。6.4 手工数位数到头昏眼花怎么办手工数位只适合学习阶段不建议用于日常工作。更好的办法是把PulseView导出的数据用脚本处理先找跳变沿再按周期恢复位流然后做BMC解码、5b4b查表、消息解析。这样一套流程跑下来准确率比手工高得多而且能批量处理几十个包。我在实际工作中就是把这套脚本沉淀成一个小工具抓包到出结果基本在一分钟内完成。下表是我整理的几个高频问题速查现象可能原因处理办法波形是高频载波信号源不是BMC基带换BMC测试点或加解调前端位周期看不清采样率不足设置到25MS/s以上波形毛刺多地线接触不良重新共地用短线连接能识别SOP但CRC错采样点靠近跳变沿提高采样率或检查阈值找不到SOP触发过早/过晚连续录制长波形再手动定位我在实际抓PD波形的体会中最深的一点是PD协议的难点不在解码而在物理层。一旦你能稳定拿到干净的BMC基带信号剩下的就是查表和算术。建议新手第一次做实验时先别急着分析完整包只盯着波形去数5个位周期用“周期开始翻转、中间有跳变就是1”这个规则亲眼看懂0和1然后再进入协议解析。这个基础打牢了后面看什么协议都不慌。另外再分享一个小技巧平时可以把5b4b的映射表打印出来放在工作台虽然大部分时候脚本会帮你查表但偶尔手工核对波形时纸质表还是比翻PDF快得多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。