3、C-PHY 物理层详解:3-Phase 符号编码、C-PHY vs D-PHY 对比、C-PHY 的 Wire-OR 逻辑

好,咱们今天来啃一块硬骨头——C-PHY 物理层。说实话,我第一次看 C-PHY 的 spec 时,头都大了。D-PHY 好歹是差分对,一对线传一个 bit,逻辑清晰。C-PHY 呢?三条线,没有时钟线,还搞出个 3-Phase 符号编码。嗯,别急,咱们一步步拆开看。

3.1 为什么要有 C-PHY?

先回答一个最直接的问题:D-PHY 用得好好的,为什么还要搞 C-PHY?

我个人理解,核心原因就一个——带宽瓶颈。D-PHY 的时钟频率做到 1.5Gbps 已经接近极限了,再往上走,信号完整性、功耗、EMI 都压不住。C-PHY 呢?它用三条线,没有独立时钟,每根线只跑 2.5Gbps 的符号率,但等效数据率能到 5.7Gbps。你想想看,同样的物理层,带宽翻了一倍多。

我在项目中遇到过一款 4K@60fps 的摄像头,D-PHY 4 lane 死活跑不满带宽,换成 C-PHY 3 lane 就稳了。说白了,C-PHY 就是为高分辨率、高帧率场景准备的。

3.2 3-Phase 符号编码:三条线,三种状态

C-PHY 的核心思想,是用三条线(A、B、C)来传输一个符号。每条线有三种电平状态:高(+)、低(-)、中间(0)。但注意,不是任意组合都合法——任何时候,三条线中必须有一条是高,一条是低,一条是中间。这就是所谓的 3-Phase 状态。

为什么这么设计?因为这样每条线的电压摆幅只有 D-PHY 的一半,功耗更低,EMI 也更小。而且,没有时钟线,时钟信息是嵌在符号跳变里的。

咱们算一下:三条线,三种状态,但必须满足「一高一低一中间」,所以合法的状态数是多少?

答案是 6 种。具体来说:

  • 高电平的线:3 种选择
  • 低电平的线:从剩下 2 条中选 1 种
  • 中间的线:自动确定

所以 3 × 2 = 6 种状态。每个符号携带 log2(6) ≈ 2.58 bit 的信息。但实际传输时,我们不是直接传 2.58 bit,而是用 16 个符号(16-symbol)来编码 7 个字节(56 bit),效率接近 87.5%。

关键点:C-PHY 的每个符号不是独立的,它依赖于前一个符号的状态。因为跳变规则是:每次只能有一根线改变状态,而且不能从高直接跳到低,必须经过中间态。这就是所谓的「3-Phase 跳变规则」。

我曾经调试过一个 C-PHY 的链路,发现图像有横纹。查了半天,原来是 SoC 端的 PHY 在符号跳变时违反了「不能直接跳变」的规则,导致接收端误码。嗯,这种问题用示波器看单根线是看不出来的,必须同时看三根线的相对关系。

3.3 C-PHY vs D-PHY:一张表说清楚

很多工程师问我,到底选 C-PHY 还是 D-PHY?我的建议是:看你的应用场景。下面这张表是我自己整理的对比,你直接拿去用:

对比项 D-PHY C-PHY
物理线数 每 lane 2 根(差分对) + 1 根时钟 每 trio 3 根(无独立时钟)
时钟方式 DDR 双沿采样,有独立时钟线 嵌入式时钟,符号跳变携带时钟
每 lane/trio 数据率 最高约 1.5 Gbps/lane 最高约 5.7 Gbps/trio(等效)
电压摆幅 200mV ~ 1.2V(差分) 约 200mV ~ 400mV(单端)
功耗 中等 更低(摆幅小,无时钟线)
EMI 较高(时钟线是强辐射源) 较低(无时钟线,跳变分散)
布线复杂度 低(差分对等长即可) 高(三线需等长,且需考虑串扰)
兼容性 成熟,几乎所有 SoC 都支持 较新,高端 SoC 才支持

我的经验:如果你做的是 1080p 以下的摄像头,D-PHY 完全够用,成本低、调试简单。但如果你要做 4K@60fps 甚至 8K,别犹豫,直接上 C-PHY。另外,C-PHY 的 PCB 布线要求更高,三根线必须严格等长,误差最好控制在 5mil 以内。我吃过这个亏,第一次画 C-PHY 板子时没注意等长,结果图像有重影。

