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 在以太网 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 的读写都是同步在 MDC 的上升沿采数据、下降沿变更数据(标准规定如此)。我习惯在编写 FPGA 状态机时,用 MDC 的下降沿去更新 MDIO 的输出,上升沿去采集输入。这样可以保证时序裕量。
下面这张图是我画的一个 MDIO 接口在系统里的连接关系,方便你看清它在硬件架构中的位置:
看到没?从 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 到底是怎么把数据装进帧里传出去的。讲完帧结构,你再回过头来看这些基础内容,就能串起来了。