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 2.0 / 3.0 / 3.1 版本区别
刚开始接触PD时,我容易把几个版本的功能搞混。后来做了张对比表贴在工作台上,每次干活瞄一眼,顺手多了。
| 项目 | PD 2.0 | PD 3.0 | PD 3.1 |
|---|---|---|---|
| 推出时间 | 2014年 | 2017年 | 2021年 |
| 电压范围 | 5V / 9V / 15V / 20V | 5V~20V(步进50mV) | 5V~48V(步进100mV) |
| 最大功率 | 100W(20V/5A) | 100W(20V/5A) | 240W(48V/5A) |
| PPS(可编程电源) | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| EPR(扩展功率) | ❌ 不支持 | ❌ 不支持 | ✅ 支持 |
| 消息类型 | 控制消息+数据消息 | 增加固件更新消息 | 增加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版本演进和消息类型之间的关系,我画了一张图。
我自己的习惯是:理解PD协议先从消息类型入手。先用逻辑分析仪抓一段PD通信,把每个控制消息和数据消息拆出来,对照spec看。从PD 2.0的几类消息开始,逐步加PPS和EPR细节。
总的来说,PD协议虽然版本多,但核心通信机制没变。掌握好2.0的基础,升级到3.0和3.1只是加功能。你想想看,有了这层认知,后面分析CC引脚的状态机就容易多了。