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。少一根都不行。
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?
说实话,多数工程师最关心的是——这个协议我能拿来干嘛?我列几个实际场景给你:
- PHY初始化:上电后读PHY ID寄存器,确认PHY型号;配置速率、双工、自协商模式
- 链路监控:实时查询链路状态寄存器,判断网线是否插上
- 错误诊断:读取CRC错误计数、信号质量、丢包率
- 特殊功能配置:比如我们今天要讲的重点——调整TX/RX时序偏差
我在做一款工业交换机时,千兆口在高低温下总出现高频丢包。排查了很久,最后发现是PHY内部的TX延迟偏差导致的——PCB走线长度不一致,信号到达时间差了几百皮秒。后来通过MDIO写PHY内部的一组寄存器,直接把这个偏差调平了。
现在咱们用一个流程图把MDIO协议的整体知识体系串起来。这样你看完脑子里就有个框架了。
从这张图你能看出来,MDIO协议虽然只有两根线,但它的用途非常广。从最基础的读PHY ID,到我们课程核心的Timing Skew调整,都要靠它来实现。
我记得有一回帮客户排查一块板子,百兆口没问题,千兆口死活不通。用逻辑分析仪抓MDIO,发现读状态寄存器返回的值一直在跳变。后来发现是MDIO走线太长,信号反射引起的。解决办法也很简单——在MDC上串了一个22欧姆电阻。你看,很多人只把MDIO当软件事情,其实硬件布局、阻抗匹配都会影响到通信稳定性。
后面章节我们会深入讲解如何在具体的PHY芯片里找到Timing Skew寄存器,怎么通过MDIO去调整,以及调整之后怎么验证效果。但前提是——你得先把MDIO的读写搞扎实。连帧都不会发,再怎么调也是瞎忙活。