3.4 C-PHY 的 Wire-OR 逻辑:多设备共享总线

Wire-OR 逻辑是 C-PHY 的一个隐藏技能。说白了,就是允许多个发送器(比如多个摄像头)共享同一组 C-PHY 总线,通过「线与」的方式实现仲裁。

具体怎么工作的?

  • 每个发送器都有一个三态输出驱动器
  • 当某个发送器不发送数据时,它的输出为高阻态
  • 当多个发送器同时发送时,总线上的电平由所有发送器共同决定——这就是 Wire-OR

但注意,C-PHY 的 Wire-OR 不是简单的「线与」,它利用了 3-Phase 编码的特性。因为任何时候总线上必须有一高一低一中间,所以多个发送器同时驱动时,必须保证它们的状态是兼容的。否则,就会出现总线冲突。

警告:Wire-OR 模式在实际项目中很少用。为什么?因为调试太复杂了。我曾经在一个多摄像头项目中尝试用 Wire-OR,结果发现两个摄像头的 PHY 在切换时总有短暂的「毛刺」,导致接收端误码。后来还是改成了分时复用,每个摄像头独占一组 trio。所以我的建议是:除非你非常清楚自己在做什么,否则别碰 Wire-OR。

不过,Wire-OR 有一个很酷的应用场景:双向通信。在 C-PHY 中,接收端也可以反向驱动总线,实现类似 I2C 的应答机制。这在一些需要握手协议的传感器中很有用。

3.5 一张图看懂 C-PHY 物理层

下面我用 SVG 画了一张 C-PHY 物理层的结构图,把 3-Phase 编码、Wire-OR 逻辑、以及和 D-PHY 的对比都放在一起了。你一看就明白:

C-PHY 物理层核心结构 发送端 (TX) 3-Phase 编码器 状态机 + 跳变控制 三态输出驱动器 A B C Wire-OR 接收端 (RX) 3-Phase 解码器 时钟恢复 (CDR) 误码检测 C-PHY vs D-PHY 关键差异 • D-PHY:2 线差分 + 1 时钟,每 lane 最高 1.5 Gbps • C-PHY:3 线无时钟,每 trio 等效 5.7 Gbps • C-PHY 功耗更低,EMI 更小,但布线要求更高 • Wire-OR 支持多设备共享总线,但调试复杂 3-Phase 符号编码示例 状态 1: A=高, B=低, C=中间 → 符号值: 0 状态 2: A=低, B=高, C=中间 → 符号值: 1 ... 共 6 种合法状态,每次跳变只改变一根线

3.6 调试 C-PHY 的几点心得

最后,分享几个我在调试 C-PHY 时踩过的坑,希望能帮你少走弯路:

  1. 示波器要够快:C-PHY 的符号率高达 2.5 Gsymbol/s,普通 500MHz 示波器根本看不清楚。我建议至少用 2GHz 带宽的示波器,配合差分探头(或者三根单端探头同时看)。
  2. 看三根线的相对关系:不要只看单根线的波形。C-PHY 的时钟信息是嵌在三根线的跳变中的,必须同时看 A、B、C 三根线,才能判断符号是否正确。
  3. 注意 PCB 走线等长:C-PHY 对 skew 非常敏感。三根线的长度差超过 5mil,就可能出现符号错误。我建议在 layout 时,把三根线走成「蛇形线」来保证等长。
  4. 先测回环模式:在调试实际摄像头之前,先让 SoC 的 PHY 进入回环模式(loopback),自己发自己收。这样可以先排除 PHY 本身的问题。

一个小技巧:如果你手头没有 C-PHY 的协议分析仪,可以用逻辑分析仪配合 C-PHY 解码插件。我试过 Saleae 的 C-PHY 解码器,虽然不能 100% 准确,但用来抓个大概的符号序列还是够用的。

好了,C-PHY 物理层就讲到这里。记住,C-PHY 不是 D-PHY 的替代品,而是互补品。高带宽、低功耗的场景选 C-PHY,成熟稳定、调试简单的场景选 D-PHY。没有最好的协议,只有最合适的协议。

可可精品资料库