第三章:PD协议基础
3.1 USB PD协议概述
USB PD,全称是USB Power Delivery。说白了,它就是Type-C接口的「能量管理大脑」。
我刚开始接触PD协议时,有个误区——以为Type-C插上就能快充。其实不是。Type-C只是物理接口,真正决定能不能快充、能充多快,全靠PD协议在背后沟通。
PD协议的核心能力,我总结为三点:
- 高功率传输:最高支持240W(PD 3.1标准),远超传统USB的2.5W
- 双向供电:设备可以决定自己是充电还是放电
- 动态协商:充电功率不是固定的,可以实时调整
你想想看,如果没有PD协议,两个设备插上Type-C,它们怎么知道谁该供电、供多少电?这就是PD协议要解决的问题。
核心概念:PD协议运行在CC(Configuration Channel)线上,通过BMC编码传输数据。它独立于USB数据通道,所以即使USB数据没跑起来,充电功能也能正常工作。
3.2 PD消息类型
PD协议的消息,我习惯把它分成三大类。就像人与人沟通,有「打招呼」、「谈正事」、「确认收到」三种模式。
3.2.1 控制消息(Control Message)
这类消息最短,只有消息头,没有数据负载。它们负责握手和状态管理。
| 消息名称 | 含义 | 典型场景 |
|---|---|---|
| GoodCRC | 确认收到 | 每收到一个消息都必须回复 |
| Accept | 接受请求 | 电源协商时同意对方要求 |
| Reject | 拒绝请求 | 不支持某个电压/电流组合 |
| Wait | 请等待 | 暂时无法响应,稍后再试 |
| PS_RDY | 电源就绪 | 电压/电流切换完成 |
| Get_Source_Cap | 请求源端能力 | 想知道对方能提供什么电源 |
| Get_Sink_Cap | 请求宿端能力 | 想知道对方需要什么电源 |
我曾经在一个项目中,设备总是无法进入PD协商。抓了CC线上的波形才发现,是GoodCRC回复超时了。嗯,这里要注意——GoodCRC必须在接收消息后的15ms内回复,否则对方会认为通信失败。
3.2.2 数据消息(Data Message)
这类消息携带数据负载,最长可达260字节。电源协商中最关键的两个数据消息就是:
- Source_Capabilities:源端发送,告诉对方「我能提供这些电源选项」
- Sink_Capabilities:宿端发送,告诉对方「我需要这些电源选项」
个人经验:我建议在调试时,先用逻辑分析仪抓取Source_Capabilities消息。如果这个消息都没发出来,说明CC通信链路就有问题。这是排查PD问题的第一步。
3.2.3 扩展消息(Extended Message)
PD 3.0引入的新类型。用于传输更复杂的信息,比如:
- 固件升级数据
- 电池状态信息
- 制造商自定义数据
说实话,大部分硬件工程师日常接触最多的是控制消息和数据消息。扩展消息更多用在笔记本、显示器这类复杂设备上。
3.3 电源协商过程
电源协商,我把它比作「讨价还价」。源端先报价,宿端再还价,最后成交。
完整的协商流程是这样的:
- 连接检测:CC线检测到设备插入,双方进入PD通信模式
- 能力广播:源端发送Source_Capabilities,列出所有支持的电源档位
- 请求选择:宿端从列表中选择一个档位,发送Request消息
- 确认切换:源端回复Accept,然后切换电压/电流
- 就绪通知:源端发送PS_RDY,告诉宿端「电源已稳定,可以用了」
避坑指南:我曾经遇到一个案例,宿端发送Request后,源端回复了Accept,但电压切换时产生了过冲。原因是源端的输出电容太大,切换速度太快导致电压尖峰。后来我们在固件中增加了软启动延时,问题才解决。
你可能会问:如果宿端想要的档位源端没有怎么办?
答案是:宿端只能从源端提供的列表里选。如果都不满意,可以发送GiveBack消息,请求源端重新提供一份能力列表。或者,宿端也可以发送Wait消息,告诉源端「我先想想,等会儿再谈」。
3.4 PDO与RDO
这两个缩写,我刚开始学PD时经常搞混。现在用一句话说清楚:
PDO是菜单,RDO是点菜。
3.4.1 PDO(Power Data Object)
PDO就是源端提供的电源档位列表。每个PDO占4个字节,包含电压、电流、供电能力等信息。
常见的PDO类型有:
| PDO类型 | 描述 | 示例 |
|---|---|---|
| 固定PDO | 固定电压输出 | 5V/3A, 9V/3A, 15V/3A |
| 可变PDO | 电压在一定范围内可调 | 3.3V~21V/5A |
| 电池PDO | 针对电池供电设备 | 电压范围+最大功率 |
举个例子,一个典型的PDO数据包可能是这样的:
PDO 1: 5V/3A (固定)
PDO 2: 9V/3A (固定)
PDO 3: 15V/3A (固定)
PDO 4: 20V/5A (固定)
我习惯在设计电源适配器时,至少保留一个5V档位。为什么?因为很多老旧设备只支持5V,没有这个档位它们就无法充电。
3.4.2 RDO(Request Data Object)
RDO是宿端发送的请求消息。它从PDO列表中选择一个档位,并指定具体的电流值。
RDO的结构包含:
- Object Position:选择第几个PDO(从1开始编号)
- Operating Current:实际工作电流
- Max Current:最大允许电流
- Capability Mismatch:标记是否选择了不匹配的档位
关键点:RDO中的Operating Current可以小于PDO中定义的最大电流。比如PDO是20V/5A,宿端可以只请求20V/2A。但绝对不能超过PDO的最大电流——这是硬件保护底线。
3.4.3 实际项目中的PDO设计建议
我在设计Type-C电源产品时,PDO的配置遵循一个原则:够用就好,不要贪多。
为什么?因为每个PDO都需要硬件支持。比如你写了20V/5A的PDO,但你的电源芯片只能输出3A,那这个PDO就是虚假宣传。设备请求后你切不过去,就会导致协商失败。
我建议的PDO配置策略:
- 5V档位必留:兼容性保障
- 中间档位按需:根据目标设备选择9V或15V
- 最高档位留余量:标称功率的80%作为实际最大输出
举个例子,如果你的电源芯片最大支持65W,我建议PDO这样配:
PDO 1: 5V/3A (15W)
PDO 2: 9V/3A (27W)
PDO 3: 15V/3A (45W)
PDO 4: 20V/3A (60W) ← 留了5W余量
这样既保证了兼容性,又留足了安全余量。我在多个项目中验证过,这个配置方案很少出问题。
调试小技巧:如果你用PD分析仪抓包,看到宿端发送了Capability Mismatch标记的RDO,说明宿端想要的档位源端没有提供。这时候要么修改PDO列表,要么检查宿端的请求逻辑。
好了,PD协议的基础内容就这些。下一章我们会深入PD的物理层实现,包括CC线的电气特性和BMC编码细节。到时候我会分享一个我踩过的坑——CC线电平匹配问题,差点导致整个项目延期。