PD协议概述

做嵌入式这些年,常有人问我:“为什么USB口能充笔记本,也能充耳机?”这背后就是PD协议在协调。说白了,PD不让USB还停留在5V 0.5A的老时代。它通过CC引脚协商电压和电流,让一根线适配从耳机到显示器全都设备。

今天咱们就聊聊PD协议的前世今生。

USB PD协议发展史

最早USB是给键盘鼠标用的,只有5V 0.5A。后来手机平板要充电,出来个BC 1.2,提到5V 1.5A。再到USB 3.0时代,厂商自己搞快充,混乱得很。

USB-IF在2012年推出PD 1.0,用两条CC线做通信,但只支持BMC编码。1.0在实际产品里很少见,我几乎没见过。它更像一个技术验证,为后面的爆发铺路。

真正的转折点是2014年的PD 2.0。它彻底改了协商机制,定义了Source/Sink/Dual-Role角色,电压范围扩展到5V到20V,电流最高5A。我第一次用PD 2.0给一个开发板供电时,盯着示波器看CC线上的硬编码波形,觉得这协议真精妙——一根线上既传功率又传数据。

2017年PD 3.0发布,核心加了PPS(可编程电源)。我做过一个电池充放电项目,客户要求电池平台电压是3.8V,用传统固定档位充电效率很低。用了PPS后,可以精确调节到3.8V到4.2V,效率直接提了8%。

2021年PD 3.1正式推出,引入EPR(扩展功率范围)。电压升到48V,电流5A,功率飙到240W。你现在看到的游戏本、显示器、甚至有些电动工具都在用PD 3.1。

一句话概括:PD协议从5V/15W起步,一路走到48V/240W,每一次版本升级都对应着终端供电需求的爆发。

PD 2.0 / 3.0 / 3.1 版本区别

刚开始接触PD时,我容易把几个版本的功能搞混。后来做了张对比表贴在工作台上,每次干活瞄一眼,顺手多了。

项目PD 2.0PD 3.0PD 3.1
推出时间2014年2017年2021年
电压范围5V / 9V / 15V / 20V5V~20V(步进50mV)5V~48V(步进100mV)
最大功率100W(20V/5A)100W(20V/5A)240W(48V/5A)
PPS(可编程电源)❌ 不支持✅ 支持✅ 支持
EPR(扩展功率)❌ 不支持❌ 不支持✅ 支持
消息类型控制消息+数据消息增加固件更新消息增加EPR协商消息
典型应用手机快充、笔记本充电电池直充、精密设备游戏本、显示器、电动工具
如果你做的是消费电子产品,比如手机或平板,PD 3.0 + PPS基本够用。但要是做大功率设备(比如游戏本或电动工具),一定要用PD 3.1 EPR,不要想着降级兼容。

PD消息类型:控制消息与数据消息

PD协议有点像两个人聊天——控制消息是简短的打招呼和确认,数据消息才真正商量“你要多少瓦?我给你多少伏?”

控制消息(Control Message)

控制消息不携带数据负载,主要用于链路管理。常见的有:

  • GoodCRC:就是PD层的ACK,每次收到有效消息后必须回复。
  • Soft Reset / Hard Reset:软复位和硬复位。我调试时经常需要抓硬复位波形来检测CC线是否接触不良。
  • Accept / Reject:对协商请求的应答。
  • Wait:源端告诉消耗端“再等一下,我还没准备好”。
  • Power Role Swap / Data Role Swap:切换供电方向和数据主从角色。

数据消息(Data Message)

数据消息携带具体数据对象,核心是电源能力消息和请求消息。

  • Source Capabilities:源端(供电方)广播自己能提供的电压电流档位。我见过一些劣质充电器,Source Capabilities里写两个档位,实际输出纹波很大,后来加了个CRC校验逃过了测试……嗯,这是歪门邪道,你别学。
  • Request:消耗端(受电方)从Source Capabilities里选择一个档位,组成请求,发给源端。
  • BIST:内置自检消息,产线测试用的多。
  • Vendor Defined Messages(VDM):厂家自定义消息。DisplayPort Alt Mode、充电器序列号读取都通过VDM做。我做过一个项目,用自己的VDM给充电器升级固件,省了额外的升级接口。

另外在PD 3.0里新增了Firmware Update消息,专门用来升级PD控制器的固件。PD 3.1里又加了EPR Specific消息,用来协商48V的档位。

我曾经被“消息应答超时”坑过一次:调试PD协议时忽略了对GoodCRC的实时响应,导致链路卡在Hard Reset循环。后来用逻辑分析仪一抓,发现Source端发来控制消息后我回复GoodCRC晚了2ms。PD协议规定:收到消息后必须在1ms内回复GoodCRC。切记!

为了让你更直观地理解PD版本演进和消息类型之间的关系,我画了一张图。

USB PD协议演进与消息类型关系图 USB PD协议演进与消息类型 PD 2.0 5V/9V/15V/20V 最大100W 控制消息+数据消息 PD 3.0 增加PPS可编程电源 电压步进50mV +固件更新消息 PD 3.1 扩展EPR到48V 最大240W +EPR协商消息 控制消息(Control Message) GoodCRC, Accept, Reject Soft Reset, Hard Reset Power Role Swap, Data Role Swap Wait, Give Sink Cap ⚠ 无数据负载,完全靠头部的消息类型字段区分 数据消息(Data Message) Source Capabilities(供电能力) Request(消耗端请求) VDM(厂家自定义数据) BIST(自检数据) ⚠ 携带负载数据,长度可达260字节 PD 3.0新增固件更新消息(属数据消息),PD 3.1新增EPR协商消息(属控制消息)

我自己的习惯是:理解PD协议先从消息类型入手。先用逻辑分析仪抓一段PD通信,把每个控制消息和数据消息拆出来,对照spec看。从PD 2.0的几类消息开始,逐步加PPS和EPR细节。

总的来说,PD协议虽然版本多,但核心通信机制没变。掌握好2.0的基础,升级到3.0和3.1只是加功能。你想想看,有了这层认知,后面分析CC引脚的状态机就容易多了。