USB PD (USB Power Delivery) 是 USB开发者论坛 (USB-IF) 在2012年7月5日发布的 USB 充电标准与技术。USB PD 是指在 USB 电力传输中,一对直接连接的端口通过 CC 线作为通信通道来协商电压、电流和功率流方向。在 USB PD 出现之前,基于安全考虑,设备最高的充电功率仅为 15W。
PD 2.0 规范允许的最大电流为 5A,最高电压为20V,使设备最高的充电功率达到了 100W。普通 Type-C 线缆可以支持 3A 电流,最大充电功率 60W;但在需要 5A 电流的场合必须使用带有 E-Marker 电子标记的线缆,否则出于安全考虑电流将被限制在 3A。
PD 3.0 规范在 PD 2.0 的基础上增加了 PPS (Programmable Power Supply) 功能,其最大的特点是可编程性。PPS功能的步进调幅电压为20mV,步进调幅电流为 50mA,可以更好地控制 Vbus 电源,延长电池寿命。
PD 3.1 规范将原 PD 3.0 的内容归纳到标准功率范围 SPR (Standard Power Range),最大功率保持 100W 不变;同时增加了扩展功率范围 EPR (Extended Power Range),最高电流仍保持 5A 不变,将最高电压从 20V 提升到 48V,使得最大功率由 100W 提升到 240W。PD 3.1 支持的充电规格如下表所示:
| 可用电流和电压 | 功率范围 | 备注 | |
|---|---|---|---|
| 标准功率范围 SPR | 3A:5V, 9V, 15V, 20V 5A:20V |
15 – 60W > 60 – 100W |
5A 电流需要 5A 线缆 |
| 扩展功率范围 EPR | 3A:5V, 9V, 15V, 20V 5A:20V 5A:28V, 36V, 48V |
15 – 60W > 60 – 100W > 100 – 240W |
需要 EPR 线缆 |
1. PD 通讯基本流程
PD 供电协议的基本通讯流程如图 1.1 所示。消息通常都是由 发送 和 GoodCRC 回复 组成1,发送方发送消息后,接收方收到消息且消息通过 CRC 校验后,应向发送方回复 GoodCRC 消息以表示自己正确无误地收到了消息,发送方收到 GoodCRC 消息后表示此次消息发送成功。当消息发送方在 CRCReceiveTimer (0.9 ~ 1.1ms) 过期之前未能收到 GoodCRC 消息时,将触发重试机制,重新发送原消息。重试机制最多进行 nRetryCount (2) 次重试,如果 nRetryCount (2) 重试失败,则会使用软重置机制重置链路。

2. PD 供电协商过程
如图 2.1 所示,基于 Type-C 接口的 PD 充电的建立过程可分为以下几步:
- 电源适配器与耗电设备(如手机)建立连接之后,电源适配器通过
CC线发送Source_Capabilites消息告诉耗电设备,电源适配器能够提供多少种电压及相应的电流; - 耗电设备在得到电源适配器的供电能力之后,选择一个最适合自己的供电方式并向电源适配发送
Request消息请求自己需要的供电; - 电源适配器根据耗电设备的选择,评估自身的能力,能满足要求则发送
Accept消息;不满足要求则发送Reject消息; - 在
Accept数据包发送成功之后,电源适配器进行内部电压变换以提供请求的供电,然后向耗电设备发送PS_Rdy消息告诉耗电设备已提供请求的供电。

3. PD 供电角色切换
PD 的供电角色可以在运行过程中实现动态切换,即供电方可以切换为耗电方,耗电方也可以切换为供电方。
3.1 供电方变成耗电方
如图 3.1 所示,在供电过程中,如果供电方想变成耗电方,协商的流程如下:
- 供电方
Source发送RP_Swap消息请求切换供电角色; - 耗电方
Sink收到RP_Swap消息之后,判断是否允许切换供电角色; - 如果
Sink允许切换,则向Source发送Accept消息,表示其可以切换;如果不允许切换,则向Source发送Reject消息,供电角色切换失败; Source收到Accept消息后,会关掉VBus上的供电,然后发送PS_Rdy消息通知Sink;Sink收到PS_Rdy消息后,会向VBus上提供默认5V电压,然后发送PS_Rdy消息通知Source;Source收到PS_Rdy消息后,供电角色切换完成,原Source变成了Sink,原Sink变成了Source。

