USB PD 物理层:BMC 编码、FSK vs BMC、电气特性
物理层是 PD 通信的基石。说白了你上层协议写得再漂亮,要是边沿抖一下、电平飘一点,CC 线上直接掉重枚举。我刚开始调 PD 时,总觉得物理层是芯片的事,结果有一次示波器抓出来的 BMC 波形上升沿都快 500 ns 了……嗯,从那以后我再也不敢轻视物理层。
BMC 编码:双相标记码到底是啥?
BMC 全称 Bi-Phase Mark Coding,它把时钟和数据合并成一路信号。每个 bit 周期固定为 1 个 UI(Unit Interval),但逻辑 0 和逻辑 1 用不同的跳变模式来区分。
- 逻辑 0:在一个 UI 内,电平 不跳变(全高或全低)。
- 逻辑 1:在一个 UI 内,电平 跳变一次(高→低 或 低→高)。
- 帧起始:同步头用一个比普通 bit 宽的特殊边沿(前导码 + SOP)。
| 数据值 | 编码波形(一个 UI) | 时钟恢复方式 |
|---|---|---|
| 0 | 无跳变(高平或低平) | 依赖前导同步 |
| 1 | 中间跳变一次 | 边沿即可锁定相位 |
| SOP(起始包) | 特殊的 5 个跳变序列 + 前导 | 硬件自动识别 |
我个人习惯在示波器上先看 SOP 的跳变宽度是否规范。如果前导边沿宽度偏离 300 ns 以上,十有八九是 CC 线端接电阻匹配有问题。
FSK vs BMC:为什么 PD 选了 BMC?
你想想看,FSK(频移键控)是用不同的频率来表示 0 和 1,抗噪声能力不错,但解调需要锁相环,面积和功耗都不小。而 BMC 本质上是基带数字信号,只需要一个简单的边沿检测器就能解调,成本低、延迟小。
核心差异:BMC 是 自同步编码,每个 bit 的边沿都携带时钟信息;FSK 是 非自同步,需要独立时钟恢复。
| 特性 | BMC | FSK |
|---|---|---|
| 带宽利用率 | 高(占空比固定) | 低(频率间隔宽) |
| 硬件复杂度 | 低(边沿检测) | 中(PLL+滤波器) |
| 抗直流漂移 | 弱(需要 AC 耦合?) | 强(频域无关) |
| 典型应用 | USB PD、MIPI RFFE | 电力线载波、低速率无线 |
我记得有一次项目要兼容 PD 和另一个私有快充协议,对方想用 FSK 复用到 CC 线上。我测了一下 BMC 和 FSK 的频谱重叠,结论是根本不能共存……最后老老实实分时复用。
避坑指南:我曾经在 CC 线上用普通的 UART 信号跑 BMC 波形,结果因为上升沿斜率太缓(> 1 us),接收端 SOP 检测老是失败。后来把 RC 滤波时间常数从 10 ns 改到 3 ns 才解决。
电气特性:你不得不盯死的几个参数
USB PD 物理层在 CC 线上工作的电压范围是 0 ~ 1.2 V(典型值)。发送器输出摆幅一般要求 0.9 V ~ 1.2 V(峰峰值),共模电压通常由 Rp / Rd 分压决定。
- 差分摆幅:虽然 BMC 是单端信号,但实际芯片内部常会用差分驱动器来抑制共模噪声。我习惯在探头两端同时测 CC 对地波形,看共模分量是否超过 200 mV。
- 上升/下降时间:规范要求 20% ~ 80% 跳变时间 ≤ 300 ns(通常设计在 50 ~ 150 ns)。太快会产生过冲,太慢会导致位错误。
- 眼图模板:PD 收发器必须通过眼图测试。我自己会用 DPO 的模板测试功能,如果眼图高度低于 600 mV 或者抖动 RMS 超过 20 ns,基本能判定物理层有问题。
| 参数 | 最小值 | 典型值 | 最大值 | 单位 |
|---|---|---|---|---|
| 发送器输出摆幅 | 0.9 | 1.0 | 1.2 | V |
| 上升时间(20%~80%) | 50 | 120 | 300 | ns |
| 下降时间(80%~20%) | 50 | 120 | 300 | ns |
| 接收器输入阈值高 | 0.6 | 0.55 | 0.45 | V |
| 接收器输入阈值低 | 0.25 | 0.2 | 0.15 | V |
| 共模电压范围 | 0.3 | 0.6 | 0.9 | V |
调试小技巧:如果发现 BMC 波形边沿有振铃,可以在 CC 线上串一个 10 Ω 电阻靠近 Source 端,再并联 47 pF 电容到地。边沿会变缓但能抑制回波,SOP 包通过率反而更高。
知识结构:物理层三要素
下面这张图把本章的核心逻辑串起来了。说白了,编码方式决定怎么把数据变成电平,电气特性决定电平能不能被识别,而 FSK 与 BMC 的权衡不过是成本与抗噪性的取舍。
调试中的关键点:我踩过的坑
实际调试时,我建议按以下顺序排查物理层问题:
- 静默电平:CC 线在空闲时应该拉到 0 V 或固定的 Rd/Rp 分压值。如果看到 0.3 V 左右的浮动电平,说明总线没释放干净。
- SOP 包边沿:用示波器 trigger 在 SOP 的第一个跳变,看跳变时间是否在 50~300 ns 内。我曾经遇到一批不良电容导致上升沿长达 600 ns,死活枚举不上。
- 眼图测试:条件允许的话,跑一段 PRBS 数据抓眼图。如果眼高低于 600 mV 或眼宽小于 0.8 UI,基本就是物理层缺陷。
- 共模噪声:用差分探头测 CC 线与 GND 之间的共模成分。超过 200 mV 的共模噪声会干扰 BMC 的边沿检测。
小心静电:CC 线直接裸露在 Type-C 母座中,人体放电很容易打坏收发器。我建议在 CC 线上加 TVS 管(如 PESD5V0S1UB),钳位电压选 5 V 以下,否则 BMC 高电平 1.2 V 可能被 TVS 管漏电流拉偏。
好了,物理层就讲这么多。记住一个原则:你的数据链路层写得再完美,物理层只要有一个边沿超差,整个 PD 协商都会崩。做原型的时候多花点时间在示波器前磨眼睛,比后期追 bug 省心得多。