MDIO 与 D-PHY 简介

MDIO 协议基础

MDIO 全称是 Management Data Input/Output,也就是管理数据输入输出接口。说白了,它就是用来读写 PHY 芯片内部寄存器的两根线。一根时钟 MDC,一根数据 MDIO。很多刚接触的同学会把它和 I2C 搞混,其实差别挺大。

MDIO 的帧结构很固定,我直接列个表你们看看:

字段位数说明
前导码32连续 32 个 1,用来同步
起始码2固定 01,表示帧开始
操作码210 表示读,01 表示写
PHY 地址5最多 32 个 PHY 设备
寄存器地址5每个 PHY 最多 32 个寄存器
周转时间2读操作时 PHY 驱动数据前插入高阻
数据16实际读写的数据
空闲1+高阻态,释放总线

这里有个坑,我当年第一次调试时没注意周转时间。读操作时如果主机不释放总线,PHY 根本没法把数据推上来。结果读回来的全是 0xFFFF,折腾了半天才发现是时序没对上。

我个人习惯在写驱动时序时,先发送前导码 32 个 1,再发起始码 01。有些 PHY 对前导码长度不敏感,但保险起见别省。

D-PHY 链路概念

D-PHY 是 MIPI 联盟定义的物理层标准,主要用于摄像头(CSI)和显示屏(DSI)的高速数据传输。它用差分信号对,一对时钟 Lane 加一到多对数据 Lane。

D-PHY 有两种工作模式:

  • 高速模式(HS):差分低压摆幅,速度可达 Gbps 级别。用于传视频流这类大数据。
  • 低功耗模式(LP):单端非差分,电压 1.2V 左右,速度慢但省电。用于传控制指令或空闲时保持连接。

两种模式可以动态切换,这也是调试中最容易出问题的地方。我记得有一次项目,摄像头上电后图像有间歇性条纹,逻辑分析仪抓 D-PHY 波形发现 HS 进入时机比预期晚了几个时钟,最后找到原因是 LP 退出时电平转换太慢。

MDIO 怎么管 D-PHY 链路?

你可能要问:MDIO 是管理接口,D-PHY 是数据接口,它俩怎么扯上关系的?

实际系统中,D-PHY 链路的远端(比如图像传感器)通常有一个内嵌的 PHY 芯片,或者通过一个独立的 Retimer / 电平转换器连接。这些芯片内部寄存器里,就包含了 D-PHY 的工作状态、链路锁定情况、信号完整性等关键信息。而 MDIO 就是读这些寄存器的唯一通道。

举个例子,CSI-2 链路的 RX 端(比如 SoC 的 MIPI 控制器)会通过 MDIO 去读远端 PHY 的寄存器,获取 Lane 对齐状态、CRC 错误计数、差分电压幅值等。所以,当 D-PHY 链路不稳定时,第一个动作就是通过 MDIO 把所有状态寄存器读回来看看。

注意不要直接把 MDIO 电平接到 D-PHY 数据线上!MDIO 是单端 LVCMOS 1.8V 或 3.3V,D-PHY 的 HS 模式是差分 200mV 摆幅。接反了会烧芯片,我亲眼见过同事因飞线接错报废了一块开发板。
调试 D-PHY 链路时,我通常会先写一个脚本轮询 MDIO 读某个关键寄存器,比如链接状态位(Link_Status)。如果这个位在 0/1 之间快速跳变,基本可以判断链路上有物理抖动——可能是阻抗不匹配或电源纹波。

下面这张图概括了 MDIO 与 D-PHY 在整个系统中的位置和关系:

MDIO管理D-PHY链路系统框架 主控制器 MDC / MDIO PHY 0 PHY 1 PHY 2 D-PHY 差分对 摄像头 0 摄像头 1 显示屏 主控制器通过 MDIO 读写每个 PHY 的寄存器,获取 D-PHY 链路状态(锁定、误码率、电压等) 调试时优先读取 PHY 的链路状态寄存器(地址 0x11),检查 Lane 对齐和 CRC 计数

图中你看到,主控制器通过 MDIO 总线(绿色虚线箭头示意)连接多个 PHY 设备。每个 PHY 再通过一对差分线(红色虚线表示 D-PHY)连接到远端摄像头或显示屏。每个 PHY 内部有很多寄存器,比如 0x00 是厂商 ID,0x11 是链路状态,0x12 是错误计数——这些就是我们的调试入口点。

我知道有人习惯直接拿示波器去量 D-PHY 线上的波形,但很多时候问题出在 PHY 配置上,而不是物理信号。用 MDIO 先读一遍寄存器,往往能直接定位到问题。比如某个 Lane 未使能、阻抗设置错误、或者终端匹配没打开。这些信息都在寄存器里明明白白写着。

我通常的做法是:发现问题 → MDIO 扫一遍所有寄存器 → 与 datasheet 中默认值对比 → 找出异常位 → 查阅手册定位根因。这套流程帮我解决过不下十个链路抖动问题。