第三章 PD物理层详解:CC线的作用与配置、BMC编码原理、Chunking机制、物理层电气特性

各位工程师朋友,咱们今天来啃一块硬骨头——PD协议的物理层。说实话,很多做USB-C开发的同行,对协议层、策略层研究得头头是道,但一碰到物理层就有点发怵。我当年也是这样,总觉得物理层是芯片厂商该操心的事。直到有一次,我亲手焊的PD诱骗器死活无法握手,用示波器一抓,才发现CC线上的信号波形惨不忍睹……嗯,从那以后,我再也不敢轻视物理层了。

物理层是PD通信的基石。它要是出问题,上层协议再完美也是白搭。咱们今天就把CC线、BMC编码、Chunking机制和电气特性这四块内容,一个一个说透。

3.1 CC线的作用与配置

CC线,全称Configuration Channel,配置通道。说白了,它就是USB-C接口里那根决定“你是谁、你要干嘛”的信号线。

一根CC线,承担了三个核心任务:

  • 检测连接:判断设备是否插入,以及插入方向(正插还是反插)。
  • 识别角色:区分DFP(下行端口,通常为主机或充电器)、UFP(上行端口,通常为设备)和DRP(双角色端口)。
  • 承载通信:在BMC编码的物理层上,传输PD协议的数据包。

我个人习惯把CC线比作“谈判代表”。它先通过电阻值告诉对方自己的身份,然后才开始谈功率、数据等细节。

3.1.1 电阻配置与角色识别

CC线上的角色识别,靠的是电阻。具体来说:

  • DFP(Source):在CC线上拉一个Rp电阻(上拉至Vbus)。Rp的值决定了Source能提供的电流能力:
    标准Rp(10kΩ)→ 默认USB电流(0.5A/0.9A)
    1.5A Rp(22kΩ)→ 1.5A
    3A Rp(10kΩ,但需配合不同电压)→ 3A
  • UFP(Sink):在CC线上拉一个Rd电阻(下拉至GND)。Rd的值固定为5.1kΩ。
  • DRP:交替切换Rp和Rd,表示“我既可以当Source,也可以当Sink”。

这里有个坑,我提醒大家注意:电阻的精度直接影响角色识别的可靠性。我曾经遇到过一批量产产品,因为用了±5%的电阻,导致部分设备在临界条件下无法正确识别角色。后来全部换成了±1%的电阻,问题才解决。

警告:CC线上的电阻必须使用高精度电阻(推荐±1%)。电阻值偏差过大会导致角色识别失败,甚至可能损坏端口。

3.1.2 CC线的工作模式

CC线有两种工作模式:

  • 默认模式(Default Mode):仅用于角色识别和电流能力宣告。此时CC线上没有数据通信,电压电平由Rp和Rd的分压决定。
  • 通信模式(Communication Mode):在角色识别完成后,CC线进入BMC编码的数据通信模式。此时CC线上的信号是双向的、差分式的(虽然只有一根线,但通过BMC编码实现了半双工通信)。

你想想看,一根线既要传直流电平,又要传高速数据,这设计确实巧妙。但这也意味着,CC线上的电容负载必须严格控制。我见过有人为了省成本,在CC线上加了一颗100nF的滤波电容,结果BMC通信直接瘫痪。

3.2 BMC编码原理

BMC,全称Bi-Phase Mark Coding,双相标记编码。说白了,它是一种自同步的编码方式,不需要单独的时钟线。

BMC编码的规则很简单:

  • 每个数据位(bit)的起始处,信号电平都会发生一次跳变。
  • 如果数据位是“1”,在位的中间位置还会再发生一次跳变。
  • 如果数据位是“0”,位的中间位置不发生跳变。

用更直观的话说:

  • “0” = 电平在起始处跳变一次,然后保持到结束。
  • “1” = 电平在起始处跳变一次,中间再跳变一次。

为什么用BMC?因为它有两个好处:

  1. 自同步:接收端可以从信号跳变中提取时钟,不需要额外的时钟线。
  2. 直流平衡:BMC编码的信号中,高电平和低电平的时间比例是固定的(50%),不会产生直流分量。这对于通过电容耦合的CC线来说非常重要。

我记得第一次用示波器抓BMC波形时,看着那密密麻麻的跳变,心里直犯嘀咕:这玩意儿真的能可靠解码吗?后来用逻辑分析仪一抓,发现只要采样率够(建议至少20MHz),解码成功率非常高。

调试技巧:调试BMC通信时,建议用差分探头抓CC线上的信号。单端探头容易引入共模噪声,导致波形失真。我个人的经验是,用20MHz以上的采样率,配合硬件触发,可以稳定抓到PD的握手包。

3.3 Chunking机制

