蛇化为龙,不变其文;家化为国,不变其姓。大丈夫当时富贵,百恶灭除,光耀荣华,贫贱之时何足累之哉!
在PD协议出现之前,USB接口的供电能力非常有限,即使是BC1.2-DCP,也只能提供最大7.5W(5V/1.5A )的功率,像老牛拉车一样慢。
此外那时USB接口绝大多数还是Type-A、Type-B,非Type-C的天下。因而想把充电器端的信息传递到手机,只有VBUS、D+、D-、GND线可供使用。
巧妇难为无米之炊,USB-IF想提升功率,但苦于没有通信线可用。某一天突发奇想:能否间接传输PD信号,具体地说,将PD协议的消息调制成24MHz的FSK信号,然后耦合到VBUS线,通过高频载波的形式进行信息传输,接收端收到波形时则对信号进行解调。


这便是PD1.0的通信精髓,和电力线载波通信有异曲同工之妙。但这样做属实是一种无奈之举,后续由于PD调制信号与VBUS以及USB D+/D-信号相互耦合,带来了各种信号完整性问题,像在嘈杂的集市上喊话,效果并不好。
PD1.0非常罕见,你在市场上几乎找不到标称支持PD1.0的消费电子产品,像个昙花一现的过客。
PD1.0虽不是一个成功的协议,但为PD2.0打下了一些基础。PD2.0借着Type-C的强劲风头,使用type-C的灵魂线-CC线进行通信,华丽转身,奠定了现代USB PD协议的基础,具有划时代意义。
2014年8月,USB PD2.0快充标准发布,不仅规定了Type-C接口为唯一的标准接口,而且还赋予了这个接口更多的功能,比如充电、数据传输、音频传输等。在充电方面,PD2.0定义了5V3A、9V3A、12V3A、15V3A、20V5A等输出能力。可谓一专多能,多才多艺,具备一统天下的潜力。

协议架构
如下图是PD2.0协议的完整架构,能看到物理层,协议层及控制器。物理层是底层硬件,协议层是上层逻辑,控制器则是大脑,指挥着整个系统运转。

通信编码
PD通信是一种半双工通信,使用的是双相标记码 (Bi-phase Mark Code)BMC码进行通信。
数据1的传输需要有一次高、低电平之间的切换,像在跳舞时转个圈;数据0的传输则是固定的高电平或低电平,像根木头一样一动不动。BMC编码是曼彻斯特编码的一种,简单来说,就是让数据在传输中自带节奏感。。

BMC传输框图
如下是PD通信的发送端和接收端的传输框图。
发送端包含一个CRC校验,4bit转5bit编码,BMC编码,把数据打包得严严实实;
接收端包含BMC解码,SOP的检测,5bit转4bit,CRC校验,确保数据完好无损。


PD协议包
一个完整的PD协议包(packet)包含了preamble引导码、SOP报文起始码、Message Header功能码,Byte0-n数据码、CRC校验码和EOP结束码。
其中preamble引导码、SOP报文起始码、CRC校验码和EOP结束码工作在物理层,所谓物理层表示有硬件底层电路支持,不需要软件参与。而Message Header功能码和Byte0-n数据码工作在协议层。
引导码实际上就是64位0和1交替的序列,用于接收机对通信包的锁定,像音乐会的开场鼓点一样。因此该方波的频率就是载波频率,引导码不进行4b5b编码。
根据不同的使用场景,sop*可分为sop、sop’和sop”三种码,像不同的钥匙开不同的锁。
数据码后是CRC校验码,32-bit的CRC校验码的作用是保证数据头和数据的准确性,就像给包裹贴上封条,防止中途被掉包。


波形示例如下图:

PD2.0工作流程实例
PD2.0工作流程相对后续的PD3.0而言较简单,主要包括如下步骤:
- 设备连接,初始使用5V电压供电,确保基本通信,像两个人见面先握手寒暄。
- 然后通过CC线进行PD协议通信,供电方(source)发送Source Capabilities(源能力)信息,告诉受电设备“我能提供哪些电压/电流组合”。
- 受电方(sink)回复Request(请求)信息,根据自己的需求,从对方的提供的挡位中选择一个最适合的功率档位。。
- 供电方回复Accept(接受),并切换到此电压。
- 开始大功率充电/供电,双方皆大欢喜。
下图展示了一个PD2.0充电器给小米手机充电的例子,用协议分析仪能够抓到如下过程:
- 源端(source)提供它的供电能力(电压/电流信息),像在说“我有这些宝贝,随便挑”。。
- 吸收端(sink)从源端提供的供电能力中选出适当的配置参数并发出相应的请求,像在说“我要这个”。
- 源端接受请求并将VBUS电压调节成相应的值,源端提升电压的过程是按照定义好的电压提升速度来进行的。
- VBUS电压达到设定值以后,源端会等待总线电压稳定下来,再发送出一个电源准备好信号(PS RDY)。这时候,吸收端就可以使用这个电压充电了。

对应的波形如下图,绿色的CC承载了通信信息,展开后解码就能看到具体的信息了。

总结
PD1.0更像是一个概念验证和技术铺垫,是USB大功率快充的奠基者。它定义了最高的功率输出为100W,通过使用不同的电压级别(5V,12V,20V)和电流(最高5A)来实现。
由于24MHz FSK方案的信号完整性问题,后续PD2.0及之后的所有版本,都将通信信道从VBUS FSK 转移到了CC线上。 CC 线是一个专用的、干净的、低速率的数据通道,有了它,无需在芯片中集成 FSK 调制解调器。而VBUS FSK需要复杂的调制解调电路,并容易受到噪声的干扰。
PD2.0集成了更为饱满的协议。
而一切,都在为迎接更为辉煌的PD3.0做准备,飞龙终将在天,乘时而变化,犹人得志而纵横四海。