2. PD协议基础:协议的分层架构与消息机制
大家好,我是老张。今天咱们聊聊PD协议的基础架构。说实话,很多工程师一上来就啃协议栈,结果越看越晕。我当年也是这样,直到有一次在项目中调试一个65W快充,死活无法握手成功,才逼着自己把协议分层彻底搞明白。
PD协议其实不复杂。它分了三层:物理层、协议层、策略层。每一层各司其职。咱们一层层拆开看。
2.1 分层架构:三层各管什么事?
先看这张分层图,我习惯把它想象成一个快递系统:
| 层级 | 类比 | 核心职责 |
|---|---|---|
| 物理层 | 快递员+马路 | 电压、电流、信号完整性 |
| 协议层 | 快递单+分拣规则 | 消息封装、校验、重传 |
| 策略层 | 仓库调度中心 | 功率协商、角色切换、状态机 |
物理层——说白了就是CC线怎么传信号。PD用的是BMC编码,频率300kHz。嗯,这里要注意:CC线上的电压范围是1.2V到2.4V,不是传统的3.3V。我见过有人直接用3.3V电平去怼CC线,结果烧了协议芯片。千万别这么干。
协议层——负责把数据打包成消息。每个消息有固定的帧格式:前导码、SOP、消息头、数据对象、CRC。我建议你重点看消息头里的MessageType字段,它决定了这条消息是控制消息还是数据消息。
策略层——这是最上层的逻辑。它管理着Source和Sink之间的状态机。比如:Source刚插入时处于PE_SRC_Startup状态,收到Sink的请求后才进入PE_SRC_Send_Capabilities。你想想看,如果没有策略层,物理层和协议层就是一堆乱码。
核心要点:三层之间通过标准接口通信。物理层只管收发比特流,协议层只管消息完整性,策略层才管业务逻辑。分层的好处是——你改策略层的代码,完全不用动物理层。
2.2 PD消息类型:控制消息 vs 数据消息
PD协议里只有两种消息:控制消息和数据消息。怎么区分?看消息头的MessageType字段。控制消息的MessageType是0~15,数据消息是16~31。
控制消息——短小精悍,没有数据对象。常见的有:
GoodCRC:确认收到消息。每次收到消息都必须回复这个,否则发送方会重传。Accept:Source同意Sink的请求。Reject:Source拒绝请求。比如你请求20V/5A,但Source只支持20V/3A,它就回Reject。PS_RDY:电源准备好了。Source切换电压后发这个,告诉Sink可以开始取电。
数据消息——带数据对象,信息量大。常见的有:
Source_Capabilities:Source广播自己支持哪些电压电流组合。最多7个PDO。Request:Sink从中选一个PDO,发请求给Source。BIST:测试模式用的,生产线上常见。
我的经验:调试时最常看到的是GoodCRC和Source_Capabilities。如果抓包发现只有GoodCRC没有Source_Capabilities,那大概率是物理层有问题——CC线断了或者电平不对。
2.3 PD通信流程:Source/Sink角色怎么玩?
PD通信的核心就是Source和Sink两个角色。Source是供电方,比如充电器;Sink是受电方,比如手机。但注意,角色可以互换——这就是DRP(双角色端口)。
咱们看一个典型的Source给Sink供电的流程:
- 连接检测:Source检测到CC线上有下拉电阻(Rd),知道Sink连上了。
- 发送能力:Source广播
Source_Capabilities消息,告诉Sink自己支持哪些电压电流。 - Sink请求:Sink从中选一个PDO,发
Request消息。 - Source确认:Source回
Accept,然后切换电压。 - 电源就绪:Source电压稳定后,发
PS_RDY。 - 正常供电:Sink开始取电。期间双方会定期发
GoodCRC保持连接。
为什么会这样设计?因为PD协议要求Source必须先发能力,Sink不能主动要电。我遇到过一款山寨充电器,它反过来——先让Sink发请求,结果手机直接不认,一直5V慢充。
避坑指南:我曾经在调试一个车充项目时,发现Sink请求20V后,Source回了Accept但迟迟不发PS_RDY。查了半天,原来是Source的电压切换电路有延迟,超过了协议规定的15ms超时时间。Sink等不及就断开了。解决办法是调整Source的软启动时间,确保在12ms内完成切换。
2.4 消息交互的时序要求
PD协议对时间要求很严。我列几个关键参数:
| 参数 | 最小值 | 最大值 | 说明 |
|---|---|---|---|
| tSenderResponse | 24ms | 30ms | 发送方等待回复的时间 |
| tReceiveTimer | 15ms | 20ms | 接收方等待下一个消息的时间 |
| tPSTransition | — | 15ms | 电压切换完成时间 |
| tSrcRecover | 660ms | 1000ms | Source过流保护后的恢复时间 |
你想想看,如果Source切换电压花了20ms,超过了15ms的tPSTransition,Sink就会认为Source出故障了,直接断开连接。所以硬件设计时,一定要给电压切换留够余量。
总结一下:PD协议的三层架构把复杂问题拆解了。物理层管信号,协议层管消息,策略层管业务。控制消息和数据消息各有用途。Source/Sink的通信流程是固定的,时序要求很严格。搞懂这些,你就能看懂大部分PD协议的问题了。
下一章咱们聊PDO和APDO的细节,那是功率协商的核心。到时候我会分享一个我在65W氮化镓充电器上遇到的PDO排序坑,保证让你少走弯路。