3.2 耗电方变成供电方
如图 3.2 所示,在供电过程中,如果耗电方想变成供电方,协商的流程如下:
- 耗电方
Sink发送RP_Swap消息请求切换供电角色; - 供电方
Source收到RP_Swap消息之后,判断是否允许切换供电角色; - 如果
Source允许切换,则向Sink发送Accept消息,表示其可以切换;如果不允许切换,则向Sink发送Reject消息,供电角色切换失败; Source发送Accept消息成功后,会关掉VBus上的供电,然后发送PS_Rdy消息通知Sink;Sink收到PS_Rdy消息后,会向VBus上提供默认5V电压,然后发送PS_Rdy消息通知Source;Source收到PS_Rdy消息后,供电角色切换完成,原Source变成了Sink,原Sink变成了Source。

4. PD 数据角色切换
Type-C 接口连接上时,如果接口是供电方,则数据角色默认为 DFP/HOST ;如果接口是耗电方,则数据角色默认为 UFP/Device。 PD 的数据角色可以在运行过程中实现动态切换,即主机可以切换为设备,设备也可以切换为主机。
4.1 主机切换为设备
如图 4.1 所示,如果主机想切换为设备,协商的流程如下:
- 主机
DFP发送Dr_SWap消息请求切换数据角色; - 设备
UFP收到Dr_SWap消息后,判断是否允许进行切换数据角色; UFP允许切换,则向DFP发送Accept消息;如果不允许切换,则向DFP发送Reject消息;DFP收到Accept消息后,当前DFP切换为UFP;UFP发送Accept消息成功后, 当前UFP切换为DFP,数据角色切换完成。

4.2 设备切换为主机
如图 4.2 所示,如果设备想切换为主机,协商的流程如下:
- 设备
UFP发送Dr_SWap消息请求切换数据角色; - 主机
DFP收到Dr_SWap消息后,判断是否允许进行切换数据角色; - 如果
DFP允许切换,则向UFP发送Accept消息;如果不允许切换,则向UFP发送Reject消息; UFP收到Accept消息后,当前UFP切换为DFP;DFP发送Accept消息成功后, 当前DFP切换为UFP,数据角色切换完成。

5. PD 消息结构
PD 3.1 规范定义了三种消息类型,分别为控制消息 (Control Messages) 、数据消息 (Data Messages) 和扩展消息 (Extend Messages):
- 控制消息:控制消息很短,长度为 16 位。控制消息用于管理端口与设备之间的消息流或交换,不需要额外数据的消息。
- 数据消息:数据消息的长度为 48 位到 240 位,用于在端口与设备之间进行数据交换。 数据消息分为三种类型,如下所示。
- 用于展示供电方电源能力的数据消息
- 用于 BIST 的数据消息
- 厂商自定义的数据消息
- 扩展消息:扩展消息的最大长度为
MaxExtendedMsgLen (260)字节,用于在端口与设备之间进行数据交换。以下是扩展消息的类型:- 用于电源和电池信息的扩展消息
- 用于安全的扩展消息
- 用于固件更新的扩展消息
- 厂商自定义的扩展消息
所有的消息都由 Message Header 消息头和可变长度 (包含0) 的 Data 数据部分组成。图 5.1 分别展示了作为消息数据包负载的控制消息、数据消息和扩展消息。

图 5.1 中的消息结构包括物理层和协议层部分,其中物理层部分包括:
- Preamble 前导码:传输的开始,用于让接收器能够锁定到载波上。
Preamble是一个64 位的0和1交替组成的序列,以0开始,以1结束,不进行4b5b编码。 - SOP* 包开始:用于描述数据包开始的
K-code标记。SOP*是SOP、SOP'和SOP"的统称,如图 5.2 所示,SOP*分别对应到不同的目标设备。- SOP:线缆对面的设备
- SOP’:线缆中在较靠近的
E-Marker - SOP”:线缆中在较远离的
E-Marker
- CRC 校验:对消息头和消息数据的
CRC校验。 - EOF 结束包:5 位的
4b5b编码。

