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 帧结构图,把各个字段的位置和方向标清楚了。

MDIO 帧结构图(64 个时钟周期) PREAMBLE (32 bits) START (01) OP (2 bits) PHYAD (5 bits) REGAD (5 bits) TA (2 bits) DATA (16 bits) STA 驱动方向 读时 PHY 驱动 DATA 写操作:OP=10, TA=10,DATA 由 STA 驱动 读操作:OP=01, TA=Z0,DATA 由 PHY 驱动 每个帧从 PREAMBLE 开始,连续 32 个 1 共 64 个 MDC 时钟周期,每个比特对应一个 MDC 上升沿

结合这张图,我再说说读操作的具体过程: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 协议的基础内容。记住帧格式、两线定义、主从关系,后面咱们就能拿示波器真刀真枪地测了。