开源USB-C PD分析仪+可编程sink:让充电协商过程可查可改可测 📅 发布时间:2026/8/27 14:13:24 👁 浏览次数: 一个开源的 USB-C Power Delivery analyzer 外加可编程 sink做出来之后最大的价值不是“能显示电压是多少伏”也不在于“能从充电器里诱骗出 20V”而是把充电器、协议、设备三者之间真正发生的协商过程暴露到你可以直接看、直接改、直接测的程度。如果你正在做 USB-C 外设开发、充电兼容性测试、PD 协议栈调试或者只是想把手里一堆充电器到底支持哪些协议和电压档位摸清楚那这个项目值得认真看。它解决的实际问题很具体普通万用表只能看结果PD 分析仪要能抓协商过程普通诱骗器只能按固定档位请求电压可编程 sink 能让你自由设定请求条件。下面我会按“先确认这个东西解决什么问题再准备环境然后跑一次完整实测最后说排查与边界”的顺序拆开写。这样你拿到手之后不会只知道它能用而是知道什么情况下它能帮到你什么情况下不能。1. 先看清楚这个开源工具解决的是“协商过程”问题而不是单纯量电压1.1 USB-C PD 和普通充电测试的区别USB-C Power Delivery 并不是“插上一根线就能充电”那么简单。它本质上是基于 USB-C 接口里的 CC 引脚进行通信的协议框架。一个电源适配器要先在 CC 线上广播自己支持的供电能力也就是 Source_Capabilities受电设备收到这些能力之后再从中选择一个合适的电源请求发出适配器接受请求后才会把输出电压切到目标档位。也就是说整个充电过程实际上是一个协商流程。普通充电测试只能看到最终结果电压稳不稳定、电流能不能拉上去。但看不到中间有没有发生协商失败、重复请求、超时或者某个适配器发了不合规的 PDO。这时候就需要一台 USB-C Power Delivery analyzer 来监听 CC 线上的通信并把 PD 消息解码出来。这也是开源方案和普通仪器差异最大的地方。普通协议分析仪通常很贵而且日志格式固定不适合拿来做一些定制化的自动化测试。开源方案意味着你不仅可以看到解析结果还能知道固件里具体是怎么解包、怎么处理消息的遇到问题可以改代码去适配。1.2 可编程 sink 在调试链条里的定位在 PD 生态里sink 是受电方也就是通常意义上的“设备”这一端。很多测试场景需要模拟一个 sink 去向电源请求各种电压组合。普通诱骗器也能做到一部分但每个档位常常需要硬件跳线或者按键切换灵活性有限。可编程 sink 的价值在于请求哪个 PDO、电压调到多少、电流限制设到多少都可以通过软件配置。更核心的是如果把这套 sink 逻辑和协议分析放在同一块硬件里你就能在同一个设备上完成“发起请求”和“观察协商结果”两件事。实际调试时可以少接一个设备也少很多接线问题。我一般会先把可编程 sink 当成一个变量可控的“被测设备”来用。测试适配器 A 时我可以让它主动去请求 5V/9V/15V/20V甚至 PPS 里的一个电压范围。这个过程中如果我能在同一个上位机界面里看到请求和响应的完整消息序列那排查问题会快很多。1.3 它和普通诱骗器、独立协议分析仪有什么差异可以用下面这个对比理解它的定位对比项普通诱骗器独立协议分析仪开源 PD 分析仪 可编程 sink核心功能请求固定电压档位监听并解码 PD 消息既能请求电压也能抓包分析可配置性低通常靠硬件跳线中依赖厂商软件高固件和参数都可改上手难度低中高中需要自己配环境二次开发基本没有受限开源可自行扩展适用场景快速拉出某个电压协议分析、兼容性验证学习、开发调试、自动化测试所以如果你只是想快速给某个设备供上 20V普通诱骗器确实够用但如果你想搞清楚为什么这个设备在某个适配器上不能稳定协商到 20V那至少需要一个能看消息交互的分析端。而这个开源方案把两者的能力合在了一起同时保留了对固件和电路的设计透明度。2. 上手前的实际准备硬件、线材和软件一个都别省2.1 你需要哪些硬件条件除了项目本身的硬件板卡或套件我建议按下面这个清单准备一个支持 PD 的电源适配器最好是你已经知道规格的比如明确支持 PD3.0、支持哪些固定电压档位。一根质量可靠的 USB-C 转 USB-C 线尽量短一些线材对 CC 信号质量影响很大。一根用于连接上位机的 USB 数据线通常是 USB-A 或 USB-C 转调试串口。一个可调或固定负载。如果测协议协商空载也可以如果要看带载稳定性最好有电子负载。如果只是低配置入门用普通 PD 充电器加一个 USB 表也能先跑通。但要注意USB 表只能看电流电压变化无法替代协议分析。真正定位“协商失败”时还是需要看 CC 线上的消息。项目如果只提供裸板你需要准备对应的烧录工具比如 ST-Link、J-Link 或者 DFU 模式。如果入手的是带 bootloader 的版本通常会方便一些可以直接用 USB 烧录。具体烧录方式以仓库里的说明为准不要想当然照着某个开发板的习惯来。2.2 固件、驱动和上位机的准备顺序我习惯的顺序是先下载仓库里的固件源码和上位机工具确认它支持的板卡和烧录方式再安装编译工具链然后先烧录默认固件让板卡能被系统识别最后才打开上位机看能不能读到 CC 线状态。为什么要这个顺序因为如果一开始就把 PD 适配器和板卡接到一起一旦固件没烧好你很难分清是硬件问题、驱动问题还是协议问题。先用最小系统确认设备在线再逐步增加变量排查会轻松很多。烧录完成后最好先直接通过串口终端看启动日志。很多开源板卡会在启动时打印固件版本、CC 电平状态、初始化结果。这一步能说明硬件基本通路是否正常也能提前暴露接线问题。# Linux 下查看串口设备具体名称以实际枚举为准 ls /dev/ttyUSB* /dev/ttyACM*Windows 下则到设备管理器里看“端口 (COM 和 LPT)”确认板卡枚举出来的 COM 口号。如果这里都看不到设备就不要急着接 PD 适配器。2.3 线材和电源适配器会直接影响结果USB-C 线不是一个简单的导线。在 PD 环境下线缆可能带有 E-Mark 芯片有些线虽然物理上能插入但不一定支持大电流协商。如果使用劣质线材CC 通信的波形质量会明显下降出现偶发协商失败而且这种失败很难从软件层面解决。做协议分析时我一般都会固定用一根短、稳定的 USB-C 线作为基准排除线材变量。否则今天换个线结果变了你根本不知道是适配器问题、板卡问题还是线材问题。电源适配器也要选“已知规格”的而不是随便拿一个私有快充头来测。因为私有协议往往不遵循标准 PD 流程分析仪不一定能正确解析甚至会干扰判断。先把标准 PD 适配器跑通再加入私有协议充电器做兼容性对照这样做数据才干净。3. 完整实测流程从烧录固件到抓取一次 PD 协商包3.1 先跑最小样例确认设备枚举和串口输出第一步不是直接接电源适配器去抓包。先把板卡通过 USB 接到电脑安装驱动确认系统识别到设备。Linux 下看/dev/ttyUSB*或/dev/ttyACM*Windows 下看设备管理器端口macOS 下看/dev/cu.usbmodem*或/dev/cu.wchusbserial*。之后打开串口终端确认波特率与固件匹配。如果能看到启动日志说明固件已经跑起来驱动链路没大问题。接着可以测试上位机连接看它能不能读到板卡版本和当前 CC 状态。这个阶段不需要接 PD 适配器可以把精力集中在“开发环境是否正常”上。如果上位机打不开串口通常是权限或端口被占用先解决基础通信问题再继续下一步。3.2 用可编程 sink 请求指定电压并判断是否成功接下来再接上 PD 适配器。在上位机里配置请求参数比如先请求 5V再请求 9V再到 15V、20V按档位逐步验证。可编程 sink 的好处是可以把请求参数写成配置脚本而不是每次都手动改跳线。实测中应该重点观察几个点请求发送后电源有没有返回 Accept。返回 Accept 之后有没有出现 PS_RDY。输出电压是否切换到了目标值。如果板卡自带电压测量看到稳定电压接近目标值才算成功。如果板卡没有电压测量就以上位机解析出来的消息序列为准。单独看到电压变了还不行还要确认协商消息是否完整因为有些适配器会先切电压再发消息顺序不对也说明实现有瑕疵。建议先跑单条任务确认一次请求、一次响应、一次电压切换都正常再考虑连续请求和自动化。不要一上来就批量跑几十组配置不然出问题时定位成本很高。3.3 抓包解析Source_Capabilities、Request、Accept、PS_RDY 怎么看一次标准 PD 协商的关键消息大致是这样消息方向消息类型含义电源 - SinkSource_Capabilities电源广播自己支持的 PDO 列表Sink - 电源RequestSink 从 PDO 里选中一组请求电源 - SinkAccept电源接受请求电源 - SinkPS_RDY电源已经切到目标电压可以开始取电分析仪抓到的应该就是这一串包。如果只看“输出电压 19.9V”你不会知道中间是不是出现过一次 Reject然后再重新发起 Request但抓包记录里这些细节都能看到。我一般会先把日志按时间顺序打开快速浏览从 Source_Capabilities 到 PS_RDY 是否完整。如果看到重复 Request、超时无响应、或者收到 Reject/Wait说明协商过程一定有问题。这时候再结合适配器和线材去排查。3.4 连续抓取和批量记录数据时的输出命名与日志可靠问题单条协商测通后如果要批量测试不能只是手动开关电源。需要关注几个工程问题日志文件是否按时间戳命名会不会被覆盖。失败时有没有记录错误码而不是只写一句“协商失败”。串口缓冲区会不会堆积连续跑上百次后有没有丢包。上位机断线重连后是否能自动恢复并继续记录。如果上位机支持导出 CSV建议每条测试记录都包含测试时间、适配器标识、请求 PDO、实际电压、协商状态、失败原因。这样做出来的数据才适合后面做兼容性报告。批量测试最容易忽略的是输出目录。今天跑了一批数据明天再跑一批如果目录没有按批次区分后面整理数据时会非常痛苦。虽然不是核心功能但真正把开源工具用在日常工作中时这些细节比“能不能抓包”更影响体验。4. 关键参数和判断标准协议分析绕不开的细节4.1 PDO、RDO、电压电流精度、时序到底看什么PDO 是电源端支持的供电能力描述RDO 是受电端请求的具体内容。一个 PDO 可能代表固定电压档比如 5V/3A、9V/3A、15V/3A、20V/5A也可能代表 PPS 可编程电源电压可以在一个范围内连续调节。可编程 sink 最有价值的地方之一就是可以主动去请求 PPS 档位里的某个电压值用来测试设备在不同电压下的表现。在分析仪里看 PDO 时要看的不只是电压和电流还要注意 PDO 类型、是否支持 PPS、有没有 EPR 能力。这些字段会直接影响设备能协商到的功率上限。关于电压电流精度要分清楚不同设备的职责计量表负责精准测电压电流分析仪负责解析协议。开源分析仪如果顺带做了电压测量通常能满足日常定性判断但不一定能达到计量级精度。如果你要做严谨的功率计算还是需要额外的电压电流采样。4.2 协商成功和失败的判断方式判断协商成功不能只看“有电输出”。标准流程应该是收到 Source_Capabilities。发出 Request。收到 Accept。收到 PS_RDY。输出电压处于目标档位允许范围。如果某一步缺失即使线路上有电压也不算真正协商成功。例如某些适配器可能在收到 Request 后直接切电压但不发 Accept/PS_RDY这时候设备可能也能工作但协议状态并不完整兼容性测试里要标记为异常。失败的常见表现有超时没有收到 Source_Capabilities。发 Request 后无响应。重复发送多次仍失败。收到 Reject 或 Wait。这些消息在日志里都应该能直接看到。如果看不到可能是分析仪没有捕获到也可能是适配器没有按标准发消息需要进一步查看 CC 线波形。4.3 长时间挂机时关注资源占用与稳定性如果你打算让板卡连续跑测试比如一个晚上跑 200 次上下电循环那一定要关注两个东西板卡固件会不会崩、上位机有没有内存泄漏。串口连续上报时上位机如果处理不过来日志会越积越多内存占用慢慢上涨。更隐蔽的是串口缓冲区溢出表现为日志中间缺了一段但整体看起来仍然正常。这时可以用一个简单的办法连续跑 50 次单独统计每个关键消息出现次数看看有没有少包。如果发现丢包优先检查日志处理线程、缓冲区大小和波特率。开源项目的优势就在这——你可以直接改固件来增加缓冲区或者优化上位机的日志写入逻辑不用等厂商更新。5. 实测中最容易踩的坑以及建议的排查顺序5.1 识别不到设备先看供电、再看串口、最后看驱动这个问题排在所有问题里的第一位因为设备都识别不到时其余功能都谈不上。我建议的排查顺序是看板卡供电指示。如果板载指示灯都不亮先查 USB 线和供电。拔插 USB 线看设备管理器是否有设备变化。看串口是不是被其他工具占用。换一个 USB 口或换一台电脑排除驱动冲突。最后再检查板卡本身焊接、跳线和 boot 模式。Linux 下常见的是串口权限问题可以用lsof查看端口是否被占用lsof /dev/ttyACM0Windows 下常见的是 CH340、CP2102 这类 USB 转串口芯片驱动没有装好或者 COM 口号被之前设备占用。先把驱动和端口确认干净再继续协议测试。5.2 协商不成功或超时从输入线缆和适配器兼容性排查如果协商总超时不要一口咬定是板卡坏了。我见过很多案例最后都出在三个地方线材劣质或太长CC 信号被干扰。适配器本身不支持标准 PD或者支持的外国才生效。板卡作为 sink 时CC 上拉/下拉电阻配置不对导致适配器一直没有广播 Source_Capabilities。正确做法是先固定两个已知变量第一换一根已知支持 PD 的短 USB-C 线第二换一个明确支持标准 PD 的适配器。如果这两个变量都确定没问题之后再怀疑板卡固件或硬件问题。如果条件允许可以用逻辑分析仪去抓 CC 线波形。这样能看到适配器到底有没有在 CC 线上发送消息以及消息的物理波形是否正常。不过这一步是进阶手段普通学习场景先用分析仪本身抓包就行。5.3 输出日志为空或乱码优先检查编码、波特率和数据格式串口能打开但没有任何输出先别急着怀疑固件没烧进去。需要按顺序检查是不是选错了串口。波特率是否匹配固件默认值。终端工具是否设置了正确的行结束符。日志是否发送到了调试串口而不是 GPIO 或 LED。如果是乱码九成是波特率不对。比如固件默认 115200你用了 9600 打开自然是乱码。如果偶尔丢字符可能是供电不稳定也可能是 USB 转串口芯片质量一般。在确认基础通信正常之前不要花太多时间研究 PD 消息内容。先让日志稳定输出再去做协议分析。5.4 批量任务卡住失败重试、超时和输出目录批量测试卡住通常不是硬件挂了而是上位机脚本没有处理异常状态。常见情况包括电源断开后脚本还在等待 PS_RDY。某一次协商失败后状态没有复位导致后面所有请求都失败。日志文件写入失败但没有报错。串口缓冲堆积处理线程阻塞。我建议在测试脚本里加上单次超时和失败重试逻辑。比如每次请求设置 2 秒超时收到 PS_RDY 才算成功超时则标记失败并重新上电初始化。失败重试次数要控制在合理范围不要无限重试。批量测试的数据文件一定要按测试批次区分目录文件名里带上时间戳。否则跑到第 100 次时覆盖了前面的数据整个测试序列就白做了。6. 什么场景适合接入这个开源方案什么场景要谨慎6.1 适合做的充电兼容性测试、原理学习、自定义 PD 策略验证这类开源分析仪加可编程 sink 的组合最适合几个方向验证自己的设备与不同 PD 适配器的兼容性。学习 PD 协议状态机理解一次协商是怎么从 0 到 1 的。开发自定义 sink 策略比如自动选择最高电压、PPS 微调、低功耗请求流程。做自动化脚本测试多组配置快速发现哪些适配器和设备之间存在兼容性问题。在这些场景里可编程 sink 的价值很大因为不需要每次重新烧固件也可以通过上位机或命令行改参数。协议分析功能则能帮你把“适配器没有输出”和“适配器没有广播 PDO”这类问题区分开。6.2 不适合做的认证测试、高精度计量、量产级自动化有一个边界需要提前明确开源工具可以帮你发现问题但通常不能替代官方认证的符合性测试。PD 认证测试对设备、环境、测试流程都有严格规定这不是一个开发板能覆盖的。高精度电压电流测量也不是这类分析仪的主要职责。分析仪的核心是协议交互功率测量更多是辅助功能。如果要严谨地计算效率、纹波、功率就要单独配计量设备和电子负载。量产级自动化也要谨慎。低配置环境能跑通单条任务不代表适合 7x24 小时批量跑。带夹具、带扫码、带良率统计的完整产测方案需要一台足够稳定的控制和数据采集系统而不是一块开发板加一个串口脚本。6.3 如果你想二次开发先看协议状态机再动硬件电路二次开发时我的建议是先不要改硬件。先把固件里的协议状态机完整理解一遍如何解析 Source_Capabilities如何构造 Request状态如何切换超时如何处理。把这些逻辑跑通之后再去改上位机或增加新的测试策略。改协议逻辑时尽量加日志和状态打印。不要只改一个参数就盲试那样很难知道问题出在哪个状态。开源项目的好处是你可以看到全部设计但这也意味着所有问题都要自己排查所以一定保留一套可重复验证的测试流程。如果你真的要改硬件先从供电和 CC 线接口入手注意 USB-C 的 CC 线不能和 D/D- 接反采样电阻的位置、分压电阻的精度都会影响测量结果。改完硬件之后重新跑一遍最小样例确认基础枚举、串口输出和协商都正常再继续更高阶的测试。这个项目真正落地时最该盯住的不是功能列表而是输入线缆、适配器兼容性和日志可靠性。先把单条协商跑稳把异常超时处理掉把输出格式整理干净再考虑批量测试和自动化使用体验会扎实很多。