Chunking,中文叫“分块传输”。为什么需要它?因为PD协议的数据包最大长度是有限制的。

PD协议规定,单个数据包(Packet)的最大长度为:

  • 控制消息(Control Message):6字节(包括头部和CRC)。
  • 数据消息(Data Message):最多26字节(包括头部、数据和CRC)。

但有些消息,比如供应商定义的消息(VDM)或者固件升级数据,可能远远超过26字节。这时候就需要Chunking机制。

Chunking的工作原理:

  1. 发送端将长消息拆分成多个Chunk(块),每个Chunk的大小不超过26字节。
  2. 每个Chunk作为一个独立的数据包发送。
  3. 接收端收到所有Chunk后,将它们重新组装成完整的消息。

这里有一个关键点:Chunk的传输是有序的,且不能交错。也就是说,在发送完一个长消息的所有Chunk之前,不能插入其他消息。

我遇到过一个问题:某个供应商的充电器,在发送VDM时,Chunk之间的间隔时间超过了协议规定的最大值(约1ms)。结果我的设备认为传输超时,直接放弃了组装。后来我查了协议,发现Chunk之间的间隔必须小于tChunkingInterval(典型值500μs)。

重点:Chunking机制虽然简单,但时序要求严格。Chunk之间的间隔不能超过500μs,否则接收端会认为传输失败。

3.4 物理层电气特性

电气特性是物理层的“硬指标”。电压、电流、时序,任何一个不达标,通信都可能失败。

3.4.1 电压特性

CC线上的电压,在不同模式下有不同的要求:

模式 电压范围 说明
默认模式(角色识别) 0V ~ 1.2V(取决于Rp和Rd分压) 用于判断角色和电流能力
通信模式(BMC) 0V ~ 1.2V(峰峰值) BMC信号的摆幅,通常为1.2V
待机模式 0V 或 3.3V(取决于设计) 未连接时,CC线可能被拉高或拉低

这里要注意:CC线上的电压绝对不能超过3.6V。我见过有人误把5V接到CC线上,结果烧坏了端口芯片的CC引脚。

3.4.2 电流特性

CC线上的电流非常小,通常只有微安级别。这是因为CC线是电压驱动的,不是电流驱动的。

  • Rp上拉电流:典型值80μA ~ 330μA(取决于Rp的阻值和电压)。
  • Rd下拉电流:典型值0μA(因为Rd直接接地,没有电流流过)。

但要注意,CC线上的电容负载会影响瞬态电流。如果CC线上有较大的电容(比如超过100pF),在BMC通信时,信号跳变会产生较大的瞬态电流,可能导致电压跌落。

3.4.3 时序特性

时序是物理层最容易出问题的地方。PD协议对时序的要求非常严格:

参数 最小值 典型值 最大值 说明
BMC位速率 270 kHz 300 kHz 330 kHz 每个数据位的传输速率
BMC位时间 3.03 μs 3.33 μs 3.70 μs 每个数据位的时间长度
tChunkingInterval - 500 μs 1 ms Chunk之间的最大间隔
tTransition - 100 ns 300 ns 信号跳变的上升/下降时间

我个人的经验是,BMC的位速率最容易受晶振精度影响。如果MCU的晶振偏差超过±5%,BMC的位速率就可能超出协议规定的范围。我曾经用内部RC振荡器做PD通信,结果因为温漂太大,高温下通信直接失败。后来换成了外部晶振,问题才解决。

警告:BMC的位速率必须严格控制在270kHz~330kHz之间。超出这个范围,接收端可能无法正确解码。建议使用精度不低于±50ppm的晶振。

3.4.4 信号完整性注意事项

最后,我给大家总结几个信号完整性的要点:

  • CC线走线要短:建议不超过10cm。走线越长,寄生电容越大,BMC信号越容易失真。
  • 避免在CC线上加滤波电容:CC线的总电容负载(包括芯片引脚电容和走线电容)应小于100pF。加滤波电容会破坏BMC信号的边沿。
  • 注意ESD保护:CC线是暴露在外的,必须加ESD保护器件。但ESD器件的结电容要小(建议小于1pF),否则会影响信号质量。
  • 差分走线?不需要:CC线是单端信号,不需要差分走线。但要注意远离高频噪声源(比如DC-DC转换器的开关节点)。

嗯,物理层的内容就讲到这里。说白了,CC线、BMC编码、Chunking和电气特性,这四块内容环环相扣。你只要把电阻配置搞对了,BMC时序调准了,Chunking间隔控制好了,电气特性达标了,PD通信的物理层基本上就不会出大问题。

下一章,咱们聊聊PD协议层的数据包结构。到时候我会分享一个我调试过的“CRC计算错误导致通信失败”的案例,保证让你印象深刻。