USB PD 3.1协议学习

USBPD3.1是USB的电力输送标准,支持最高100W功率。协议涉及Type-C接口信号、Message交换进行功率协商、数据编码如CRC和4B5B、BiphaseMarkCoding等,确保数据完整性和传输效率。
摘要由CSDN通过智能技术生成

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接口

USB_Type-C公头接口

信号组信号描述
USB3.1RX2+,RX2-,TX2+,TX2-,TX1-,TX1+,RX1-,RX1+,高速USB串行数据接口定义了一组差分发送对,和一组差分接收对。在USB Type C的插座上定义了两组高速USB信号引脚,已提供翻转功能。
USB2.1D+,D-,D-,D+USB2.0串行数据接口定义了1个差分对。在USB Type C插座上定义了两组USB2.0信号引脚以提供翻转功能
配置CC1,CC2CC通道供插头连接检测,接口配置和VCONN
辅助信号SBU1,SBU2边带使用
功率VBUS,VCONN, GNDUSB线缆总线电源,USB插头电源,USB线缆返回当前路径

3、Message

要想进行快充,首先source和sink端要进行功率协商,通过消息交换,source端提供已有的功率档位,sink请求想要的功率档位,source端调整功率达到sink请求的功率,开始供电。

SOURCE SINK Source_Capabilities(Voltage:5.00V Current:2.96A) GOODCRC Request(Current:3.24A Max Current:4.70A) GOODCRC Accept 接受请求 GOODCRC PS_RDY 已经准备好 GOODCRC 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:

  1. 0b 消息来自于一个DFP或UFP。
  2. 1b 消息来源于电缆插头或VPD

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、数据编码

Data
CRC
4B5B Encoder
BMC Encoder
CC通道

(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码可以发生在信号的序言之后,如硬重位和电缆重位。
BMC编码
直接看图会更清晰一些,简而言之,就是在一个周期内,电平发生跳变就是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文档,希望各位学有所成。

  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦成大佬的第N天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值