MDIO 协议概述:从一根线聊起

各位同学好,我是你们这堂课的老周。今天咱们开始啃 MDIO 协议,也就是管理数据输入输出接口。说实话,我第一次接触这玩意儿的时候,觉得它特别不起眼——就两根线,能干啥?后来我才发现,这两根线要是出了问题,你的网络设备直接变砖头。咱们一点一点来。

什么是 MDIO?

MDIO,全称是 Management Data Input/Output。说白了,就是一条用来读和写 PHY 芯片内部寄存器的串行总线。它和 MDC 时钟线配合工作。

我习惯把 MDIO 理解为PHY 芯片的“管理通道”。你想调整 PHY 的速率、双工模式、自动协商策略,或者想知道当前链路状态、有没有收到远端故障,都得通过 MDIO 去读写内部寄存器。

MDIO 的历史其实挺久了。IEEE 802.3 的第 22 条款(Clause 22)最早定义了它,最开始只有 5 位寄存器地址、5 位 PHY 地址,总共能访问 32 个寄存器。后来发展到 Clause 45,支持更大的地址空间。但我个人觉得,搞懂 Clause 22 是基础,Clause 45 只不过是地址变长了,帧格式改了改而已。

小提示: 很多初学者会混淆 MDIO 和 I2C。它俩虽然都是两线串行,但 MDIO 是纯单向控制线(2线双向数据 + 时钟),而且帧结构完全不同,别搞混了。

MDIO 在以太网 PHY 管理中的作用

这其实是核心问题。你在项目中用到的 PHY 芯片,比如 Marvell 88E1111、Broadcom BCM5461、或者国产的裕太微 PHY,内部都有一个 寄存器矩阵。这些寄存器控制着 PHY 的所有行为。

MDIO 就是连接 MAC 控制器和 PHY 寄存器的桥梁。我当年做一个交换机项目,PHY 死活 Link 不上,示波器量波形都正常,最后发现是 MDIO 配置里把一个“强制全双工”的 bit 写错了。你说惨不惨?

具体来说,MDIO 负责以下几件事:

  • 读取状态: Link 状态、速度协商结果、远端错误、电能检测等。
  • 配置参数: 强制速率/双工、开启/关闭自动协商、设置 LED 模式等。
  • 管理 EEE(节能以太网): 控制低功耗模式、唤醒时间。
  • 访问内部统计: 收发包计数、CRC 错误计数、单播/多播帧计数等。

你想想看,如果不通过 MDIO,你怎么知道 PHY 当前工作在千兆还是百兆?你怎么知道线缆是不是接反了?有些 PHY 还能告诉你信号质量好不好。这些都是靠 MDIO 读出来的。

MDIO 与 MDC 的物理层接口

物理上,MDIO 接口只有两条线:

  • MDC: 时钟线,由 MAC 端驱动,最大频率通常是 2.5 MHz。有些 PHY 可以跑更高,但标准是 2.5 MHz。
  • MDIO: 数据线,双向开漏。MAC 通过它发送命令和写数据,PHY 通过它回复读数据。
信号 方向 描述
MDC MAC → PHY 管理时钟。每个时钟周期传输 1 bit 数据。
MDIO 双向(开漏) 管理数据。写操作时 MAC 驱动,读操作时 PHY 驱动。

这里有个容易踩坑的地方——我见过不少项目,MDIO 信号线上忘了加上拉电阻。因为 MDIO 是开漏输出,如果不加外部上拉,高电平根本拉不上去,读回来的数据全是 0。你说你查了多少天?嗯,我曾经就在一个 FPGA 设计的板子上被这个问题坑了整整两周。信号都能量到,但读写就是不对。

避坑指南: MDIO 线上需要外接 1.5kΩ 到 10kΩ 的上拉电阻到 3.3V 或 1.8V(取决于 PHY 的 I/O 电压)。不做这一步,你的 PHY 管理通道基本废了。

另外,关于时序。MDIO 的读写都是同步在 MDC 的上升沿采数据、下降沿变更数据(标准规定如此)。我习惯在编写 FPGA 状态机时,用 MDC 的下降沿去更新 MDIO 的输出,上升沿去采集输入。这样可以保证时序裕量。

下面这张图是我画的一个 MDIO 接口在系统里的连接关系,方便你看清它在硬件架构中的位置:

MDIO/MDC 接口连接关系 MDIO/MDC 接口连接关系 MAC 控制器 管理实体 PHY 芯片 内部寄存器 MDIO 从机 MDC MDIO Rₚ GND 注意事项 • MDIO 为开漏输出,必须加上拉电阻 • MDC 时钟由 MAC 主动产生,频率不超过 2.5 MHz

看到没?从 MAC 出来的 MDC 直接连到 PHY,MDIO 则双向传输,中间的那个 Rₚ 就是我要你务必加上的上拉电阻。少了它,你的 MDIO 浮空,读写全乱套。

关于 MDC 时钟频率的体会

标准规定 MDC 最大频率是 2.5 MHz,但其实很多 PHY 可以支持到 10 MHz 甚至更高。不过我不建议你为了省点传输时间就盲目提高时钟。我做过对比测试:当 MDC 超过 10 MHz 时,信号完整性明显变差,特别是线长超过 5 cm 的时候。还是老老实实用 2.5 MHz 吧。

另外有个细节:MDC 空闲时必须保持低电平,因为 PHY 是靠 MDC 的上升沿来识别帧起始的。如果 MDC 一直悬空或者浮在高电平,PHY 可能一直误检测,导致通信失败。

小结一下

MDIO 和 MDC 这么两根简单的线,却是你访问 PHY 世界的钥匙。记住三点:

  • MDIO 是双向数据线,负责读写 PHY 内部寄存器。
  • MDC 是时钟线,由 MAC 主动产生。
  • 上拉电阻 不要省略,我之前吃过亏。

下一节我们会开始深入帧结构,看看 MDIO 到底是怎么把数据装进帧里传出去的。讲完帧结构,你再回过头来看这些基础内容,就能串起来了。

课后作业: 去翻一下你的 PHY 数据手册,找到 MDIO 接口时序图。自己手画一遍 MDC 和 MDIO 在写操作和读操作时的波形变化。这是理解帧结构的最好方式。