MDIO 协议基础
MDIO,全称 Management Data Input/Output,是管理以太网 PHY 芯片的串行总线。说白了,就是主控(比如 MAC 或 CPU)通过两根线去读写 PHY 内部寄存器,用来配置速率、双工模式、协商结果啥的。我第一次接触它是在一个交换机项目中,当时以为只是个简单的串口,结果调试时波形总不对,跑了三回才把时序搞明白——嗯,这就是咱们这章要聊明白的东西。
核心理解:MDIO 是 MAC 和 PHY 之间的控制通道,数据通道是 MII/RGMII。别搞混了,MDIO 只管配置,不管业务数据。
1.1 MDIO 协议概述
IEEE 802.3 第 22 条款规定了 MDIO 协议。它采用主从结构:STA(Station Management Entity)是主设备,通常集成在 MAC 侧;PHY 是从设备,最多支持 32 个。
我个人习惯把 MDIO 想成一个“小扳手”,专门用来拧 PHY 内部寄存器这颗螺丝。读写操作通过固定帧结构完成,每个帧包含前导码、起始码、操作码、PHY 地址、寄存器地址、转态位和数据。我遇到过一个坑:某些 PHY 芯片对前导码长度要求比较严,少一个时钟周期就不响应,后来在示波器上一拍脑袋才发现的。
- 总线信号:MDC(时钟) + MDIO(数据)。MDC 由 STA 提供,最高频率 2.5 MHz(标准模式),快速模式可达 12.5 MHz。
- 数据方向:写操作由 STA 驱动 MDIO;读操作由 PHY 在 TA 之后驱动 MDIO。
- 地址空间:5 位 PHY 地址 + 5 位寄存器地址,共 32×32 个寄存器。
小技巧:调试时先读 PHY ID 寄存器(地址 0x02、0x03),确认通信建立。我经常用它快速验证 MDIO 链路通不通。
1.2 MDIO 接口定义
MDIO 总线只有两根线:MDC 和 MDIO。MDC 提供时钟,MDIO 是双向数据线。电气特性上,对外输出为推挽驱动,内部接上拉电阻,空闲时保持高电平。我建议画 PCB 时让 MDC 走线尽量短,MDIO 信号跨板时加个小电容滤毛刺。
| 信号名称 | 方向 (STA→PHY) | 功能描述 |
|---|---|---|
| MDC | 输出 | 管理数据时钟,由 STA 驱动 |
| MDIO | 双向 | 管理数据线,写时 STA 驱动,读时 PHY 驱动 |
MDIO 帧格式很固定,每个帧 64 个时钟周期(写操作)或 64 个时钟周期(读操作)。帧结构如下表:
| 字段 | 长度 (bit) | 说明 |
|---|---|---|
| PREAMBLE | 32 | 32 个连续的 1,用于同步 |
| START | 2 | 01,标志帧开始 |
| OP | 2 | 01 读,10 写 |
| PHYAD | 5 | PHY 地址,范围 0–31 |
| REGAD | 5 | 寄存器地址,范围 0–31 |
| TA | 2 | 转态位,写时为 10,读时为 Z0(PHY 在第二位驱动) |
| DATA | 16 | 读/写数据 |
避坑指南:我曾经遇到过 PHY 在 TA 阶段没有释放总线,导致 MDIO 线冲突。解决方法是检查 PHY 的驱动能力,并在 STA 侧增加内部上拉电阻。
1.3 MDIO 时序图解析
时序图是理解 MDIO 的关键。你想想看,示波器抓到一串波形,你得能一眼看出是哪一步出了问题。下面我画了一张 MDIO 帧结构图,把各个字段的位置和方向标清楚了。
结合这张图,我再说说读操作的具体过程:STA 先发送 32 个 1 做同步,然后发出 01(START),再发 01(读操作码),接着发 5 位 PHY 地址和 5 位寄存器地址,之后 TA 阶段第一个时钟 STA 释放 MDIO,第二个时钟 PHY 开始驱动数据线,最后 PHY 把 16 位数据发给 STA。写操作类似,只是 TA 为 10,STA 全程驱动 DATA。
你拿着示波器抓波形时可以按这个帧结构对号入座。我自己的习惯是先把 PREAMBLE 的 32 个连续 1 对齐,再找 START 的 01 跳变,这样后面的位就能逐个解出来了。嗯,这个基础打牢了,后面讲调试工具使用时你会觉得特别顺。
关键点:MDIO 所有数据都在 MDC 的上升沿采样。调试时务必检查 MDC 的占空比和频率,我曾经因为时钟抖动太大导致读回来的数据全是 0xFF,排查了很久。
好了,这就是 MDIO 协议的基础内容。记住帧格式、两线定义、主从关系,后面咱们就能拿示波器真刀真枪地测了。