5.1 Message Header 消息头
消息头长度为2字节,共16位。消息头各个二进制位含义如下表所示。
| 二进制位 | SOP | 名称 | 说明 |
|---|---|---|---|
| 15 | SOP* | Extended | 此消息是否为扩展类型 |
| 14 ~ 12 | SOP* | Number of Data Objects | 数据块个数,每个数据块是 32 位 |
| 11 ~ 9 | SOP* | MessageID | 消息ID, 消息成功接收时递增 |
| 8 | SOP | Port Power Role | 对于 SOP 信息,代表接口的供电角色 |
| 8 | SOP’/SOP’’ | Cable Plug | 对于 SOP’/SOP’’ 信息,代表此消息的来源 |
| 7 ~ 6 | SOP* | Specification Reversion | 此消息的当前版本 |
| 5 | SOP only | Port Data Role | 对于 SOP 消息代表接口的功能角色 |
| 5 | SOP’/SOP’’ | Reserved | 对 SOP’/SOP’’ 保留 |
| 4 ~ 0 | SOP* | Message Type | 消息类型 |
其中:
- Extended:扩展消息为
1,控制消息和数据消息为0。 - Number of Data Objects:当扩展字段
Extended为0时,Number of Data Objects表示消息头后面的32位数据块个数,此时Number of Data Objects为0时表示此消息是控制消息,不为0时表示此消息是数据消息。 - Port Power Role:表示端口当前的电源角色,为
0时是Sink耗电设备,为1时是Source供电设备。 - Port Data Role:表示端口当前的数据角色,为
0时是设备UFP,为1时是主机DFP。 - Cable Plug:表示消息的来源,为
0时消息来源于DFP/UFP,为1时消息来源于电缆插头或 VPD。VPD (VCONN-powered USB Device)即由Vconn供电的 USB 设备。 - Message Type:消息类型详见
5.3 控制消息类型和5.4 数据消息类型。
5.2 Extended Message Header 扩展消息头
扩展消息的扩展消息头紧接在消息头之后,扩展消息头长度为2字节,共16位。扩展消息头的各个二进制位含义如下表所示。
| 二进制位 | SOP | 名称 | 说明 |
|---|---|---|---|
| 15 | SOP* | Chunked | 此消息是否支持分块 |
| 14 ~ 11 | SOP* | Chunk Number | 数据块的编号 |
| 10 | SOP* | Request Chunk | 表示对数据块的请求还是响应 |
| 9 | SOP* | Reserved | 保留 |
| 8 ~ 0 | SOP* | Data Size | 消息中的数据字节总数 |
其中:
- Chunked:为
1表示消息支持分块,为0表示消息不支持分块。当消息头中的Extended和扩张消息头中的Chunked都为1时,消息头中的Number of Data Objects字段表示消息中应该4字节对齐的数据对象数。 - Chunk Number:
Chunked字段为0时此字段也应为0。该字段的使用有所不同,具体取决于消息是对数据的请求,还是返回的请求数据块:- 在数据请求中,
Chunk Number字段表示被请求的Chunk的编号,请求者应仅将此字段设置为最后一个接收到的块之后的下一个块的编号。 - 在返回的请求数据块中,
Chunk Number字段指示返回的Chunk的编号,每个Chunk的块编号应从0开始,每个块应递增 1,最多为 9,总共 10 个块。
- 在数据请求中,
- Request Chunk:为
1表示对数据块的请求,为0表示对数据块的响应。 - Data Size:表示消息中的数据字节总数,不得超过
MaxExtendedMsgLen (260)字节。如果Data Size字段小于MaxExtendedMsgLegacyLen (26)字节且Chunked字段为1,则数据应该用0填充到4 字节对齐。
5.3 控制消息类型
当消息是控制消息时,消息头中 Message Type 字段对应的值如下表所示。
| 二进制值 | 消息类型 | 描述 | 发送方 | SOP |
|---|---|---|---|---|
| 00000 | Reserved | 保留 | N/A | N/A |
| 00001 | GoodCRC | 确认之前的消息已被正确接收 | Source, Sink or Cable Plug | SOP* |
| 00010 | GotoMin | 供电调节到最小 | Source only | SOP only |
| 00011 | Accept | 接收对方的请求 | Source, Sink or Cable Plug | SOP* |
| 00100 | Reject | 拒绝对方的请求 | Source or Sink | SOP only |
| 00101 | Ping | 确认接收器是否继续存在 | Source only | SOP* |
| 00110 | PS_RDY | 电源已达到所需的操作条件 | Source or Sink | SOP only |
| 00111 | Get_Source_Cap | 获取对方的供电能力消息 | Source or Sink | SOP only |
| 01000 | Get_Sink_Cap | 获取对方耗电的需求 | Source or Sink | SOP only |
| 01001 | DR_Swap | 数据角色切换 | Source or Sink | SOP only |
| 01010 | PR_Swap | 电源角色切换 | Source or Sink | SOP only |
| 01011 | VCONN_Swap | 供电角色切换 | Source or Sink | SOP only |
| 01100 | Wait | 回复对方的请求,让结方稍等再进行请求 | Source or Sink | SOP only |
| 01101 | Soft_Reset | 软复位 | Source or Sink | SOP* |
| 01110 | Data_Reset | 数据复位 | Source or Sink | SOP only |
| 01111 | Data_Reset_Complete | 数据复位完成 | Source or Sink | SOP only |
| 10000 | Not_Supported | 不支持对方发送的请求 | “Source, Sink orCable Plug” | SOP* |
| 10001 | Get_Source_Cap_Extended | 获取对方的供电相关的扩展信息 | Sink or DRP | SOP only |
| 10010 | Get_Status | 获取对方的状态 | Source or Sink | SOP* |
| 10011 | FR_Swap | 快速供电角色切换 | Sink1 | SOP only |
| 10100 | Get_PPS_Status | 获取供电源操作状态的其他信息 | Sink | SOP only |
| 10101 | Get_Country_Codes | 获取本地化信息 | Source or Sink | SOP only |
| 10110 | Get_Sink_Cap_Extended | 获取对方耗电需求的附加信息 | Source or DRP | SOP only |
| 10111 | Get_Source_Info | 请求对方作为电源时的类型、最大能力和当前能力 | Sink or DRP | SOP Only |
| 11000 | Get_Revision | 请求对方支持的供电规范版本 | Source, Sink or Cable Plug | SOP Only |
| 11001 ~ 11111 | Reserved | 保留 | N/A | 保留 |
5.4 数据消息类型
当消息是数据消息时,消息头中 Message Type 字段对应的值如下表所示。
| 二进制值 | 消息类型 | 描述 | 发送方 | SOP |
|---|---|---|---|---|
| 00000 | Reserved | 保留 | N/A | N/A |
| 00001 | Source_Capabilities | 供电方的供电能力信息 | Source or DRP | SOP only |
| 00010 | Request | 请求供电 | Sink only | SOP only |
| 00011 | BIST | 物理层测试 | Tester, Source or Sink | SOP* |
| 00100 | Sink_Capabilities | 耗电方的耗电需求信息 | Sink or DRP | SOP only |
| 00101 | Battery_Status | 电池状态 | Source or Sink | SOP only |
| 00110 | Alert | 警告 | Source or Sink | SOP only |
| 00111 | Get_Country_Info | 获取本地化信息 | Source or Sink | SOP only |
| 01000 | Enter_USB | 进入指定的 USB 操作模式 | DFP | SOP* |
| 01001 | EPR_Request | 请求 EPR 供电 | Sink | SOP only |
| 01010 | EPR_Mode | 用于进入、确认和退出 EPR 模式 | Source or Sink | SOP only |
| 01011 | Source_Info | 对 Get_Source_Info 消息的响应 | Source | SOP only |
| 01100 | Revision | 对 Get_Revision 消息的响应 | Source, Sink or Cable Plug | SOP* |
| 01101 ~ 01110 | Reserved | 保留 | N/A | N/A |
| 01111 | Vendor_Defined | 厂商自定义信息 | Source, Sink or Cable Plug | SOP* |
| 10000 ~ 11111 | Reserved | 保留 | N/A | N/A |
5.5 扩展消息类型
当消息是扩展消息时,消息头中 Message Type 字段对应的值如下表所示。
| 二进制值 | 消息类型 | 描述 | 发送方 | SOP |
|---|---|---|---|---|
| 00000 | Reserved | 保留 | N/A | N/A |
| 00001 | Source_Capabilities_Extended | 对 Get_Source_Cap_Extended 消息的响应 | Source or DRP | SOP only |
| 00010 | Status | 对 Get_Status 消息的响应 | Source or Sink | SOP* |
| 00011 | Get_Battery_Cap | 获取电池容量 | Source or Sink | SOP only |
| 00100 | Get_Battery_Status | 获取电池状态 | Source or Sink | |
| 00101 | Battery_Capabilities | 对 Get_Battery_Cap 消息的响应 | Source or Sink | SOP only |
| 00110 | Get_Manufacturer_Info | 获取制造商信息 | Source or Sink | SOP* |
| 00111 | Manufacturer_Info | 对 Get_Manufacturer_Info 消息的响应 | Source, Sink or Cable Plug | SOP* |
| 01000 | Security_Request | 身份验证请求 | Source or Sink | SOP* |
| 01001 | Security_Response | 身份验证响应 | Source, Sink or Cable Plug | SOP* |
| 01010 | Firmware_Update_Request | 固件更新请求 | Source or Sink | SOP* |
| 01011 | Firmware_Update_Response | 固件更新响应 | Source, Sink or Cable Plug | SOP* |
| 01100 | PPS_Status | 对 Get_PPS_Status 消息的响应 | Source | SOP only |
| 01101 | Country_Info | 对 Get_Country_Info 消息的响应 | Source or Sink | SOP only |
| 01110 | Country_Codes | 对 Get_Country_Codes 消息的响应 | Source or Sink | SOP only |
| 0111 | Sink_Capabilities_Extended | 对 Get_Sink_Cap_Extended 消息的响应 | Sink or DRP | SOP only |
| 10000 | Extended_Control | 控制消息扩展信息 | Source or Sink | SOP only |
| 10001 | EPR_Source_Capabilities | 供电方的 ERP 供电能力信息 | Source or DRP | SOP only |
| 10010 | EPR_Sink_Capabilities | 耗电方的 ERP 耗电能力信息 | Sink or DRP | SOP only |
| 10011 ~ 11111 | Reserved | 保留 | N/A | N/A |
| 11110 | Vendor_Defined_Extended | 厂商自定义扩展信息 | Source, Sink or Cable Plug | SOP* |
| 11111 | Reserved | 保留 | N/A | N/A |
6. PD 供电消息分析
如图 61. 所示,对 PD 通信进行抓包,以 SRC_CAP 消息2为例根据 Message Header 结构进行消息分析。

