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)。
BMC 编码规则速查
数据值编码波形(一个 UI)时钟恢复方式
0无跳变(高平或低平)依赖前导同步
1中间跳变一次边沿即可锁定相位
SOP(起始包)特殊的 5 个跳变序列 + 前导硬件自动识别

我个人习惯在示波器上先看 SOP 的跳变宽度是否规范。如果前导边沿宽度偏离 300 ns 以上,十有八九是 CC 线端接电阻匹配有问题。

FSK vs BMC:为什么 PD 选了 BMC?

你想想看,FSK(频移键控)是用不同的频率来表示 0 和 1,抗噪声能力不错,但解调需要锁相环,面积和功耗都不小。而 BMC 本质上是基带数字信号,只需要一个简单的边沿检测器就能解调,成本低、延迟小。

核心差异:BMC 是 自同步编码,每个 bit 的边沿都携带时钟信息;FSK 是 非自同步,需要独立时钟恢复。

BMC vs FSK 关键参数对比
特性BMCFSK
带宽利用率高(占空比固定)低(频率间隔宽)
硬件复杂度低(边沿检测)中(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,基本能判定物理层有问题。
USB PD 物理层关键电气参数(参考)
参数最小值典型值最大值单位
发送器输出摆幅0.91.01.2V
上升时间(20%~80%)50120300ns
下降时间(80%~20%)50120300ns
接收器输入阈值高0.60.550.45V
接收器输入阈值低0.250.20.15V
共模电压范围0.30.60.9V

调试小技巧:如果发现 BMC 波形边沿有振铃,可以在 CC 线上串一个 10 Ω 电阻靠近 Source 端,再并联 47 pF 电容到地。边沿会变缓但能抑制回波,SOP 包通过率反而更高。

知识结构:物理层三要素

下面这张图把本章的核心逻辑串起来了。说白了,编码方式决定怎么把数据变成电平,电气特性决定电平能不能被识别,而 FSK 与 BMC 的权衡不过是成本与抗噪性的取舍。

USB PD 物理层三要素 物理层(CC 线) BMC 编码 自同步 | 边沿检测 FSK 方案 PLL 解调 | 频域抗噪 电气特性 摆幅 | 上升时间 实战选型建议 PD 必须用 BMC → 低成本、低延迟 私有协议可考虑 FSK → 抗共模干扰强 电气参数必须满足 ≥ 20% 眼高裕量

调试中的关键点:我踩过的坑

实际调试时,我建议按以下顺序排查物理层问题:

  1. 静默电平:CC 线在空闲时应该拉到 0 V 或固定的 Rd/Rp 分压值。如果看到 0.3 V 左右的浮动电平,说明总线没释放干净。
  2. SOP 包边沿:用示波器 trigger 在 SOP 的第一个跳变,看跳变时间是否在 50~300 ns 内。我曾经遇到一批不良电容导致上升沿长达 600 ns,死活枚举不上。
  3. 眼图测试:条件允许的话,跑一段 PRBS 数据抓眼图。如果眼高低于 600 mV 或眼宽小于 0.8 UI,基本就是物理层缺陷。
  4. 共模噪声:用差分探头测 CC 线与 GND 之间的共模成分。超过 200 mV 的共模噪声会干扰 BMC 的边沿检测。

小心静电:CC 线直接裸露在 Type-C 母座中,人体放电很容易打坏收发器。我建议在 CC 线上加 TVS 管(如 PESD5V0S1UB),钳位电压选 5 V 以下,否则 BMC 高电平 1.2 V 可能被 TVS 管漏电流拉偏。

好了,物理层就讲这么多。记住一个原则:你的数据链路层写得再完美,物理层只要有一个边沿超差,整个 PD 协商都会崩。做原型的时候多花点时间在示波器前磨眼睛,比后期追 bug 省心得多。