# 第1章 MDIO协议概述:历史、作用、应用场景

以太网PHY MDIO管理接口开发与调试 - 第1节

1.1 MDIO从哪来:一段“不得不做”的进化史

MDIO这个协议,说白了就是为了让管理者和被管理者能说上话。

我最早接触MDIO是在做一款交换机芯片的时候。那时候网络设备里的PHY芯片越来越多,每个PHY都要单独配置工作模式、协商速率、查看链路状态。麻烦的是,每个PHY都有自己的控制接口,有的用I2C,有的用SPI,还有的干脆用一堆GPIO引脚——那真是噩梦。

IEEE 802.3工作组也意识到了这个问题。1999年,他们在IEEE 802.3u标准里正式定义了MDIO(Management Data Input/Output),用来解决以太网PHY芯片的统一管理问题。

小知识: MDIO最初叫MII管理接口,后来才改叫MDIO。它接在MAC和PHY之间,专门干“管理”这档事。

演进到现在,MDIO已经经历了几个版本:

  • Clause 22(经典MDIO):1999年推出,支持32个设备,每个设备32个16位寄存器。地址空间小,但够用。
  • Clause 45(扩展MDIO):2002年推出,支持更大的地址空间,每个设备最多65536个寄存器。适合复杂PHY和光模块。

你想想看,一个网口需要配置的东西有多少?速率、双工模式、自动协商、流控、MDI/MDIX反转、节能以太网……这些都得通过MDIO来读写。要是没有统一接口,系统工程师大概要疯掉。

1.2 MDIO到底有什么用:其实就是“读PHY的寄存器”

MDIO的作用可以归纳为三个字:管PHY。

具体来说,它干这几件事:

  1. 配置PHY:设置工作模式、速率、双工、自动协商参数。
  2. 监控链路:读链路状态、协商结果、错误计数、信号质量。
  3. 调试排障:读PHY内部状态寄存器、环回测试、诊断结果。
  4. 管理电源:让PHY进入低功耗模式、唤醒、复位。
在我做过的项目中,90%的PHY调试问题都可以通过MDIO读出寄存器值来定位。链路不通?先读PHY状态寄存器。协商失败?看自动协商能力寄存器。速率不对?检查速率指示位。

MDIO的物理层其实很简单:两根线——MDC(时钟线)和MDIO(数据线)。MDC由MAC侧提供,最高频率一般不超过2.5MHz(Clause 22)或50MHz(Clause 45)。MDIO是双向数据线,在MDC的上升沿采样。

嗯,这里要提一个我踩过的坑:MDC时钟频率。有一次在项目中,为了追求性能,我把MDC时钟频率提到了5MHz,结果发现PHY根本不响应。查了半天规格书才发现,那个PHY只支持到2.5MHz。所以啊,频率一定要看PHY规格书,别想当然。

1.3 MDIO应用场景:从交换机到嵌入式,无处不在

MDIO的应用场景比你想象的要多:

场景 典型设备 MDIO主要用途
交换机/路由器 交换芯片 + 多口PHY 统一配置所有PHY,监控每个端口状态
嵌入式系统 SoC内嵌MAC + 外挂PHY 初始化PHY,协商获取链路信息
光模块 SFP/SFP+/QSFP模块 读取诊断信息、模块类型、告警状态
汽车以太网 车载PHY 配置工作模式、监控链路完整性
工业以太网 工业级PHY 配置冗余设置、读取plc状态

个人认为,MDIO最大的价值在于它让系统软件能够“看见”物理层发生了什么。没有MDIO,PHY就像一个黑盒子;有了它,你就能看到链路上每一个细节。

1.4 MDIO协议的核心逻辑:谁控制谁?

搞懂MDIO,先要搞明白它的控制模型:

  • 主设备(STA,Station Management Entity):通常是MAC侧的管理接口。它发起所有读写操作。
  • 从设备(MMD,MDIO Manageable Device):通常是PHY芯片或光模块。它响应主设备的操作。

MDIO总线可以支持最多32个从设备(Clause 22)或更多(Clause 45)。每个从设备在MDIO地址线上有自己的地址,类似I2C的设备地址。

为什么会这样设计?实际上,我刚开始接触时也觉得奇怪。后来在项目中调试多口PHY时才明白:一根总线挂多个PHY,只需要在主控端维护一个管理接口,就能搞定所有PHY的配置和监控,硬件成本大幅降低。

注意: 虽然是半双工总线,但MDIO的操作是互斥的。在同一时刻,只能有一个从设备响应主设备。如果两个从设备地址冲突,总线会乱套。我遇到过PHY地址配置错导致整个MDIO总线瘫痪的情况,折腾了半天才发现是地址跳线焊错了。

MDIO的帧结构其实不复杂。拿Clause 22来说,一帧包含:

  • 32位前导码(全是1)
  • 2位起始码(01)
  • 2位操作码(读10/写01)
  • 5位PHY地址
  • 5位寄存器地址
  • 2位转向时间(Trn,2个时钟周期)
  • 16位数据

一共64个时钟周期。每次读写操作就是一帧。这个帧结构在硬件调试的时候特别重要——直接用示波器抓MDC和MDIO波形,跟协议对比,就能定位问题。

我在调试中遇到过不少MDIO通信问题,比如:

  1. MDIO没信号:检查驱动配置是否正确,MDIO引脚是否被复用。
  2. MDIO收到全0或全1:可能是地址配置不对,或者PHY不在复位状态。
  3. 读数据总是0xFFFF:PHY可能不支持该寄存器地址,或者处于错误状态。

这些问题,后面章节会详细讲调试方法。这里先建立一个认知:MDIO通信的可靠性和健壮性,很大程度上决定了你的PHY调试体验。

MDIO协议知识体系结构图 MDIO协议知识体系 MDIO协议 历史演进 • Clause 22 (1999) • Clause 45 (2002) • 解决PHY统一管理问题 核心作用 • 配置PHY工作模式 • 监控链路状态 • 调试排障 / 电源管理 应用场景 • 交换机/路由器 • 嵌入式系统 • 光模块/汽车/工业 控制模型 • 主设备(STA) • 从设备(MMD) • 半双工互斥访问 帧结构 • 32位前导 + 2位起始 • 操作码 + 地址 + 数据 • 64个时钟周期/帧 硬件接口 • MDC(时钟线) • MDIO(数据线) • 频率2.5~50MHz 硬件调试实战:波形分析 + 寄存器读写 说明:左侧历史、中间 作用、右侧场景,下层 技术细节,底部调试方法

这张图梳理了MDIO协议的知识体系。如果说整门课是一棵树,那么第一章就是树根——先把MDIO的来龙去脉搞清楚,后面才能踩稳每一步。

总结:MDIO协议由IEEE 802.3定义,用于MAC对PHY的控制和管理。它用两根线(MDC+MDIO)和固定的帧结构,实现配置、监控、调试三种核心功能。应用涵盖交换机、嵌入式、光模块、汽车和工业等领域。