第三章 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%的电阻,问题才解决。
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?因为它有两个好处:
- 自同步:接收端可以从信号跳变中提取时钟,不需要额外的时钟线。
- 直流平衡:BMC编码的信号中,高电平和低电平的时间比例是固定的(50%),不会产生直流分量。这对于通过电容耦合的CC线来说非常重要。
我记得第一次用示波器抓BMC波形时,看着那密密麻麻的跳变,心里直犯嘀咕:这玩意儿真的能可靠解码吗?后来用逻辑分析仪一抓,发现只要采样率够(建议至少20MHz),解码成功率非常高。
3.3 Chunking机制
Chunking,中文叫“分块传输”。为什么需要它?因为PD协议的数据包最大长度是有限制的。
PD协议规定,单个数据包(Packet)的最大长度为:
- 控制消息(Control Message):6字节(包括头部和CRC)。
- 数据消息(Data Message):最多26字节(包括头部、数据和CRC)。
但有些消息,比如供应商定义的消息(VDM)或者固件升级数据,可能远远超过26字节。这时候就需要Chunking机制。
Chunking的工作原理:
- 发送端将长消息拆分成多个Chunk(块),每个Chunk的大小不超过26字节。
- 每个Chunk作为一个独立的数据包发送。
- 接收端收到所有Chunk后,将它们重新组装成完整的消息。
这里有一个关键点:Chunk的传输是有序的,且不能交错。也就是说,在发送完一个长消息的所有Chunk之前,不能插入其他消息。
我遇到过一个问题:某个供应商的充电器,在发送VDM时,Chunk之间的间隔时间超过了协议规定的最大值(约1ms)。结果我的设备认为传输超时,直接放弃了组装。后来我查了协议,发现Chunk之间的间隔必须小于tChunkingInterval(典型值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通信,结果因为温漂太大,高温下通信直接失败。后来换成了外部晶振,问题才解决。
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计算错误导致通信失败”的案例,保证让你印象深刻。