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和PHY之间的管理通路打通了。数据跑RGMII,配置走MDIO,各司其职。搞清楚这个结构,你后面遇到PHY异常时,就不会一脸茫然了。
小结:MDIO就是以太网PHY的“调试窗口”。读寄存器和写寄存器,几乎覆盖了所有排查手段。后面我们会深入每个寄存器的比特含义,也会手把手教你搭一个MDIO读写的小工具。