MDIO 协议基础:概述、历史与应用场景
各位好,咱们开始聊 MDIO。说实话,这协议看着简单,但坑不少。我当年刚入行时,以为不就是两根线嘛,结果被它折腾过好几个通宵。这节课咱们把 MDIO 的底儿翻一遍,后面做 D-PHY 链路故障定位才不至于抓瞎。
MDIO 到底是什么?
MDIO,全称管理数据输入输出接口。你想想看,PHY 芯片像一头倔驴,你总得告诉它“用千兆还是百兆”、“要不要开自动协商”、“链路状态咋样”对吧?MDIO 就是这根缰绳。它用两根线搞定所有控制:
- MDC(管理时钟) – 主设备提供,最高 25 MHz
- MDIO(管理数据) – 双向数据线
说白了,主设备(通常是 MAC 或 CPU)通过这两根线读写 PHY 内部的寄存器。寄存器地址 16 位,数据 16 位,帧格式也很固定。我习惯先记住帧结构,调试时对着波形一看就知道问题出在哪。
MDIO 帧格式(Clause 22):
Preamble (32个1) + Start (01) + OP (10=读, 01=写) + PHY_AD (5位) + REG_AD (5位) + TA (读: Z0, 写: 10) + DATA (16位)
注意:读操作最后 16 位是从设备驱动,写操作是主设备驱动。
历史:从 802.3 Clause 22 到 Clause 45
MDIO 最早出现在 IEEE 802.3-1998 的 Clause 22 里。那时候 PHY 寄存器就 32 个,地址空间 5 位,够用。后来 10GBASE-T、40GBASE-T 这些新家伙出来,寄存器不够用了。2002 年 IEEE 推出了 Clause 45,把地址空间扩展到 32 位,支持多设备、多端口。
| 特性 | Clause 22 | Clause 45 |
|---|---|---|
| 发布年份 | 1998 | 2002 |
| 帧格式 | Start=01, OP=10/01 | Start=00, OP=00/01, 后跟 DEV_AD 和 32 位地址 |
| 寄存器空间 | 5 位地址(32 个) | 32 位地址(支持子地址) |
| 典型速率 | 2.5 MHz | 最高 25 MHz |
| 应用范围 | 百兆/千兆 PHY | 万兆/多端口 PHY |
我个人的建议: 现在开发新板子,优先选用支持 Clause 45 的 PHY。向后兼容,而且读写效率更高。我以前碰到过一款仅支持 Clause 22 的老 PHY,调试自动协商时死活读不到扩展寄存器,最后只能换芯片,教训深刻。
注意: Clause 45 的帧起始是 00,Clause 22 是 01。调试时如果波形上看到 Start 位不一样,别急着怀疑硬件,先确认你用的协议版本。
应用场景:MDIO 到底能做什么?
MDIO 的“管理”二字道出了本质。它不是用来传网络数据的,而是用来“管”PHY 的。我总结了几类最常见的场景:
- PHY 初始化与配置
上电后需要设置速度、双工、自动协商、流控等。所有 PHY 都有一个基本寄存器(Register 0),读出来就能知道芯片类型和版本。 - 链路状态监控
读 Link Status 位(通常是寄存器 1 的 bit 2),判断网线是否插好。我有个项目因为连接器虚焊,PHY 自检通过但 MDIO 读不到 Link Up,最后用示波器抓波形才找到问题。 - 故障诊断
通过读 MDIO 寄存器获取 FEC 纠错统计、CRC 错误数、信号质量指示等。D-PHY 链路故障时,这些寄存器是第一手证据。 - 节能以太网(EEE)
控制 PHY 进入和退出低功耗模式,寄存器 3.5 位就是 EEE 控制位。 - 扩展管理
Clause 45 支持的 MMAC(管理帧地址控制)允许读写 EEPROM、温度传感器等外设。
读 MDIO 寄存器到底有多快?
咱们算一笔账。MDC 频率假设 2.5 MHz,读一帧需要 64 个 MDC 周期(32 个前导 + 2 个起始 + 2 个操作码 + 5 个 PHY 地址 + 5 个寄存器地址 + 2 个 TA + 16 位数据)。64 / 2.5 MHz = 25.6 μs。嗯,一次读操作大概 26 微秒。如果每秒读 100 个寄存器,才占用 2.6% 的 MDIO 带宽,完全够用。
我曾经遇到客户抱怨“MDIO 每读一次要等 50 μs 太慢”,后来发现是软件里加了不必要的延时。去掉后实测 26 μs,和计算吻合。所以别迷信“慢”,先查代码。
避坑指南:MDIO 调试常见陷阱
- 上拉电阻缺失或错误 – MDIO 是双向漏极开路,需要 1.5~10 kΩ 上拉到 VIO。我有块板子忘焊上拉,读回来全是 0xFF,折腾了半小时。
- MDC 时钟质量 – 不要直接从 CPU 的 GPIO 引脚输出毛刺信号。用 SPI 或专用 MDC 时钟输出。我见过用定时器中断模拟 MDC 的,结果波形抖动导致读错寄存器。
- 设备地址冲突 – 多 PHY 共享 MDIO 时,每个 PHY 的地址不能重复。调试时用示波器抓 MDIO 线上地址位,一抓一个准。
- 帧尾无响应 – 读操作时 PHY 会在 TA 位拉低 MDIO,如果 PHY 没拉低,说明地址或协议不对。检查 PHY 的芯片手册,确认它支持 Clause 22 还是 45。
调试口诀: 先看波形,再读寄存器,最后怀疑软件。MDIO 波形上如果有毛刺或电平不稳,先查硬件,不要急着改驱动。
小结
MDIO 协议本身不复杂,两根线、几个帧格式。但它背后牵涉到 PHY 的生命周期管理。你想想看,没有 MDIO,你连 PHY 是活的还是死的都分不清。后面我们讲 D-PHY 链路故障定位,你会频繁用到 MDIO 寄存器去读链路状态、错误计数、AN 状态。把今天的基础打牢,后面就是组合拳了。