1. MDIO 协议概述:历史、标准与实战价值

大家好,欢迎来到这门课。今天咱们聊 MDIO——Management Data Input/Output。很多工程师干了三五年,还在拿示波器抓 MDIO 波形,其实这协议说穿了并不复杂。我个人习惯把 MDIO 叫做「串行接口里的老江湖」,因为它从 90 年代活到现在,几乎每一颗以太网 PHY 都在用它。

你会问:现在都 PCIe、USB4 了,为什么还要学 MDIO?嗯,答案就藏在 D-PHY 里。MIPI D-PHY 的很多控制寄存器,恰好借用了 MDIO 的访问框架。你不懂 MDIO,就没法真正调通 D-PHY 的初始化。下面我先带你梳理一遍 MDIO 的家底。

1.1 MDIO 的历史:从 MII 到 Clause 22

MDIO 最早出现在 IEEE 802.3u(快速以太网)标准里,时间是 1995 年。那时候大家发现,PHY 芯片的配置太乱了——速率、双工模式、自动协商,全靠引脚电平硬拉。我刚开始做交换机时,遇到过一块 PHY 必须用 10kΩ 上拉才能进百兆模式,另一块却要求 4.7kΩ 下拉,简直疼到骨子里。

于是 IEEE 802.3 工作组搞了个 MII(Media Independent Interface) 管理接口。它只有两根信号线:

  • MDC —— 管理时钟,由 MAC 侧提供,最高频率 2.5 MHz(后来可以更高)。
  • MDIO —— 管理数据,双向,三态输出,每次传输 16 位数据。

这就是后来被称为 Clause 22 的 MDIO 协议。它的帧结构很简单,固定 64 个时钟周期,读/写都能搞定。我当时第一次用 FPGA 搭 MDIO 控制器,看完时序图就一个感觉:这玩意儿比 I²C 还简单。

帧段 位宽 说明
PREAMBLE 32 全 1,同步用,读操作必须保持
ST 2 起始码,Clause 22 固定 01
OP 2 操作码:10=读,01=写
PHYAD 5 PHY 设备地址,支持最多 32 个
REGAD 5 寄存器地址,共 32 个寄存器
TA 2 转向时间:读时为 Z0,写时为 10
DATA 16 读/写数据
小技巧: 很多工程师写 MDIO 驱动时把 PREAMBLE 省略了,以为 PHY 不检查也能跑。我踩过这个坑——某些老 PHY 确实可以,但新芯片对时序要求更严,建议保留完整的 32 个 1。

1.2 IEEE 802.3 标准变迁:Clause 22 → Clause 45

到了千兆以太网时代,32 个寄存器显然不够用了。2002 年,IEEE 802.3ae(10GbE)推出了 Clause 45,也叫 MDIO 增强版。最大区别是:

  • 寄存器地址从 5 位扩展为 16 位(但实际用 5+11 分两级)。
  • 支持多设备寻址——同一个 PHY 地址下可以有多个器件(比如激光器、CDR)。
  • 帧结构不同:ST 码变为 00,OP 码含义也变了。

我记得有一次调试 10G 光模块,PHY 死活不响应 Clause 22 读命令,最后才发现它是 Clause 45 器件。嗯,这两个标准不向前兼容——你拿 Clause 22 的主机去读 Clause 45 的 PHY,它根本不搭理你。

特性 Clause 22 Clause 45
寄存器数量 32(0x00~0x1F) 65536(但常用两级寻址)
ST 码 01 00
OP 码(写/读) 01/10 00/11(还有特殊地址)
PHYAD 宽度 5 bit 5 bit(但可以级联多个器件)
典型场景 百兆/千兆 PHY 10G+ PHY、光模块

1.3 MDIO 在 PHY 管理中的应用场景

说回实战。MDIO 的核心价值就是:用两根线完成 PHY 的初始化和状态监控。你可以用它做:

  1. 配置工作模式 —— 强制百兆全双工,关掉自动协商。
  2. 读取链路状态 —— 有没有 Link Up?远端有没有协商出流控?
  3. 调试信号完整性 —— 很多 PHY 提供内部的眼图统计值,通过 MDIO 读出。
  4. 升级固件 —— 部分 PHY 支持在运行中通过 MDIO 写 Flash。

你想想看,如果不用 MDIO,你只能靠 GPIO 电平组合来配置 PHY——那画面太美,我不敢看。曾经有个项目,因为板子空间紧张,硬是把 PHY 的配置引脚用电阻拉死了,结果换了不同批次的 PHY 就出问题,最后乖乖改成 MDIO 动态配置。

1.4 MDIO 与 D-PHY 的联系

好,到这里你可能觉得:MDIO 不是以太网的东西吗,跟 D-PHY 有什么关系?

MIPI D-PHY 规范里定义了一个 CCI(Camera Control Interface),它本质上就是 MDIO 的变体——同样的 MDC/MDIO 物理层,同样的帧结构,只是寄存器地址映射换成了 D-PHY 特定的寄存器。也就是说,你学会了 MDIO,就等于学会了 D-PHY 的寄存器访问框架。

核心结论: MDIO 不光是以太网工程师的必修课,只要是接触 MIPI D-PHY 的嵌入式工程师,都绕不开它。本课程后续所有实战代码,都是基于 MDIO 总线来读写 D-PHY 寄存器。

1.5 本章知识图谱

下面这张图把 MDIO 在 PHY 管理中的位置说清楚了。你注意看,STA(Station Management Entity)通常是 MAC 侧或 SoC 的主控,它通过 MDC/MDIO 两根线挂载多个 PHY 设备,每个 PHY 内部又有一组寄存器。咱们后面要做的 D-PHY 寄存器访问,最底层用的就是这个拓扑。

MDIO 管理接口与 PHY 寄存器访问关系 STA (站管理实体 / 主控) MDC MDIO(双向) 总线 PHY #0 地址 0x01 PHY #1 地址 0x02 PHY #N 地址 0x1F 寄存器阵列 0x00 ~ 0x1F 寄存器阵列 0x00 ~ 0x1F 📌 说明: STA 通过 MDC 提供时钟,MDIO 双向传输帧数据。 PHY 地址(5bit)和寄存器地址(5bit 或扩展)决定具体访问哪个寄存器。
⚠️ 必须警惕的陷阱: 同一个 MDIO 总线上不能出现两个相同 PHY 地址的设备,否则数据冲突。我曾在产线上遇到多片 PHY 地址默认 0x00 没改,结果读回来的数据全是乱的。所以上电第一件事,给每片 PHY 分配独立地址。

1.6 小结

这一章我们捋清了 MDIO 的来龙去脉:从 Clause 22 的 32 寄存器时代,到 Clause 45 的扩展寻址,再到它在 PHY 管理中的核心地位。你知道了 MDC/MDIO 的帧格式,也看到了它和 D-PHY 寄存器访问的关系——说白了,它就是一把螺丝刀,后面我们要用它拧 D-PHY 的寄存器螺丝。