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通信流程,说白了就是“握手-协商-供电”三步走。我习惯把它比作两个人见面:

  1. 物理连接:插上Type-C线,CC引脚检测到连接
  2. 能力宣告:Source端发送Source_Capabilities消息,告诉Sink“我能提供哪些电压电流”
  3. 请求协商:Sink端根据自身需求,发送Request消息,请求某个电压电流组合
  4. 确认供电:Source端回复Accept,然后切换到目标电压,开始供电
  5. 持续监控:双方持续通信,检测是否断开或需要重新协商

这里有个坑,我必须要提醒你:电压切换是有时序要求的。Source端在收到Accept后,必须在规定时间内完成电压切换。如果切换太慢,Sink端可能会误判为故障,然后断开连接。

避坑指南:我曾经遇到过一个问题:充电器在切换电压时,输出电容放电太慢,导致电压下降时间超过了PD协议规定的tTransition时间。结果手机检测到电压异常,直接断开了充电。后来我们在输出端加了一个放电电阻,才解决了这个问题。

完整的PD通信流程,其实还包括很多细节:

  • Hard Reset:当通信异常时,双方可以发起硬复位
  • Soft Reset:软复位,只重置通信状态,不切断电源
  • Power Role Swap:供电角色互换,比如手机给充电宝充电
  • Data Role Swap:数据角色互换,比如从U盘模式切换到主机模式

嗯,PD协议入门就讲到这里。下一章我们会深入PD消息的细节,包括如何解析Source_Capabilities、如何构造Request消息。到时候我会拿一个实际的项目代码来演示,保证你能看懂。

记住一句话:PD协议不神秘,它就是两个设备之间的对话。你只要掌握了“说什么、怎么说、什么时候说”,就能搞定它。