2. PD Negotiation时序基础:Source和Sink角色,CC线通信原理,时序参数概念

好,我们正式开始啃PD Negotiation的硬骨头。说实话,很多人卡在时序分析这一关,根子就在于没搞懂最基础的几个概念。

2.1 到底谁说了算?Source与Sink角色

USB Type-C口子上,两端设备不是平等的。一个负责“供电”或“提供数据”,另一个负责“吃电”或“接收数据”。这个主从关系,就是Source和Sink。

  • Source(源端): 提供电力的一方。比如笔记本充电器、电脑USB口的Host。
  • Sink(接收端): 消费电力的一方。比如你的手机、移动硬盘。

角色决定行为

Source的行为是“拉”Rp电阻,表示“我能给电,快来谈”。Sink的行为是“拉”Rd电阻,表示“我要吃电,开条件吧”。

我早期设计一个充电宝时,误把Source端的Rp接到了GND,结果CC线电平一直是0V,手机插上去毫无反应。查了三天PCB才发现——Rp方向反了。这就是基本功不扎实的代价。

角色 标志信号 职责说明
Source Rp电阻 提供5V检测电压,启动PD通信
Sink Rd电阻 产生Sink电压,接收电能供应

2.2 CC线通信原理

CC线(Configuration Channel)是整个PD沟通的唯一物理通道。它不像I2C那样需要两条线,一条CC线就能完成配置、协商、中断所有事。

单线 vs 双线策略

USB-C接口有两根CC线:CC1和CC2。但它们不是同时工作。

  • 单线策略: 只有一根线参与通信。Source端通过检测哪根线上有Rd电阻,就能判断出正反插方向。
  • 双线策略: 用于电子标记线缆(E-Marker)。两根线同时承载数据,实现芯片身份识别。

我曾经踩过一个坑:做一款多口充电器时,把CC1和CC2都当作独立通道接入MCU,结果两个口同时发信号,MCU直接死机。切记:单口设备,一根线通信就够了,另一根保持空闲。

通信载体:BMC编码

CC线上跑的不是简单的数字电平,而是BMC(Bi-Phase Mark Coding)编码。简单说,就是每个数据位前都会有一个电平翻转。这样做的好处是:抗干扰能力极强,且能自定同步时钟。

PD 2.0和3.0的标准速率是300kbps,也就是每秒钟传30万个bit。这个速率下,CC线的电容和线长会直接影响波形质量。所以我说:PCB上CC走线长度不要超过10cm,超过的话,最好走差分线加屏蔽。

核心结论: CC线的任一时刻,只有Source和Sink两方在按BMC协议对话,没有第三方干扰。

2.3 时序参数概念

好了,协议层讲完了。真正难啃的是时序参数。PD协议对时间要求非常苛刻,每个事件都有精确的窗口期。

三个你绕不开的时序参数

参数符号 全称 典型值 含义
tCCDebounce CC线消抖延时 10~20ms Source检测到插入后,等待CC线电平稳定
tTypeCSink Sink检测时间 2~10ms Sink端检测到自身Rd拉低,判断为已插入
tPDDebounce PD消抖延时 2~10ms Source端确认Sink真正连接,准备发起通信

为什么这些参数重要?

举个例子:tCCDebounce如果设太短(比如5ms),CC线可能还没稳定,Source就误判为已插入;相反,如果设太长(比如100ms),用户插上设备后,会感觉反应慢半拍。

我在设计一款快充车充时,tTypeCSink取值8ms,结果用某品牌手机测试,通信经常失败。后来抓波形发现,那款手机的Sink端消抖时间刚好是10ms,给了8ms的等待,它还没准备好,Source已经发Start of Packet(SOP)了。匹配不顺。这是一个典型的设计误判,原因就在于对Sink侧时序参数的信心不足。 后来我反查USB-IF的测试规范,建议tTypeCSink > 2ms且 < 10ms,但不要卡下限。

个人建议: 对于通用方案,tCCDebounce取15ms,tTypeCSink取5ms,tPDDebounce取2ms。这个组合在绝大多数设备上能良好工作。

时序检查伪代码(C语言)

// Source端时序检查
if (CCVoltage > 0.25V && CCVoltage < 2.0V) {
    if (tCCDebounceTimer > 15ms) {
        // 检测到有效Sink连接
        EnterPDNegotiation();
    } else {
        // 等待消抖稳定
        StartDebounceTimer(15ms);
    }
} else {
    // 电平异常,重置状态机
    ResetConnection();
}

// 启动PD通信确认
if (tPDDebounceTimer > 3ms) {   // 再加一个边距
    SendSOP();
}

注意我在这里加了“边距”。工业级设计中,参数不取理论值,取安全值。

重要警告: 如果有使用劣质线缆,CC line的总电容可能超过200pF。这会严重拉宽波形,导致BMC信号抖动过大,tCCDebounce误触发。测试时一定用标准E-Marker线缆。

CC线通信建立与Source/Sink角色交互时序 Source (源端) 拉Rp电阻,提供5V Sink (接收端) 拉Rd电阻,请求电力 CC线 (BMC编码,300kbps) 时序参数应用 tCCDebounce (10~20ms) tTypeCSink (2~10ms) tPDDebounce (2~10ms) 连接事件 检测与消抖 能力协商 通信建立成功,进入PD Negotiation主流程 注意:tCCDebounce和tPDDebounce的值不能改得过于激进,否则会导致连接失败