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Ω 下拉电阻接地。

image-20260123163101575

# USB PD 协议的数据格式:

image-20260122181801106

一个完整的 USB PD 数据包由前导码 (Preamble),使用场景码 (SOP*),消息头 (MessageHeader),数据码 (Byte0-n)、校验码 (CRC)

以及结束码 (EOP) 组成,如果数据部分为空,说明数据包仅作为控制指令使用,称为控制消息。有数据内容的称为数据消息,

通常数据消息里包含了要变化的电压值和电流值等信息。整个 USB PD 数据包中,除了前导码不需要进行 4b5b 编码外,数据包

的其他部分均需要进行 4b5b 编码,指定数据经过 4b5b 编码后,数据包中所有数据都需要使用 BMC 编码之后才能通过 CC 发送。

# 前导码(Preamble)

前导码是为了锁定接收端,预示发送端将要有数据到达,前导码由交替的’0’和’1’组成,以’0’开始,以’1’结束

0101010101…

消息头(Message Header)

image-20260123141229552

消息头长度为 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 )

电池管理系统确认完全充满,请求零电流,实质停止充电。

更新于 阅读次数 0

请我喝[茶]~( ̄▽ ̄)~*

bangdexuanyuan 微信支付

微信支付