USB PD 协议基础:从 0.9 到 3.1,我见证的演进
聊 USB PD 协议,咱们得先弄明白它到底是怎么一步步走到今天的。我个人是从 PD 2.0 时代开始深度接触这块的,那时候 Type-C 接口刚火起来,大家还在为“正反插”兴奋,根本没意识到背后这套电力协商系统有多重要。你想想看,如果没有 PD 协议,Type-C 顶多就是个能正反插的 USB 2.0,大功率充电是根本别想的。
协议版本演进这块,我觉得核心就三条主线:功率上限越来越高、协商粒度越来越细、应用场景从充电扩展到了通用电源。下面这个简化版演进表,是我根据实际项目经验整理出来的关键里程碑:
| 版本 | 最大功率 | 关键特性 | 我遇到过的坑 |
|---|---|---|---|
| PD 1.0/1.2 | 100W (20V/5A) | 基于 BMC 的通信,固定 PDO | 兼容性极差,不同芯片厂互连经常失败 |
| PD 2.0 | 100W (20V/5A) | 引入 Type-C 连接器,结构化 VDM | Source/Sink 角色切换时序很敏感 |
| PD 3.0 | 100W (20V/5A) | PPS (可编程电源),快速角色切换 | 我曾遇到过 PPS 协商时电压跳变过大导致设备重启 |
| PD 3.1 | 240W (48V/5A) | EPR (扩展功率范围),AVS (可调节电压) | 高压隔离设计一下子变得很重要 |
电力协商范围:不只是“握手”,是“谈判”
PD 的电力协商,说白了就是 Source 和 Sink 之间的一场商务谈判。Source 先亮出自己的底牌——Source_Capabilities,也就是它支持哪些电压电流组合,这叫 PDO (功率数据对象)。Sink 看到后,从里面挑一个最合自己胃口的,发一个Request回去。
但注意了,这不是简单的“我要 5V 2A”。我在调试 PPS 功能时发现,真正的协商过程远比你想的复杂。比如 Sink 可以要求 Source 在 3.3V 到 21V 之间连续调节电压,精度达到 20mV。这种细颗粒度的控制,是传统固定电压充电器做不到的。
电力协商的典型步骤其实就这么几步:
- 物理连接检测:CC 线上检测到拉电阻,确认连接建立。
- 能力宣告:Source 广播 Source_Capabilities 消息。
- 功率请求:Sink 基于自身需求,发送 Request 消息。
- 接受/拒绝:Source 回复 Accept 或 Reject。我曾见过一个 bug——Sink 请求了一个 Source 声明过的 PDO,但 Source 因为内部温度过高否决了它。这在规范里是允许的,但很多工程师没考虑到。
- 功率就绪:Source 调整输出电压/电流后,发送 PS_RDY 信号。
- 电源角色切换:如果需要,通过 DR_Swap 消息互换 Source 和 Sink 角色。
这里有个实用技巧:在设计 PD 控制器固件时,建议把 Source_Capabilities 的发送间隔设为规范允许的最大值 200ms。太快发送会被 Sink 视为违反协议,太慢则影响用户体验。我一般设为 150ms,留有余量。
数据与电力通道:一对“兄弟”分家记
很多人以为 Type-C 里的数据线和电力线是混在一起的,其实完全不是。CC 线是“通信线”,SBU 线是“边带线”,D+/D- 是“传统数据线”,而 VBus 才是“电力线”。各司其职,互不干扰。但真正让 PD 协议强大的,是它能在同一组 VBus 线上,通过 CC 线的信令,动态协商出不同的电压和电流。
我见过不少初级工程师在这个地方栽跟头。他们以为只要把 CC 线接上,Source 就能自动输出高压。嗯,这里要注意:CC 线上跑的是 BMC (双向标记编码) 信号,频率高达 300kHz。如果你的 CC 线布线过长或阻抗不匹配,BMC信号失真,就会导致协商失败。我在一个项目中就遇到这个情况——因为 Type-C 母座到 PD 芯片的 CC 走线绕了三圈,结果调试了一个下午才发现是阻抗问题。
数据通道和电力通道的关系,可以这么理解:CC 线是“司令”,VBus 是“士兵”。司令不发话,士兵不乱动。你看下面这张图,就一目了然了。
从图上你能清楚看到,整个协议演进是一路向上走的。但我想重点说说 PD 3.0 和 3.1 里关于角色切换的部分。为什么?因为这是你后面课程里最常接触到的实操场景。
实战视角:PD 协议里的“角色”到底是啥?
在 PD 协议中,电源角色分三种:Source(供电方)、Sink(用电方) 和 DRP(双角色端口)。DRP 就像墙头草,能根据连接的设备动态切换自己是 Source 还是 Sink。你想想看,你的笔记本电脑插上充电器时是 Sink,但当你用它给手机充电时,它就变成了 Source。这就是为什么我常说,DRP 的固件设计是最考手艺的——你得处理好切换时序,还要应对各种奇怪的设备。
我曾经调试过一个客户案例:一台笔记本插上扩展坞后,两个设备互认了 DRP 身份,结果谁都不肯先当 Source。现象就是插上去没反应,但 CC 线上的活动显示双方在不停地发消息和切换角色。最后解决方案是在固件里加了一个“先到先得”的随机延迟,才解决了这个死锁。
一个小技巧:设计 DRP 时,建议在切换状态机中引入一个 80ms~120ms 的随机等待窗口。这个技巧能有效避免两台 DRP 设备互相“谦让”而导致的协商失败。
注意:PD 3.0 引入的 快速角色交换 (FRS) 功能,要求在 5ms 内完成 Source 到 Sink 的切换。如果你的设计没有在 CC 线上预留足够的上拉/下拉电阻切换速度,可能会在这个环节掉链子。我曾经就因为 CC 线上用了太大容值的去耦电容,导致切换延迟超标,调试了两天才找到问题。
总结一下这章:协议演进给了我们更高的功率和更灵活的协商方式;数据与电力通道虽然物理上分离,但通过 CC 线的信令紧密配合;电源角色切换是 PD 协议中最具实战价值的部分,也是你后面动手做项目时会反复遇到的核心概念。我个人习惯是在开始任何 PD 项目前,先把角色切换的状态机在纸上画一遍,理清楚所有边界情况,再去写代码——这样能省掉后面一半的调试时间。