第三章: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 电源协商过程

电源协商,我把它比作「讨价还价」。源端先报价,宿端再还价,最后成交。

完整的协商流程是这样的:

  1. 连接检测:CC线检测到设备插入,双方进入PD通信模式
  2. 能力广播:源端发送Source_Capabilities,列出所有支持的电源档位
  3. 请求选择:宿端从列表中选择一个档位,发送Request消息
  4. 确认切换:源端回复Accept,然后切换电压/电流
  5. 就绪通知:源端发送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配置策略:

  1. 5V档位必留:兼容性保障
  2. 中间档位按需:根据目标设备选择9V或15V
  3. 最高档位留余量:标称功率的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线电平匹配问题,差点导致整个项目延期。