MDIO 与 D-PHY 简介
MDIO 协议基础
MDIO 全称是 Management Data Input/Output,也就是管理数据输入输出接口。说白了,它就是用来读写 PHY 芯片内部寄存器的两根线。一根时钟 MDC,一根数据 MDIO。很多刚接触的同学会把它和 I2C 搞混,其实差别挺大。
MDIO 的帧结构很固定,我直接列个表你们看看:
| 字段 | 位数 | 说明 |
|---|---|---|
| 前导码 | 32 | 连续 32 个 1,用来同步 |
| 起始码 | 2 | 固定 01,表示帧开始 |
| 操作码 | 2 | 10 表示读,01 表示写 |
| PHY 地址 | 5 | 最多 32 个 PHY 设备 |
| 寄存器地址 | 5 | 每个 PHY 最多 32 个寄存器 |
| 周转时间 | 2 | 读操作时 PHY 驱动数据前插入高阻 |
| 数据 | 16 | 实际读写的数据 |
| 空闲 | 1+ | 高阻态,释放总线 |
这里有个坑,我当年第一次调试时没注意周转时间。读操作时如果主机不释放总线,PHY 根本没法把数据推上来。结果读回来的全是 0xFFFF,折腾了半天才发现是时序没对上。
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 总线(绿色虚线箭头示意)连接多个 PHY 设备。每个 PHY 再通过一对差分线(红色虚线表示 D-PHY)连接到远端摄像头或显示屏。每个 PHY 内部有很多寄存器,比如 0x00 是厂商 ID,0x11 是链路状态,0x12 是错误计数——这些就是我们的调试入口点。
我知道有人习惯直接拿示波器去量 D-PHY 线上的波形,但很多时候问题出在 PHY 配置上,而不是物理信号。用 MDIO 先读一遍寄存器,往往能直接定位到问题。比如某个 Lane 未使能、阻抗设置错误、或者终端匹配没打开。这些信息都在寄存器里明明白白写着。