USB PD 3.1协议解析
USB PD 3.1
那什么是USB_PD_3.1呢?USB3.1是USB的一种传输标准,速度可以达到10Gbit/s,那PD是什么?PD(Power Delivery)就是电力输送,也就是充放电用的,它可以达到最高100W的功率。
1、资料下载地址
2、Type-C接口
信号组 | 信号 | 描述 |
---|---|---|
USB3.1 | RX2+,RX2-,TX2+,TX2-,TX1-,TX1+,RX1-,RX1+, | 高速USB串行数据接口定义了一组差分发送对,和一组差分接收对。在USB Type C的插座上定义了两组高速USB信号引脚,已提供翻转功能。 |
USB2.1 | D+,D-,D-,D+ | USB2.0串行数据接口定义了1个差分对。在USB Type C插座上定义了两组USB2.0信号引脚以提供翻转功能 |
配置 | CC1,CC2 | CC通道供插头连接检测,接口配置和VCONN |
辅助信号 | SBU1,SBU2 | 边带使用 |
功率 | VBUS,VCONN, GND | USB线缆总线电源,USB插头电源,USB线缆返回当前路径 |
3、Message
要想进行快充,首先source和sink端要进行功率协商,通过消息交换,source端提供已有的功率档位,sink请求想要的功率档位,source端调整功率达到sink请求的功率,开始供电。
(1)Message Type
我们先来了解一下Message的类型,总分为三大类,Control Message(控制消息),Data Message(数据消息),Extended Message(扩展消息)
Control Message消息格式
Preamble (前导码) | SOP* (Start Of Packet) CRC EOP (End Of Packet) (数据包头) | Message Header (16 bit) (消息头) | CRC (crc校验) | EOP (End Of Packet) (数据包尾) |
---|
Data Message消息格式
Preamble (前导码) | SOP* (Start Of Packet) CRC EOP (End Of Packet) (数据包头) | Message Header (16 bit) (消息头) | 0…7 Data Object(s)(数据对象) | CRC (crc校验) | EOP (End Of Packet) (数据包尾) |
---|
Extended Message消息格式
Preamble (前导码) | SOP* (Start Of Packet) CRC EOP (End Of Packet) (数据包头) | Message Header (16 bit) (消息头) | Extended Message Header (16 bit)(扩展消息头) | Data (0…260 bytes)(数据) | CRC (crc校验) | EOP (End Of Packet) (数据包尾) |
---|
(2)Message Header
Extended:1位Extended字段应设置为0以表示控制消息或数据消息,设置为1以表示扩展消息。扩展字段应适用于所有SOP*数据包类型
Number of Data Objects:当Extended设置为0时,3位Number of Data Objects字段应表示消息头后面的32位数据对象的数量。当此字段为0时,该消息为控制消息,而当它为非0时,该消息为数据消息。
MessageID:3位MessageID字段是由消息的发起者维护的滚动计数器生成的值。由于软复位或硬复位,信息应在开机时初始化为零。当收到GoodCRC消息时,成功接收到消息时,消息标识计数器应增加。注意:在使用BIST消息进行测试期间,MessageID的使用在[USBPD遵从性]中定义。
Port Power Role:1位Port Power Role字段应表示端口的当前的电源角色:0b Sink 1b Source
Cable Plug:1位Cable Plug字段应表示此消息是否来自电缆插头还是VPD:
- 0b 消息来自于一个DFP或UFP。
- 1b 消息来源于电缆插头或VPD
Specification Revision:Specification Revision字段应为以下值之一(11b除外):
- 00b-Revision1.0
- 01b-Revision2.0
- 10b-Revision3.0
- 11b-保留,不得使用。
Port Data Role:1位Port Data Role字段应指示端口的当前数据角色:
- 0b UFP
- 1b DFP
Message Type:5位Message Type字段应指示正在发送的消息的类型。要完全解码消息类型,首先检查“Number of Data Objects”字段,以确定消息是控制消息还是数据消息。然后可以在表6-5(表6的控制消息)或表6-6(数据消息)中找到特定的消息类型。消息类型字段应适用于所有SOP*数据包类型。
Tips:本文只对Message Header字段做一个简单地解释,其他请参考USB官网发布的文档,本文也是从官方文档中截取部分内容
4、数据编码
(1)CRC
发射端执行以下功能:
- 从协议层接收分组数据。
- 计算并附加一个CRC。
- 编码包括CRC(即有效载荷)在内的数据包数据。(也就是消息格式中标红的部分,往上翻)
- 通过CC上的双相标记编码(BMC)传输信包(序言、SOP*、有效载荷、CRC和EOP)。
接收端执行以下功能:
- 恢复时钟并从序言中锁定到数据包上。
- 检测SOP*。
- 解码接收到的数据,包括CRC。
- 检测EOP并验证CRC:(1)如果CRC有效,则将数据包数据传递到协议层。
(2)如果CRC无效,请刷新接收到的数据。
消息头和数据应由32位CRC保护。
- CRC-32保护数据有效负载的数据完整性。
- CRC-32的定义如下:CRC-32多项式应为= 04C1 1DB7h。
- CRC-32的初始值应为= FFFF FFFF h。
- CRC-32应计算不包括任何数据包框架符号的所有字节(即,不包括序言、SOP*、EOP)。
- CRC-32的计算应从字节0、第0位开始,并继续计算到数据包的每个字节的第7位。
- CRC-32的其余部分应予以补充。
- CRC-32的残余量应为C704 DD7Bh。
注:CRC-32余数的反转增加了FFFF FFFF h的偏移量,这将在接收端产生一个恒定的C704 DD7Bh的CRC-32残余。注意:CRC的实现与[USB 3.2]中使用的实现相同。
以下是CRC-32代码示例
//
// USB PD CRC Demo Code.
//
#include <stdio.h>
int crc;
//-----------------------------------------------------------------------------
void crcBits(int x, int len) {
const int poly = 0x04C11DB6; //spec 04C1 1DB7h
int newbit, newword, rl_crc;
for(int i=0; i<len; i++) {
newbit = ((crc>>31) ^ ((x>>i)&1)) & 1;
if(newbit) newword=poly; else newword=0;
rl_crc = (crc<<1) | newbit;
crc = rl_crc ^ newword;
printf("%2d newbit=%d, x>>i=0x%x, crc=0x%x\n", i, newbit,(x>>i),crc);
}
}
int crcWrap(int c){
int ret = 0;
int j, bit;
c = ~c;
printf("~crc=0x%x\n", c);
for(int i=0;i<32;i++) {
j = 31-i;
bit = (c>>i) & 1;
ret |= bit<<j;
}
return ret;
}
//-----------------------------------------------------------------------------
int main(){
int txCrc=0,rxCrc=0,residue=0;
int MessageHeader, Data;
printf("using packet MessageHeader 0x%x data 0x%x\n", MessageHeader=0x7681, Data=0x01010101);
crc = 0xffffffff;
crcBits(MessageHeader,16); //消息头为16bit
crcBits(Data,32); //数为32bit
txCrc = crcWrap(crc); //txCrc就是需要加到数据后面的crc
printf("crc=0x%x, txCrc=0x%x\n", crc, txCrc);
printf("received packet after decode= 0x%x, 0x%x\n", data, txCrc);
crc = 0xffffffff;
crcBits(MessageHeader,16); //消息头为16bit
crcBits(Data,32); //数为32bit
rxCrc = crcWrap(crc); //rxCrc就是需要校验的数据crc
printf("Crc of the received packet data is (of course) =0x%x\n", rxCrc);
printf("continue by running the transmit crc through the crc\n");
crcBits(rxCrc,32);
printf("Now the crc residue is 0x%x\n", crc);
printf("should be 0xc704dd7b\n");
}
(2)4B5B
除前导码外,线路上的所有通信都应采用线路代码进行编码,以确保合理的直流平衡水平和适当的转换次数。这种编码使接收端设计不那么复杂,并允许在接收端设计中有更多的变化。应使用4b5b编码。将4位数据编码为5位符号以用于传输,并将5位符号解码为4位数据以供接收端消耗。4b5b代码提供了数据编码和特殊的符号。特殊的符号用于信号硬重置,并描绘出数据包的边界。
(3)Biphase Mark Coding (BMC)
双相标记编码(BMC)是一种用于传输USB电源传输消息的物理层信令方案。此编码假定有一个专用的直流连接,标识为CC线,用于发送PD消息。双相位标记编码是曼彻斯特编码的一个版本(参见[IEC 60958-1])。在BMC中,在每个比特时间(UI)的开始时都有一个转换,当传输一个1时,在UI的中间有一个第二个转换。BMC是有效的直流平衡,(每个1是直流平衡,两个连续的0是DC平衡,不管中间1的数量是多少)。它有有限的视差(限制在任意包的1位,所以一个非常低的直流水平)。图5-7说明了双相标记编码。此示例显示了在消息开始时的SOP排序集的从前导到Sync-1K码的转换。注意,其他k码可以发生在信号的序言之后,如硬重位和电缆重位。
直接看图会更清晰一些,简而言之,就是在一个周期内,电平发生跳变就是1,电平没变就是0。
5 有序集合发送顺序
SOP*是一个有序的集
包头类型 组成K码
SOP Sync-1 Sync-1 Sync-1 Sync-2
SOP’ Sync-1 Sync-1 Sync-3 Sync-3
SOP’’ Sync-1 Sync-3 Sync-1 Sync-3
6 传输位序列
描述了在传输不同尺寸的数据时应使用的导线上比特的顺序。
7 数据包格式
数据包格式应包括前导码、SOP*、数据包数据,包括消息头、CRC和EOP。数据包的格式如表3所示,并表明了数据包的哪些部分应采用4b/5b编码。一旦对4b/5b进行编码,整个数据包应通过CC使用BMC进行传输。请注意,数据包中的所有位,包括前导码,都是用BMC编码的。
除了preamble,都是需要进行4b5b编码的
传输从一个前置码开始,用于允许接收器锁定到载体上。它后面是一个SOP*(数据包的开始)。数据包以EOP(数据包结束)K码终止。
前导是用来通过呈现“0s”和“1s”的交替序列来实现在接收机中的锁定,所以平均频率是载波频率。与数据包的其他部分不同,序言不应采用4b/5b编码。序言应由一个64位交替的0和1的序列组成。序言应以“0”开头,并以“1”结尾。
本文只是对USB PD进行简单地讲解,只是冰山一角,更多内容还需仔细研读USB PD3.1文档,希望各位学有所成。