PD 充电协议:
前置名词:
DFP:Downstream Facing Port 也就是 host 主机,下行通信
UFP:Upstream Facing Port 也就是 Device 从机,上行通信
DRP:既可以做主机,也可以做从机
Source:通常指电源提供端,如电源适配器
Sink:通常指电源消耗端,如手机、平板
CC (Configuration Channel) :配置通道,用于识别、控制
BMC (Biphase Mark Coding):双相位标识编码,通过 CC 通信
SOP(Start of Packet Sequences):所有的 PD 传输流程,都是以 SOP 开始,SOP * 代表 SOP,SOP’,SOP’’
EOP(End of Packet):数据包结束的标志
# 1.CC 引脚:
CC 引脚(configuration channel):通过引脚实现设备角色识别与电源协商
CC1 和 CC2 负责配置通道,检测线缆插入方向,确定供电角色,建立 PD 通信链路
其具体的原理为物理层的电压检测
| 设备类型 | CC 端接方式 | 典型阻值 | 功能作用 |
|---|---|---|---|
| DFP(源端) | 上拉至 VBUS | RP = 56kΩ / 22kΩ / 默认 | 表明可供电 |
| UFP(受电端) | 下拉至 GND | RD = 5.1kΩ | 表明需取电 |
| Cable | Ra(有 e-Marker 线缆)或开路 | 约 800Ω | 标识线缆能力 |
在 DFP(如笔记本电脑、充电器)中,CC 引脚通过上拉电阻(RP)连接至 VCONN 或 VBUS;而在 UFP(上行端口,如手机)中,则通过 5.1kΩ 下拉电阻接地。

# USB PD 协议的数据格式:

一个完整的 USB PD 数据包由前导码 (Preamble),使用场景码 (SOP*),消息头 (MessageHeader),数据码 (Byte0-n)、校验码 (CRC)
以及结束码 (EOP) 组成,如果数据部分为空,说明数据包仅作为控制指令使用,称为控制消息。有数据内容的称为数据消息,
通常数据消息里包含了要变化的电压值和电流值等信息。整个 USB PD 数据包中,除了前导码不需要进行 4b5b 编码外,数据包
的其他部分均需要进行 4b5b 编码,指定数据经过 4b5b 编码后,数据包中所有数据都需要使用 BMC 编码之后才能通过 CC 发送。
# 前导码(Preamble)
前导码是为了锁定接收端,预示发送端将要有数据到达,前导码由交替的’0’和’1’组成,以’0’开始,以’1’结束
0101010101…
消息头(Message Header)

消息头长度为 16Bits,其包含数据包的类型,端口角色(UFP,DFP)等信息
-
Extended(15):控制或数据消息时为 0
-
Number of Data Objects(12-14):表示消息头后面的 32 位数据对象的数量
-
MessageID(9-11):其作用其实就是计数,开机时应该初始化为 0,当收到 Source 端收到 GoodCRC 消息时,消息计数器应该增加 1
-
端口电源角色(8):0 表示 Sink,电源消耗端,1 表示 Source,即供电端
-
Specification Revision(6-7):规范修订 00-Revision 1.0;01-Revision 2.0;10-Revision 3.0;11 - 保留,不得使用
-
Port Data Role (5):端口数据角色,0 表示 UFP ,1 表示 DFP
-
Message Type (0-4):消息类型,需要看 Number of Data Objects 的数值,Number of Data Objects 如果为 0,那么 Message type 表示控制指令;Number of Data Objects 如果为 1,表示传输数据
控制消息
![image-20260123144345852]()
![image-20260123151032539]()
数据消息
![image-20260123144354444]()
下面解释一下 Data Message Types 这几个类型的具体含义:
**Source _Capabilities:**0x01,源广播能力,充电器告诉设备我能提供这些挡位Requeset:0x02 设备告诉充电器,选择第几挡,需要多少电压,需要多少电流
BIST :0x03,自置内测试,用于链路测试
Sink_Capabilities:0x04,设备能力,设备主动告知充电器自己的充电需求,在 DRP 角色切换的时候使用
Battery_status:0x05,报告设备内部电池的详细信息(电量,健康度等)
Alert:0x06,报警时间,随时通知警告时间,比如说过热等
# 实例
1. 首先充电器进行广播 ——Source_Capabilities
比如充电器告知手机有三个档位,5V/3A。9V/2.22A,12V/1.67A
那么由于其是进行广播,所以 Message_type 等于 00001
Message Type(0-4):0x01(00001)Number of Data Objects(12-14):3(011)MessageID(9-11):1(001) (会话开始)- 第 8 位,由于是电源,所以为 1
那么消息头就可以生成为:
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
完整的数据包
[PREAMBLE][SOP][HEADER:0x67 0x41][DATA:PDO1(5V)][DATA:PDO2(9V)][DATA:PDO3(12V)][CRC32][EOP] |
2. 手机端请求供电 ——requset 请求
比如请求 9V,2A 的电流
Message Type(0-4):0x02(00010)Number of Data Objects(12-14):1(001)MessageID(9-11):2(010) (递增 1)端口电源角色(8):0(Sink)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
完整的数据包
[PREAMBLE][SOP][HEADER:0x14 0x82][DATA:RDO(请求9V/2A)][CRC32][EOP] |
3. 充电器接收请求 ——Accept
充电器确认收到并同意手机的请求。这是关键的协议控制步骤。
Message Type:0x03(00011),沿用之前假设的控制消息编码Number of Data Objects:0(000) 控制消息无数据MessageID:3(011) (递增 1)端口电源角色:1(Source)Port Data Role:1(DFP)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
4. 设备主动报告状态 - Battery_Status
手机主动向充电段报告当前电池电量为 85%
Message Type(0-4):0x05(00101) (你指定的编码)Number of Data Objects(12-14):1(001) (1 个电池数据对象 BDO)MessageID(9-11):4 (100) (递增 1)端口电源角色(8):0(Sink)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
完整的数据包:
[PREAMBLE][SOP][HEADER:0x16 0x85][DATA:BDO(电量85%)][CRC32][EOP] |
5. 充电器事件告警 - Alert
充电器检测到内部温度过高,向手机发送警报。
Message Type(0-4):0x06(00110) (你指定的编码)Number of Data Objects(12-14):1(001) (1 个警报数据对象 ADO)MessageID(9-11):5 (101`) (递增 1)端口电源角色(8):1(Source)
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
6. 手机请求停止充电 ( Request )
电池管理系统确认完全充满,请求零电流,实质停止充电。


