1. MDIO 协议概述

1.1 什么是 MDIO 总线?

MDIO,全称 Management Data Input/Output,说白了就是用来管理以太网 PHY 芯片的一根串行总线。我刚开始做嵌入式网络产品的时候,总觉得这玩意儿就是个“配置寄存器的小门”,后来踩了几次坑才明白——MDIO 要是跑不稳,整条链路都别想正常工作。

MDIO 只有两根线:

  • MDC(Management Data Clock)—— 时钟线,由 MAC 或 CPU 侧主动提供
  • MDIO(Management Data Input/Output)—— 数据线,双向,半双工

你想想看,两根线就能读写上千个寄存器,这不比 I²C 简单?但简单归简单,时序上的坑一点也不少。

典型的应用场景:CPU 或交换芯片通过 MDIO 去读写 PHY 的寄存器,比如协商状态、链路速度、中断使能等等。我在一个交换机项目中就遇到过因为 MDIO 上拉电阻选错导致 PHY 地址读回全零,排查了两天才找到原因。

小经验: MDIO 的上拉电阻一般选 1.5kΩ~4.7kΩ,具体要看总线上挂了几个设备。挂多了驱动能力不够,挂少了信号反射又大。我之前习惯直接上 4.7kΩ,后来发现接 4 个 PHY 就得降到 2.2kΩ。

1.2 发展历史

MDIO 最早在 IEEE 802.3u(快速以太网标准)里被定义,也就是后来大家熟知的 Clause 22。那时候逻辑简单:

  • 5 位 PHY 地址,最多支持 32 个设备
  • 5 位寄存器地址,每个 PHY 最多 32 个寄存器
  • 16 位数据宽度,一次读写一个寄存器

够用吗?早期够。但后来 10GBASE-T、SFP+ 这些高速接口一出来,Clause 22 的 32 个寄存器根本不够塞。IEEE 802.3ae 在 2002 年推出了 Clause 45,做了个大升级:

  • PHY 地址还是 5 位,但加了个 5 位的 DEVAD(设备地址),可以区分同一个 PHY 里的不同子模块
  • 寄存器地址扩展到 16 位,每个子模块最多 65536 个寄存器
  • 引入了 MMD(Managed Module Device)的概念,能管理光模块、PMD 等复杂的器件

我记得第一次用 Clause 45 时还傻乎乎按 Clause 22 的帧格式去发命令,结果回读全是 0xFFFF。后来才翻规范看到帧类型标志位不一样——这玩意儿不兼容。

注意: Clause 22 和 Clause 45 的帧格式 不能混用。特别是有些便宜的 PHY 宣称支持 Clause 45,实际上只实现了部分地址,写入 C45 帧可能没反应。做兼容性测试时务必先读一次 ID 寄存器确认。

1.3 两种标准对比

我习惯把 Clause 22 和 Clause 45 放在一起看,心里才踏实。下面这个表是每次做方案选型时必翻的:

对比项 Clause 22 Clause 45
首次发布的 IEEE 标准 802.3u (1995) 802.3ae (2002)
PHY 地址位数 5 位(0~31) 5 位(0~31)
寄存器地址位数 5 位(0~31) 16 位(0~65535)
子模块(DEVAD) 无 5 位(0~31)
帧类型标记 起始码 + 操作码 01/10 起始码 + 操作码 00/11 + 帧类型
典型用途 百兆/千兆 PHY 基本管理 万兆 PHY、光模块、背板链路诊断

说实话,现在很多 10/100/1000M PHY 依然只支持 Clause 22,因为成本低、IP 成熟。但 2.5G/5G/10G 以上的 PHY 基本都是 Clause 45 了。

一个容易忽略的点: Clause 45 的读操作流程比 Clause 22 多了一步——必须先发一个地址命令告诉 PHY 要读哪个 16 位寄存器,再发一个读命令才能拿到数据。而 Clause 22 是直接在帧里带寄存器地址,一次搞定。调试时如果发现读不了数据,先检查是不是缺少了地址命令这一步。

1.4 知识结构图

下面这张图把 MDIO 的核心脉络梳理了一遍,我建议你把它存下来,后面几章都会用到。尤其是调试时,脑子里有这个图就不会乱:

MDIO 协议核心知识结构 MDIO 总线 物理层:MDC + MDIO 标准版本 帧格式与操作 Clause 22(32 寄存器) Clause 45(16b 地址 + DEVAD) 读写帧结构 地址/数据双周期 调试时先确认:总线模式(C22/C45)、PHY 地址、上拉电阻、时钟极性

1.5 小结

MDIO 看着简单,但实际项目中遇到异常的情况特别多。我做过的几个产品里,有一半的 PHY 问题最终都指向了 MDIO 通信——或者是时序不对,或者是地址冲突,或者是 Clause 22/45 混用。所以从这一章开始,先把这两种标准的骨头啃透,后面遇到波形异常、读回全 F、设备无应答的时候,才能快速定位。