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的执行过程是这样的:
- Source将VBUS放电到vSafe0V(约0.8V以下)
- CC线上的Rp/Rd被移除,总线进入未连接状态
- 等待tHardReset(约3.5ms到4.5ms)
- 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的流程大致如下:
- Source检测到CC1或CC2上有Ra(约1kΩ接地)
- Source通过CC线发送SOP'或SOP'' Discovery消息
- eMarker芯片回复自己的能力信息
- 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:
- 一个5V的基础PDO,保证兼容性
- 一个中间电压的PDO,比如9V或12V
- 一个最高电压的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协议的基础就算打牢了。下一章我们聊聊更深入的电源协商和角色切换,到时候再细说。