以太网之MDIO
组里新买了一款开发板,打算借此重温基本外设的开发。本系列将结合相关芯片手册及个人理解,对 FPGA 开发以太网进行整理和记录。
1. MDIO 简介
MDIO(Management Data Input/Output)是以太网物理层设备(PHY)和 MAC 之间的管理接口,主要用于配置和监控 PHY 设备的状态。MDIO 通常与 MDC(Management Data Clock)一起使用,MDC 提供时钟信号,而 MDIO 用于数据传输。通常情况下,PHY 芯片在默认状态下也可正常工作,因此在进行以太网通信实验时,对 MDIO 接口的配置并非必须。
- ETH_MDC:为 ETH_MDIO 提供时钟,数据手册[1]中规定其最大时钟频率不得超过 12.5MHz。
- ETH_MDIO:双向数据引脚,支持数据的发送与接收。

1.1 MDIO 通信帧格式
MDIO 接口的读写通信帧格式如下表所示:
字段 | 读操作帧结构 | 写操作帧结构 |
---|---|---|
Preamble | 32 位逻辑 "1" | 32 位逻辑 "1" |
ST | 01(帧开始信号) | 01(帧开始信号) |
OP | 10(读操作码) | 01(写操作码) |
PHYAD | 5 位 PHY 地址(AAAAA) | 5 位 PHY 地址(AAAAA) |
REGAD | 5 位寄存器地址(RRRRR) | 5 位寄存器地址(RRRRR) |
TA | Z0(高阻切换) | 10(固定输出) |
DATA | 16 位读取数据(高位在前) | 16 位写入数据(高位在前) |
IDLE | 高阻态(默认上拉至高电平) | 高阻态(默认上拉至高电平) |
1.2 关键字段说明
- Preamble:32 位前导码,用于同步 PHY 芯片。
- ST:帧起始标志,固定为
01
。 - OP:操作码,
10
表示读,01
表示写。 - PHYAD:5 位 PHY 地址,支持 MAC 连接多个 PHY 芯片。
- REGAD:5 位寄存器地址,指定目标寄存器。
- TA:方向切换标志。读操作时,MDIO 由 MAC 驱动切换为
PHY 驱动;写操作时固定为
10
。 - DATA:16 位数据,传输时高位在前。
- IDLE:空闲状态,默认通过上拉电阻维持高电平。
1.3 时序详解
读操作时序

以从 PHY 地址 0x01
的寄存器 0x00
读取数据为例:
MAC 驱动 MDIO 发送前导码、操作码、地址等信息。
TA 阶段:MDIO 引脚切换为由 PHY 驱动,第一个 TA 位为高阻态,第二个 TA 位若为低电平,则 PHY 响应成功并输出数据;若为高电平,则响应失败。
数据采集:PHY 在 MDC 时钟上升沿采集数据,为确保数据稳定传输,MAC 在 MDC 下降沿更新 MDIO 引脚数据。当 MDIO 引脚切换至PHY驱动时,MDIO 数据于 MDC 时钟下降沿更新,故 MAC 需在 MDC 时钟上升沿进行数据采集。
读操作结束后,MAC 将 MDIO 引脚置为高阻态,此时由外部上拉电阻将其拉高,使 MDIO 接口进入空闲状态。
写操作时序

以向 PHY 地址 0x01
的寄存器 0x00
写入数据
0x1340
为例:
MAC 全程驱动 MDIO,依次发送帧头、地址和数据。
PHY 于 MDC 时钟上升沿采集数据,为确保数据稳定传输,MAC 在 MDC 下降沿更新 MDIO 引脚数据。
写操作完成后,MAC 将 MDIO 引脚置为高阻态,借助外部上拉电阻将其拉高,使 MDIO 接口进入空闲状态。
1.4 PHY 地址配置
PHY 地址由硬件电路中的 PHYAD[2:0]
引脚电平决定。开发板原理图如下所示,PHY 地址被配置为
5'h01
:


1.5 复位方式
RTL8211 PHY 芯片支持两种复位方式:
硬件复位:通过
PHYRSTB
引脚保持 10ms 低电平实现。但开发板上该引脚被上拉,无法使用。软件复位:向寄存器
0x00
的 Bit[15] 写入1
,复位完成后该位自动清零。


1.6 常用寄存器
BMCR(基础模式控制寄存器,地址
0x00
)


- Bit[15]:软件复位位(写入
1
触发)。 - Bit[14]:环回模式使能(
1
启用)。 - Bit[6/13]:速率选择(仅在自动协商关闭时有效,
10
==> 1000Mb/s;01
==> 100Mb/s;00
==> 10Mb/s)。 - Bit[12]:自动协商使能(
1
启用)。 - Bit[9]:重启自动协商(
1
触发)。
BMSR(基础模式状态寄存器,地址
0x01
)

- Bit[5]:自动协商完成标志(
1
表示完成)。 - Bit[2]:链路状态(
1
表示连接成功)。
PHYSR(PHY 状态寄存器,地址
0x1A
)

- Bit[5:4]:连接速率(
10
==> 1000Mbps,01
==> 100Mbps,00
==> 10Mbps)。