MDIO概述:管理以太网PHY的“控制台”

各位好,我是老张。做了十几年硬件,调试过的PHY芯片少说也有几十款。今天咱们聊聊MDIO——这个在以太网调试中几乎天天打交道的协议。

说白了,MDIO就是一根串行总线。它让你能用代码去“拧”PHY芯片上的旋钮,看看它内部的状态灯。

嗯,别小看这玩意儿。我遇到过不少工程师,板子调不通就在那儿瞎猜,其实就是没用好MDIO。

MDIO是什么?

MDIO的全称是Management Data Input/Output,管理数据输入输出接口。它由两根线组成:

  • MDC:时钟线,由控制器(MAC侧)驱动。
  • MDIO:数据线,双向的,既写也读。

你想想看,PHY芯片就是个黑盒子。它怎么跟MAC沟通自己当前的状态?比如链路是否建立、速率是100M还是1000M、有没有CRC错误?这些信息,都藏在PHY内部的寄存器里。MDIO就是那个让你访问这些寄存器的通道。

IEEE 802.3规范里,MDIO帧格式定义得很清楚。我刚开始学的时候觉得那协议条文太枯燥,后来调试抓波形时才明白——每一比特都有它的意义。

核心要点:MDIO本质上是一个管理接口。它不属于数据通路,但没了它,你就像蒙着眼睛调设备。

每次上电,PHY内部有一堆寄存器需要初始化。速率、双工模式、流控开关、中断使能……这些全是靠MDIO写进去的。调试时,你又要读寄存器来定位问题。

为什么需要MDIO?

有人可能会问:为什么不能把这部分管理功能集成到数据接口里?

原因其实很简单。数据接口走的是大流量,讲究的是低延迟、高吞吐。它没工夫去处理那些慢吞吞的配置信息。把管理和数据分开,各干各的,互不干扰。

我个人习惯把MDIO比作PHY的“控制面板”。

  • 配置功能:复位、软复位、AN(自协商)使能、中断配置。
  • 监控功能:读链路状态、读速度/双工、读错误计数器。
  • 诊断功能:强制模式、回环测试、MDI/MDIX状态查询。

举个例子。我曾经遇到过一块板子,网口在千兆模式下总是丢包。查PCB、查变压器、查电容,折腾了两天没头绪。最后靠MDIO读到PHY内部一个叫“信号质量指示”的寄存器,发现有一对差分线的眼图裕量不够。顺着这个线索,才发现是布线时差分对间距没等长。

没有MDIO的话,这种问题你只能换个板子盲试。效率太低了。

经验谈:调试PHY问题,我的第一步永远是读寄存器0x01(BMSR,基本状态寄存器)。它能告诉你PHY是否活着、AN是否完成、远端是否有故障。这一步只需要3条语句。花30秒,少走两天弯路。

MDIO在以太网PHY中的作用

说一点具体的。一个标准的以太网PHY,至少有32个寄存器。前16个是IEEE强制规定的(寄存器0~15),后16个由厂家自定义。

寄存器地址 名称 作用
0x00 BMCR 控制寄存器:复位、速度、双工、AN使能
0x01 BMSR 状态寄存器:链路状态、AN完成、能力
0x04 ANAR 自协商广告寄存器:告诉对端自己能做什么
0x05 ANLPAR 自协商对端能力寄存器:看到对端的能力
0x10+ 厂家自定义 回环、EEE、信号质量、温度等

你可能会好奇:MDIO上怎么区分是读还是写?怎么知道访问哪个PHY?

MDIO协议里,每帧包含5位PHY地址和5位寄存器地址。一个MDIO总线最多能挂32个PHY。端口地址通过PHY芯片的RESET或地址引脚来决定,一般在板级就固定好了。

我印象很深的一次调试,客户说千兆偶尔降速到百兆。我用MDIO读了BMSR,发现“AN完成”位在闪烁。这说明自协商一直在反复进行。查到最后,是RJ45连接器端子的镀层氧化,导致接触阻抗偶尔偏高,触发PHY重新协商。

这些寄存器里埋了多少信息?你想想看,有了MDIO,你就能精确知道问题出在物理层还是链路层。这在系统级调试中价值巨大。

常见陷阱:寄存器0x00的bit15是软复位。很多人初始化时写了这个位,但没等到它完成就急着写其他寄存器——导致配置丢失。我的做法是:写复位后,循环读BMSR,直到bit5(AN完成)置1,再往下走。

至于MDIO的读写时序,我简单列一下帧格式,方便你后面抓波形时对照:

写操作帧(32位):
| PRE(32个1) | ST(01) | OP(01) | PHY_ADDR(5bit) | REG_ADDR(5bit) | TA(10) | DATA(16bit) | IDLE(Z) |

读操作帧(32位):
| PRE(32个1) | ST(01) | OP(10) | PHY_ADDR(5bit) | REG_ADDR(5bit) | TA(Z0) | DATA(16bit) | IDLE(Z) |

注意那个TA位。写操作时,主机直接驱动“10”。读操作时,主机先释放总线(高阻Z),然后等待PHY拉低一个时钟作为应答。如果板上MDIO上拉电阻没焊,或者PHY地址配错了,这个地方就会卡死。

我曾经犯过这个错。板子回来,MDIO读寄存器全是0xFFFF。排查了半天,发现是原理图上MDIO的上拉电阻画成了1kΩ——引脚的驱动能力不够,拉不高。换了个4.7kΩ,一切正常。

一张图看懂MDIO的定位

下面这张图,浓缩了MDIO在整个以太网系统里的位置和扮演的角色。看看就清楚了:

MDIO在以太网系统中的角色 MAC / CPU (MDIO控制器) MDIO总线 MDC + MDIO PHY芯片 (最多31个) MDIO核心功能 • 配置PHY:复位、速率/双工选择、自协商使能 • 监控PHY:链路状态、速率/双工、错误计数器 • 诊断PHY:回环测试、信号质量、异常状态 常用寄存器 0x00 BMCR 0x01 BMSR 0x04 ANAR 0x05 ANLPAR 数据通路 (RGMII / SGMII / 1000BASE-X) 管理通路 (MDIO) 分离 一句话总结:MDIO就是用两根线(MDC+MDIO)访问PHY内部寄存器的管理接口

你看,MDIO把MAC和PHY之间的管理通路打通了。数据跑RGMII,配置走MDIO,各司其职。搞清楚这个结构,你后面遇到PHY异常时,就不会一脸茫然了。

小结:MDIO就是以太网PHY的“调试窗口”。读寄存器和写寄存器,几乎覆盖了所有排查手段。后面我们会深入每个寄存器的比特含义,也会手把手教你搭一个MDIO读写的小工具。