4. PD协议通信流程:Hard Reset、Soft Reset、Cable Discovery、Source Capabilities

好,咱们接着聊PD协议的核心通信流程。说实话,这部分内容在实际开发中碰到的频率非常高。你想想看,一个Type-C口插上去,从物理接触到正常供电,中间到底发生了什么?我当年第一次调PD协议栈的时候,就被这些Reset和Discovery流程折腾得够呛。今天我把这些关键节点掰开揉碎了讲给你听。

4.1 Hard Reset:最粗暴的重置方式

Hard Reset,说白了就是物理层级别的硬复位。它不跟你讲道理,直接拉低CC线上的电压,让双方都回到初始状态。

Hard Reset的触发条件:

  • 协议层出现无法恢复的错误(比如CRC校验连续失败)
  • 电源角色交换失败后需要重新协商
  • 系统检测到过流或过压等硬件故障
  • 我见过有些设备在热插拔瞬间也会触发Hard Reset

Hard Reset的执行过程是这样的:

  1. Source将VBUS放电到vSafe0V(约0.8V以下)
  2. CC线上的Rp/Rd被移除,总线进入未连接状态
  3. 等待tHardReset(约3.5ms到4.5ms)
  4. Source重新上拉Rp,开始新一轮的发现过程

注意:Hard Reset会清除所有已协商的PDO和RDO。我曾经在一个项目中,Sink端在收到Hard Reset后没有及时释放VBUS,结果导致Source端保护电路误触发。嗯,这个坑我踩过,大家引以为戒。

4.2 Soft Reset:温和的协议层复位

Soft Reset就温和多了。它只复位协议层的状态机,不碰物理层。VBUS电压保持不变,CC线上的状态也不变。

为什么会用到Soft Reset?我举个例子:

  • 当收到无法识别的Control Message时
  • 当PD协议栈出现逻辑错误时
  • 当需要重新协商电源角色时

Soft Reset的报文格式很简单:

// Soft Reset 请求报文
// 由发起方发送,不包含数据对象
Control Message: Soft Reset
// 接收方收到后回复 Accept
// 然后双方复位协议层状态机

我个人习惯在调试阶段多用Soft Reset。为什么呢?因为它不会断开连接,调试起来方便。你想想看,如果每次复位都要重新插拔,那调试效率得多低。

经验之谈:我曾经在一个量产项目中,发现某些第三方充电器对Soft Reset的响应时间特别慢。后来我们在协议栈里加了个超时重传机制,才解决了兼容性问题。所以啊,别小看这个Soft Reset,兼容性测试一定要做足。

4.3 Cable Discovery:线缆身份识别

Cable Discovery,就是发现线缆的能力。Type-C线缆可不是一根简单的导线,它里面藏着eMarker芯片,记录了线缆的各种参数。

Discovery的流程大致如下:

  1. Source检测到CC1或CC2上有Ra(约1kΩ接地)
  2. Source通过CC线发送SOP'或SOP'' Discovery消息
  3. eMarker芯片回复自己的能力信息
  4. Source根据线缆能力调整供电策略
线缆类型 eMarker支持 最大电流 典型应用
USB 2.0线缆 不支持 3A 普通充电/数据传输
USB 3.2 Gen1线缆 可选支持 3A 高速数据传输
USB 3.2 Gen2线缆 必须支持 5A 视频传输/大功率充电
Thunderbolt 3/4线缆 必须支持 5A 高性能扩展坞

关键点:eMarker芯片中存储的信息包括:

  • 线缆的VBUS电流能力(3A还是5A)
  • 线缆的USB版本支持
  • 线缆的供应商信息(VID/PID)
  • 线缆长度(可选字段)

我记得有一次,客户反馈说他们的设备用某些线缆充电特别慢。查了半天,发现是eMarker芯片返回的电流能力字段被写错了。嗯,这种问题最头疼,因为硬件上看起来一切正常,但协议层的数据就是不对。

4.4 Source Capabilities:电源能力的宣告

Source Capabilities,就是Source端告诉Sink端:我能提供哪些电源配置。这是PD协商的第一步,也是最关键的一步。

Source Capabilities消息包含多个PDO(Power Data Object),每个PDO描述一种供电能力:

// Source Capabilities 报文示例
// 包含3个PDO
PDO1: 5V @ 3A (固定供电)
PDO2: 9V @ 3A (固定供电)
PDO3: 15V @ 3A (固定供电)

// 每个PDO的格式
Bit[31:30]: 供电类型 (00=固定, 01=电池, 10=可调, 11=保留)
Bit[29:10]: 电压值 (50mV为单位)
Bit[9:0]:   电流值 (10mA为单位)

Source Capabilities的发送时机:

  • 连接建立后立即发送
  • 每次Hard Reset或Soft Reset后重新发送
  • 当Source端供电能力发生变化时(比如从电池供电切换到外接电源)

设计建议:我个人习惯在Source Capabilities中至少包含3个PDO:

  1. 一个5V的基础PDO,保证兼容性
  2. 一个中间电压的PDO,比如9V或12V
  3. 一个最高电压的PDO,发挥最大性能

这样做的好处是,Sink端可以根据自己的需求灵活选择。我曾经见过一些设计只放了一个5V的PDO,结果设备充电慢得让人抓狂。

4.5 完整的通信流程示例

好了,我们把上面这些流程串起来,看看一个完整的PD通信是什么样的:

1. 物理连接建立
   Source检测到CC线上的Rd
   Source上拉Rp,开始协商

2. Cable Discovery
   Source发送SOP' Discovery消息
   eMarker回复线缆能力
   Source确认线缆支持5A电流

3. Source Capabilities
   Source发送Source Capabilities消息
   包含PDO: 5V/3A, 9V/3A, 15V/3A, 20V/5A

4. Sink Request
   Sink选择20V/5A的PDO
   发送Request消息,包含RDO

5. Source Accept
   Source检查请求是否合理
   回复Accept消息
   调整VBUS到20V

6. 正常供电
   双方进入稳定供电状态
   持续监测CC线和VBUS状态

重要提醒:在实际项目中,一定要处理好各种异常情况。比如:

  • Sink请求的功率超过了Source的能力
  • 线缆不支持Sink请求的电流
  • Source在调整电压时出现超时

我曾经在一个项目中,因为没处理好Source调整电压时的过冲问题,导致Sink端的保护电路频繁触发。后来加了个软启动电路才解决。嗯,这些细节往往决定了产品的稳定性。

好了,PD协议的这几个核心通信流程就讲到这里。说白了,Hard Reset是暴力重启,Soft Reset是温和复位,Cable Discovery是线缆身份验证,Source Capabilities是电源能力宣告。把这四个流程搞明白了,PD协议的基础就算打牢了。下一章我们聊聊更深入的电源协商和角色切换,到时候再细说。