此 SRC_CAP 消息的消息头值为 0X41A1,其组成及含义如图 6.2 所示。

Extended 值为 0 且 Number of Data Objects 值为 4,表示此消息是有 4 个数据块的数据消息,所以带 SRC_CAP 负载的 USB PD 数据包结构如图 6.3 所示。

SRC_CAP 消息中的数据块是功率数据对象 PDO (Power Data Object) ,PDO 的结构如下表所示 。
| 二进制位 | 名称 | 值 | 描述 |
|---|---|---|---|
| 31 ~ 30 | PDO 类型 | 00b | 固定电源 (Vmin = Vmax),即: 最小电压 = 最大电压 |
| 01b | 电池 | ||
| 10b | 可变电源(非电池) | ||
| 11b | 增强功率数据对象 (APDO) | ||
| 29 ~ 0 | N/A | N/A | 电源功能详见特定的PDO 描述 |
随着协议的发展,PDO 类型已经超过4种, PDO 类型字段由原来的 2 位扩展到 4 位来支持四种以上的 PDO 类型,即 当 PDO 中第 31 ~ 30 位值为 11b 时,扩展第 29 ~ 28 位来描述新的 PDO 类型,此时的功率数据对象被称为增强型功率数据对象 APDO (Augmented Power Data Object),APDO 的结构如下表所示 。
| 二进制位 | 值 | 描述 |
|---|---|---|
| 31 ~ 30 | 11b | APDO |
| B29…28 | 00b | SPR 可编程电源 |
| 01b | EPR 可调电压电源 | |
| 10b ~ 11b | 保留 | |
| 27 ~ 0 | N/A | 电源功能详见特定的PDO 描述 |
在图 6.3 中, 4 个数据块中第 31 ~ 30 位都为 0,即 PDO 类型为固定电源供电,对于 固定电源供电的 PDO 结构 如下表所示。
| 二进制位 | 描述 |
|---|---|
| 31 ~ 30 | 固定电源 |
| 29 | 双重电源角色,在端口具有双重电源角色能力时设置,即它支持 PR_Swap 消息 |
| 28 | 是否支持 USB 挂起 |
| 27 | 不受约束的电源,在电源为外部设备充电的同时足以为系统供电,或者当设备的主要功能是为外部设备充电时置为 1 |
| 26 | USB 通信能力,只能为能够通过 USB 数据线进行通信的 Source 设置 |
| 25 | 双重数据角色,在端口具有双重数据角色能力时设置,即它支持 DR_Swap 消息 |
| 24 | 是否支持未分块的扩展消息 |
| 23 | 是否支持 EPR 模式 |
| 22 | 保留,应置 0 |
| 21 ~ 20 | 峰值电流,在某些场景中可能希望使电源短时间过载的附加功能 |
| 19 ~ 10 | 以 50mV 为单位的电压 |
| 9 ~ 0 | 以 10mA 为单位的最大电流 |
根据 固定电源供电的 PDO 结构 表,我们将 PD 抓包获取到的 SRC_CAP 消息中的数据块解析为供电能力为:5V/3A、9V/3A、15V/1.8A、20V/1.35A。图 6.4 展示了以第一个数据块 0X0A01912C 为例解析供电能力的过程。

参考资料
-
BIST 在连续 BIST 模式下不会发送 GoodCRC 消息,请参阅 Universal Serial Bus Power Delivery Specification 第 6.4.3 节。 ↩
-
更多关于
Source_Capabilities的内容请参阅 Universal Serial Bus Power Delivery Specification 第 6.4.1 节 Capabilities Message。 ↩