MDIO协议概述

做硬件这几年,跟PHY芯片打交道是最多的。每次调试网口,无论千兆还是百兆,都绕不开一个叫MDIO的玩意儿。说白了,它就是芯片之间用来“聊天”的协议,专门让MAC层去读写PHY寄存器。

我记得刚入行时,第一次调PHY的时序,拿示波器抓MDIO波形,发现数据怎么都不对。后来才搞明白,原来是协议时序没卡准。从那天起,我就对这个只有两根线的协议特别上心。

历史背景:为什么会出现MDIO?

咱们得回到上世纪90年代末。那时候以太网正从10Mbps往100Mbps过渡。PHY芯片越来越复杂,寄存器越来越多。你想想看,总不能每换一个PHY就改硬件吧?所以IEEE组织开始琢磨,能不能搞一套统一的管理接口。

1998年,IEEE 802.3u标准里正式定义了MDIO(Management Data Input/Output)。我当时的理解就是:它让CPU或者MAC能够直接读PHY里面的寄存器值。比如看看链路有没有起来、有没有协商好速率、有没有报错。

嗯,这里要记住一个关键点——MDIO只有两根线:

  • MDC:管理时钟,由MAC侧驱动
  • MDIO:管理数据,双向传输

所以你去看PHY芯片的引脚,一定有个MDC和MDIO。少一根都不行。

一个小发现:有些PHY芯片支持“无MDIO模式”,也就是靠硬件引脚直接配置寄存器。但我个人建议——能用MDIO尽量用MDIO。调试时灵活太多了。

IEEE 802.3标准:MDIO到底说了什么?

IEEE 802.3对MDIO的帧格式定义得非常清楚。咱们看看标准里咋写的:

字段 位数 说明
Preamble (预置码) 32 全是1,用来同步
Start (起始) 2 固定为01
OP (操作码) 2 读=10,写=01
PHYAD (PHY地址) 5 0x00~0x1F
REGAD (寄存器地址) 5 0x00~0x1F
TA (转向) 2 读时MAC释放总线
DATA (数据) 16 寄存器内容

你看,一帧下来也就64位。我刚开始做的时候,觉得挺简单——不就是发一串电平高低嘛。但实际做驱动时发现,坑都在细节里。

比如那个Turnaround(TA)位。读操作时,MAC必须在这两个时钟周期里把MDIO脚从输出切到输入。我见过不少驱动这块没写对的,结果读回的数据全是0xFF。我曾踩过这个坑,后来老老实实加了一个GPIO方向切换的延迟,才算稳定。

核心要点:MDIO协议本质上是一个“主从式”总线。MAC是主(Master),PHY是从(Slave)。所有时钟都由MAC提供,PHY不能主动发起通信。

典型应用场景:什么时候要用MDIO?

说实话,多数工程师最关心的是——这个协议我能拿来干嘛?我列几个实际场景给你:

  • PHY初始化:上电后读PHY ID寄存器,确认PHY型号;配置速率、双工、自协商模式
  • 链路监控:实时查询链路状态寄存器,判断网线是否插上
  • 错误诊断:读取CRC错误计数、信号质量、丢包率
  • 特殊功能配置:比如我们今天要讲的重点——调整TX/RX时序偏差

我在做一款工业交换机时,千兆口在高低温下总出现高频丢包。排查了很久,最后发现是PHY内部的TX延迟偏差导致的——PCB走线长度不一致,信号到达时间差了几百皮秒。后来通过MDIO写PHY内部的一组寄存器,直接把这个偏差调平了。

注意:不是所有PHY都支持Timing Skew调整。你得先看datasheet里的“Skew Register”或者“Delay Compensation”相关章节。没有这个功能的话,只能在PCB布线阶段解决。

现在咱们用一个流程图把MDIO协议的整体知识体系串起来。这样你看完脑子里就有个框架了。

MDIO协议知识体系框架图 MDIO协议核心知识框架 历史背景与标准 帧结构 Preamble → Start → OP → ADDR → TA → DATA 接口信号 MDC (时钟) + MDIO (数据) 基础应用 PHY初始化 链路状态查询 错误计数读取 高级应用 时序偏差调整 信号完整性优化 能量检测配置 调试技巧 逻辑分析仪抓波形 GPIO模拟MDIO 回环测试验证 核心目标:通过MDIO可编程调整PHY内部时序延迟 解决PCB走线长度不匹配导致的数据采样偏移问题

从这张图你能看出来,MDIO协议虽然只有两根线,但它的用途非常广。从最基础的读PHY ID,到我们课程核心的Timing Skew调整,都要靠它来实现。

我记得有一回帮客户排查一块板子,百兆口没问题,千兆口死活不通。用逻辑分析仪抓MDIO,发现读状态寄存器返回的值一直在跳变。后来发现是MDIO走线太长,信号反射引起的。解决办法也很简单——在MDC上串了一个22欧姆电阻。你看,很多人只把MDIO当软件事情,其实硬件布局、阻抗匹配都会影响到通信稳定性。

调试建议:如果你遇到MDIO通信不稳定,先别急着改驱动。拿示波器看MDC和MDIO的边沿是否干净。我个人习惯把MDC频率控制在2.5MHz以下,跑太高容易出问题。

后面章节我们会深入讲解如何在具体的PHY芯片里找到Timing Skew寄存器,怎么通过MDIO去调整,以及调整之后怎么验证效果。但前提是——你得先把MDIO的读写搞扎实。连帧都不会发,再怎么调也是瞎忙活。