笔者最近在调试艾为半导体的PD芯片,第一次接触PD快充协议,记录本篇作为学习开发记录,方便随时回忆。
本文主要基于《Universal Serial Bus Power Delivery Specification Revision: 3.2》手册,一些配图来自该手册或PD2.0手册。
若有不对,请多多指教~
另外,------“天下苦5V1A久矣!”
简要的说,PD是一种协议,并不直接参与到充电的具体操作,而是作为充电设备和用电设备沟通的桥梁。让“设备”与“设备”可以互相了解、合作。
一、PD角色总览
PD协议规范了各种场景下的供电、用电角色,按照不同场景进行划分。把这些角色搞明白后,后面的内容就好理解了。
(1)DFP/UFP,根据数据方向来划分,分为三种角色:
- Downstream Facing Port (DFP):面向下游的端口,即USB HOST,一般是供电设备
- Upstream Facing Port (UFP):面向下游的端口,即USB Device或USB集线器,一般是用电设备
- Dual-Role Data Ports:双角色数据端口,可以作为DFP或UFP进行操作
不过要注意,一个产品可以是双角色数据端口,但不是双角色电源端口。
它可以在DFP和UFP角色之间进行逻辑切换,即使它是仅供电端口或仅用电端口。
(2)Power supply,根据供电/用电来划分,分为三种角色:
- Source:顾名思义,能供电的
- Sink:顾名思义,能用电的
- Dual-Role Power(DRP) Ports:顾名思义,既能供电用能用电的(不是同时),结果取决于设备间的协商
- Dead Battery or Lost Power Detection:第一眼不知道是个啥
- VCONN Source:第一眼不知道是个啥,好像跟电缆通信相关,后续补充
(3)Provider/Consumer,特定场景下根据正在供电/用电的设备来划分,分为两种角色:
这两个概念跟Source,Sink挺相近的,一开始笔者也搞混了以为是同个东西的不同说法,实际上是有区别的。
- Source vs Provider
Source是一个固定角色,指物理上提供电力的设备;Provider则是一个动态角色,指的是特定时刻下正在提供电力的设备。
Provider可以是Source,也可以是支持Dual-Role Power(DRP)在供电时的角色。 - Sink vs Consumer:
同上
二、PD协议总览
PD协议类似其他通信协议,也是分了好几层,可以参考官方的协议栈示意图。数据根据协议层层嵌套,但各层处理数据时又相当独立,各司其职。由于PD协议相对其他通信协议较为简单,后面我会按照由物理层到设备策略层的方向,慢慢拨开它的战争迷雾。
三、Physical Layer
PD通信以Packet为最小单位,Packet的组成非常的传统,由前导包Preamble、SOP、数据、CRC和EOP组成。
那么物理层在这其中做哪些事情呢?
- 对于发送方物理层:
1、填充前导包Preamble、SOP和EOP;
2、计算CRC; - 对于接收方物理层:
1、识别前导包Preamble、SOP和EOP,知道什么时候来数据了,且能知道数据什么结束。
2、计算CRC并对比,如果正确,就把数据包传递给Protocol层;如果错误,就忽略并等待下一包数据;
整体的物理层就是这么朴实无华,当然其中还包括一些数据编码解码的工作,这里不多介绍,只要知道除了Preamble其他bit都是经过编码的即可,接下来补充一些细节。
(1)Preamble
根据PD官方文档,前导包由64bit交替的’0’和’1’组成,起始位为’0’,结束位为’1’。
且前导包不会使用4b/5b编码,可以直接用示波器或者逻辑分析仪抓到电平变化。
(2)SOP
SOP主要用于标识和区分不同类型数据包,接收方识别到SOP才能进行下一步,遇到不认识的SOP就过滤数据。
SOP一共有以下几种:
- SOP:Start of Packet Sequence
- SOP‘:Start of Packet Sequence Prime:一般要获取高性能USB-C电缆的特性时使用
- SOP’':Start of Packet Sequence Double Prime:一般要获取电缆插头的特性信息时使用
- SOP’_Debug:Start of Packet Sequence Prime Debug
- SOP’'_Debug:Start of Packet Sequence Double Prime Debug
(3)数据包,后文详细讲
(4)CRC
CRC使用的是CRC32,CRC公式比较复杂不做介绍,知道初值是0xFFFFFFFFH即可。
CRC32计算的范围是除了Preamble、SOP、EOP和自己以外的所有数据。
CRC32校验在PD通信中非常重要,因为通信过程中,收到任何一个包,都需要校验CRC32成功后返回GoodCRC包给对方,表示你发的东西我收到了,可以继续后面的过程了。如果CRC32出错,可能会导致整个通信过程中断。
(5)Hard Reset
硬复位是一串特殊的数据流,由物理层组织发送,作用就是让通信双方复位到初始状态重新通信。
四、Protocol Layer
…未完待续