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 地址读回全零,排查了两天才找到原因。
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。后来才翻规范看到帧类型标志位不一样——这玩意儿不兼容。
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 了。
1.4 知识结构图
下面这张图把 MDIO 的核心脉络梳理了一遍,我建议你把它存下来,后面几章都会用到。尤其是调试时,脑子里有这个图就不会乱:
1.5 小结
MDIO 看着简单,但实际项目中遇到异常的情况特别多。我做过的几个产品里,有一半的 PHY 问题最终都指向了 MDIO 通信——或者是时序不对,或者是地址冲突,或者是 Clause 22/45 混用。所以从这一章开始,先把这两种标准的骨头啃透,后面遇到波形异常、读回全 F、设备无应答的时候,才能快速定位。