3、PD协议入门:从握手到充电的完整对话
说到Type-C充电,很多人第一反应就是“插上去就能充”。但实际做硬件设计的都知道,这背后有一套完整的通信协议在运作。PD协议,全称Power Delivery,就是这套通信的“语言规则”。
我刚开始接触PD协议时,觉得它特别复杂。后来做多了才发现,它本质上就是两个设备之间的对话。一个说“我能提供5V”,另一个说“我需要9V”,然后双方达成一致。就这么简单。
3.1 PD协议概述
PD协议是USB-IF组织定义的一套电源传输标准。它最大的特点就是:双向、可协商、高功率。
传统USB充电只有5V,电流也有限。PD协议把电压范围扩展到了5V、9V、15V、20V,功率最高能到240W(PD 3.1标准)。这意味着什么?你想想看,一个Type-C接口,既能给手机充电,也能给笔记本供电,甚至还能驱动显示器。
我在项目中遇到过最典型的场景:客户要求用一个Type-C口同时支持充电和视频输出。嗯,这就是PD协议里很经典的“多功能复用”场景。没有PD协议,你根本没法在一个接口上同时处理电源和数据。
PD协议的核心能力:
- 电压协商:Source和Sink之间动态调整电压
- 角色互换:设备可以随时切换供电方和受电方
- 数据融合:在电源线上同时传输数据和视频信号
- 热插拔:支持随时插拔,不会损坏设备
3.2 PD消息结构
PD协议的消息结构,说白了就是一套固定格式的数据包。每个消息都包含几个关键部分:
| 字段 | 长度 | 说明 |
|---|---|---|
| Preamble | 4字节 | 同步头,用于接收端锁定时钟 |
| SOP | 1字节 | 起始包,标识消息类型 |
| Header | 2字节 | 消息头,包含消息类型、长度、方向等 |
| Data Object | 0-28字节 | 数据对象,具体内容取决于消息类型 |
| CRC | 4字节 | 校验码,保证数据完整性 |
| EOP | 1字节 | 结束包 |
这里有个细节我特别想强调:CRC校验。PD协议对数据完整性要求很高,因为一旦电压协商出错,可能直接烧设备。我曾经调试过一个项目,就是CRC计算逻辑写错了,导致设备偶尔会协商出错误的电压。排查了整整两天才找到问题。
消息类型主要分两类:
- 控制消息:比如GoodCRC、Accept、Reject等,用于握手和确认
- 数据消息:比如Source_Capabilities、Request、VDM等,携带具体参数
3.3 VDM(Vendor Defined Message)基础
VDM,全称Vendor Defined Message。说白了就是“厂商自定义消息”。PD协议给厂商留了一个“后门”,允许你在标准协议之外,定义自己的私有通信内容。
为什么要这么做?举个例子:你想在充电的同时,让设备识别你的品牌、型号、甚至固件版本。这些信息标准PD协议里没有定义,但通过VDM就可以实现。
VDM的结构其实很简单:
VDM消息格式:
- VDM Header (4字节):标识VDM类型、版本、命令等
- VDM Data (可变长度):厂商自定义的数据内容
VDM分为两种:
- Unstructured VDM:无结构VDM,数据完全由厂商自己定义
- Structured VDM:结构化VDM,遵循USB-IF定义的格式
个人经验:我在做一款快充充电器时,用VDM实现了“设备身份认证”功能。充电器通过VDM读取手机的序列号,然后判断是否支持私有快充协议。这个功能在标准PD协议里是做不到的。
3.4 PD通信流程
PD通信流程,说白了就是“握手-协商-供电”三步走。我习惯把它比作两个人见面:
- 物理连接:插上Type-C线,CC引脚检测到连接
- 能力宣告:Source端发送Source_Capabilities消息,告诉Sink“我能提供哪些电压电流”
- 请求协商:Sink端根据自身需求,发送Request消息,请求某个电压电流组合
- 确认供电:Source端回复Accept,然后切换到目标电压,开始供电
- 持续监控:双方持续通信,检测是否断开或需要重新协商
这里有个坑,我必须要提醒你:电压切换是有时序要求的。Source端在收到Accept后,必须在规定时间内完成电压切换。如果切换太慢,Sink端可能会误判为故障,然后断开连接。
避坑指南:我曾经遇到过一个问题:充电器在切换电压时,输出电容放电太慢,导致电压下降时间超过了PD协议规定的tTransition时间。结果手机检测到电压异常,直接断开了充电。后来我们在输出端加了一个放电电阻,才解决了这个问题。
完整的PD通信流程,其实还包括很多细节:
- Hard Reset:当通信异常时,双方可以发起硬复位
- Soft Reset:软复位,只重置通信状态,不切断电源
- Power Role Swap:供电角色互换,比如手机给充电宝充电
- Data Role Swap:数据角色互换,比如从U盘模式切换到主机模式
嗯,PD协议入门就讲到这里。下一章我们会深入PD消息的细节,包括如何解析Source_Capabilities、如何构造Request消息。到时候我会拿一个实际的项目代码来演示,保证你能看懂。
记住一句话:PD协议不神秘,它就是两个设备之间的对话。你只要掌握了“说什么、怎么说、什么时候说”,就能搞定它。