USB PD 协议概述

各位好,我是老张。搞了十多年嵌入式电源和通信协议,PD 协议是我见过最“折腾”但也最实用的充电标准。今天咱们聊聊它的来龙去脉和核心要点。

从 5V 到 48V:为什么需要 USB PD?

早期 USB 就是 5V / 0.5A,给手机充个电还行。后来平板出来了,2.0A 都不够。我当年做一款平板电脑,用 USB BC1.2 只能到 5V 1.5A,充一次电得三小时——客户直接投诉。说白了,需求摆在那:功率不够。

USB-IF 干脆搞了个大版本升级:USB Power Delivery(PD)。它突破了 5V 限制,把电压拉到最高 48V,电流最高 5A。协议上也彻底重写,不再是简单的 D+/D- 电阻识别,而是通过 CC 线做数字握手。

一句话总结:USB PD 就是通过一根 CC 线,让设备之间协商出双方都支持的电压和电流,并且允许在连接中动态切换。

版本演进:1.0 → 2.0 → 3.0 → 3.1

我最早接触 PD 协议是在 2014 年,那时还是 PD 1.0。说实话,它几乎没量产——太复杂了,而且必须用专用线缆。然后 2014 年底 USB-IF 推了 PD 2.0,才算落地。我记得第一次调通 2.0 的协商时,看到 CC 线上冒出了正确的 SOP 包,心里那个爽。

版本 发布年份 核心变化 我踩过的坑
PD 1.0 2012 20V/5A,使用 BFSK 调制 线缆混乱,兼容性极差
PD 2.0 2014 改由 CC 线做 BMC 编码,支持 Type-C 接口 CC 线电容太大导致信号畸变
PD 3.0 2015 增加 PPS(可编程电源),快速角色切换 PPS 电流抖动,需要软件滤波
PD 3.1 2021 扩展功率范围(EPR),最高 48V/5A EEPROM 写入次数过多锁死

你可能会问:为什么 2.0 能火?因为 USB Type-C 接口强制标配了 CC 线,这根线就是 PD 的物理基础。我做过一个项目,客户想用老 microUSB 做 PD——嗯,直接告诉他不现实。

核心特性:一句话说清楚 PD 在干什么

PD 协议本质上是一个 点对点协商协议。每次连接时,两个设备通过 CC 线交换一系列结构化消息,最终确定一个双方都支持的电压电流组合。整个过程大约 10ms 内完成。

下面这几个概念我必须讲清楚,项目里经常搞混。

1. Source 和 Sink

  • Source:供电方,比如充电器。
  • Sink:受电方,比如手机。
  • DRP(双角色端口):可以动态切换,比如笔记本接充电器时是 Sink,接手机时是 Source。

我调试过一个 DRP 切换失败案例:Source 和 Sink 状态机冲突,两个设备都不肯先送 CC 电平。后来发现是硬件上拉/下拉电阻没配合好。

2. PDO 和 RDO

  • PDO(Power Data Object):Source 告诉 Sink “我能提供这些功率组合”,比如 5V/3A、9V/3A、15V/3A……
  • RDO(Request Data Object):Sink 从中选一个发回去,“我要这个”。

这里有个坑:PDO 的顺序是固定的,Source 必须按电压从低到高排列。曾经有家方案厂商把 20V 放在第一个,结果手机直接请求 20V 烧了摄像头。嗯,设计时要检查。

3. 电压和电流的灵活协商

PD 2.0 支持固定电压(5V/9V/15V/20V)和固定的电流档位。PD 3.0 增加了 PPS:电压可以 20mV 步进调节,电流 50mA 步进。对了,PPS 特别适合手机快充,华为的 SuperCharge 和 OPPO 的 VOOC 都借鉴了这个思路。

个人经验:PPS 模式下 Source 的输出电容和环路响应非常关键。我一客户用陶瓷电容,结果电流纹波大到触发 OCP。后来换成钽电容才解决问题。

4. 五类消息包

协议基于消息包通信,我列一下常用的:

  1. 控制消息:GoodCRC、Accept、Reject、Soft Reset……
  2. 数据消息:Source_Capabilities、Request、PS_RDY
  3. 扩展消息:VDO( Vendor Defined Object),用于厂家自定义功能
  4. 错误消息:比如协议层超时
  5. 硬件复位:Hard Reset

我记得初学那会,一个 Hard Reset 触发后 CC 电平会拉低,然后 Source 又以为重新插拔了。那时候抓波形,Log 里全是 Hard Reset 重连循环。后来加了 5ms 死区时间才解决。

协议协商流程一图看清

我画了一张简化的状态机图,把核心节点都标出来了。你仔细过一遍,基本就明白 PD 在干什么。

USB PD 协商流程概述 物理连接 CC 线电容检测 + 角色识别 Source 能力宣告 发送 PDO 列表 Sink 发送请求 选择其中一个 PDO → RDO Source 接受并准备 Accept → PS_RDY 功率传输 电压/电流切换完成 关键点:每一步都携带 CRC 校验,失败则重试或 Hard Reset
避坑指南:我曾经在 PD 2.0 产品里忽略了 CC 线过零检测的消抖延时,导致 Source 发出能力宣告后立刻收到 Sink 的请求——此时 Sink 的 CC 电平还没稳定,请求包被当成错误丢弃。加 3ms 延时后完美解决。

值得深入的两个细节

PD 协议还有两个容易被忽视的点,我提一提,后边章节会展开。

CC 线不只是电源协商

它还承载了 USB 角色探测、Vbus 检测、线缆 E-marker 识别等任务。你想想看,一根线要干这么多活,电气要求自然高。我自己画板时,CC 线走线必须远离高频开关节点,否则 BMC 解码会丢包。

PD 3.1 的 EPR 模式

2021 年推出的扩展功率范围,最高支持 48V/5A(240W)。但这里有个坑:EPR 要求线缆内置 E-marker 芯片,而且芯片要支持 EPR 标识。我踩过一次:用了普通 5A 线缆,笔记本协商了 48V,结果线缆直接冒烟——嗯,线标 5A 不代表支持 48V。

调试建议:抓 PD 总线用逻辑分析仪,采样率至少 24MHz(BMC 基频 300kHz,信号上升沿很陡)。我习惯用 Saleae 加 PD 解码插件,一帧一帧看,调试效率高很多。

本章小结

USB PD 协议的核心就是“协商”两个字。它从 5V/0.5A 的“配给制”进化成“对话制”,电压电流随需应变。版本演进中,2.0 让协议实用化,3.0 加了 PPS 灵活性,3.1 拉高功率上限。咱们后续的章节会一步步拆解这些消息包长啥样、状态机怎么跑、代码怎么实现。