Fork me on GitHub
侧边栏

USB PD 3.1协议学习

USB PD 3.1

那什么是USB_PD_3.1呢?USB3.1是USB的一种传输标准,速度可以达到10Gbit/s,那PD是什么?PD(Power Delivery)就是电力输送,也就是充放电用的,它可以达到最高100W的功率。

1、资料下载地址

USB_Power_Deliery_3.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请求的功率,开始供电。

image

(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:

  1. 0b 消息来自于一个DFP或UFP。
  2. 1b 消息来源于电缆插头或VPD(USB VPD(Vconn Powered USB Device)是一种专用的 USB 设备,可以由 VCONN 或 VBUS 供电。VPD 设备通常内置在 USB Type-C 电缆中,使用 VCONN 提供的电力来支持电缆内的电子标记(eMarker)
  • Specification Revision:Specification Revision字段应为以下值之一(11b除外):
  1. 00b-Revision1.0
  2. 01b-Revision2.0
  3. 10b-Revision3.0
  4. 11b-保留,不得使用
  • Port Data Role:1位Port Data Role字段应指示端口的当前数据角色:
  1. 0b UFP
  2. 1b DFP
  • Message Type:5位Message Type字段应指示正在发送的消息的类型。要完全解码消息类型,首先检查“Number of Data Objects”字段,以确定消息是控制消息还是数据消息。然后可以在表6-5(表6的控制消息)或表6-6(数据消息)中找到特定的消息类型。消息类型字段应适用于所有SOP*数据包类型。

Tips:本文只对Message Header字段做一个简单地解释,其他请参考USB官网发布的文档,本文也是从官方文档中截取部分内容

4、数据编码

image

(1)CRC

发射端执行以下功能:

  1. 从协议层接收分组数据。
  2. 计算并附加一个CRC。
  3. 编码包括CRC(即有效载荷)在内的数据包数据。(也就是消息格式中标红的部分,往上翻)
  4. 通过CC上的双相标记编码(BMC)传输信包(序言、SOP*、有效载荷、CRC和EOP)。

接收端执行以下功能:

  1. 恢复时钟并从序言中锁定到数据包上。
  2. 检测SOP*。
  3. 解码接收到的数据,包括CRC。
  4. 检测EOP并验证CRC:(1)如果CRC有效,则将数据包数据传递到协议层。
    (2)如果CRC无效,请刷新接收到的数据。

消息头和数据应由32位CRC保护。

  1. CRC-32保护数据有效负载的数据完整性。
  2. CRC-32的定义如下:CRC-32多项式应为= 04C1 1DB7h。
  3. CRC-32的初始值应为= FFFF FFFF h。
  4. CRC-32应计算不包括任何数据包框架符号的所有字节(即,不包括序言、SOP*、EOP)。
  5. CRC-32的计算应从字节0、第0位开始,并继续计算到数据包的每个字节的第7位。
  6. CRC-32的其余部分应予以补充。
  7. 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”结尾。

posted @ 2024-12-09 14:13  yooooooo  阅读(1477)  评论(0)    收藏  举报