第4章:MDIO总线与MII、RMII接口关系
4.1 MII接口——MAC与PHY之间的标准公路
咱们做硬件的人,最常打交道的物理层接口就是MII。全称是Media Independent Interface,翻译过来叫“介质无关接口”。说白了,它就是MAC和PHY之间的一条标准数据通道。
MII到底长什么样?它用4根数据线(TXD[3:0])、1根发送时钟、1根发送使能,再加上接收侧的4根数据线和1根时钟,外加一个冲突检测和一个载波侦听。一共16根信号线。我今天画张图,大家直观感受一下:
嗯,图上很清楚了。MII数据接口和MDIO管理接口是两个完全独立的东西。数据走数据线,控制走MDC/MDIO两线。我见过不少新人,一听到MDIO出问题,就在MII数据线上反复量波形,结果白费功夫。
4.2 MII的16根线到底在忙什么?
MII接口定义得挺早,IEEE 802.3标准里写的。我习惯把MII信号分成三组:
- 发送组:TX_CLK(发送时钟,PHY提供)、TXD[3:0](数据)、TX_EN(使能)、TX_ER(错误指示,很多设计不用)
- 接收组:RX_CLK(接收时钟,PHY提供)、RXD[3:0](数据)、RX_DV(数据有效)、RX_ER(接收错误)
- 状态组:CRS(载波侦听)、COL(碰撞检测,全双工模式下常拉低)
这里有个坑,我吃过亏。TX_CLK和RX_CLK是PHY提供的,频率跟速率挂钩。10Mbps时2.5MHz,100Mbps时25MHz。有些PHY芯片刚上电时时钟不稳定,如果你在那一刻就去读MDIO,大概率读到0xFFFF。我曾经有个板子,PHY的晶振起振慢,MAC上电后立刻通过MDIO读状态,一连读了5次都是0xFFFF,差点怀疑PHY坏了。后来加了个延时等晶振稳了再读,问题解决。
4.3 RMII——MII的瘦身版
MII的16根线确实有点多。对于引脚紧张的SoC或者连接器,成本压力大。于是业界推出了RMII(Reduced MII),把数据线砍到2根(TXD[1:0]和RXD[1:0]),时钟也统一成50MHz的REF_CLK,一共9根线,减少了近一半。
| 特性 | MII | RMII |
|---|---|---|
| 数据线宽度 | 4位发送 + 4位接收 | 2位发送 + 2位接收 |
| 时钟数 | 2个(TX_CLK + RX_CLK) | 1个(REF_CLK,50MHz固定) |
| 总信号数 | 16(含CRS、COL) | 9(不含CRS/COL,用CRS_DV合并) |
| 最大速率 | 100Mbps | 100Mbps |
| MDIO接口 | 独立,固定2线 | 独立,固定2线(完全相同) |
你仔细看表格最后一行——MDIO在MII和RMII下完全一样!我反复强调过:数据接口怎么变,MDIO永远是那两线(MDC和MDIO)。所以排查MDIO故障时,你根本不用纠结MAC用的是MII还是RMII,方法一模一样。
4.4 MDIO在MII/RMII中的角色到底重不重要?
坦白讲,如果只做最简配置——硬件一切正常、自协商搞定、速率双工自动匹配——MDIO甚至可以完全不连。但你千万别这么干,因为:
- 调试阶段必须要读PHY寄存器:上电后检查PHY ID(寄存器2和3)、链接状态(寄存器1的bit 2)、协商结果(寄存器5、6)
- 生产测试必用MDIO:写回环模式、写速率强制模式、读信号质量指示
- 现场故障排查:网口不通时,第一件事就是通过MDIO读寄存器,看PHY是否检测到链接、协商是否完成
我记得有一次在客户现场,设备网口时通时不通。我直接连上MDIO,读寄存器1发现link状态位在0和1之间抖动,根本不是物理层断链的问题,而是PHY的自动极性校正功能跟对端交换机的极性配置冲突。最后我通过MDIO写寄存器19关掉自动极性校正,问题消失。没有MDIO,你根本不可能快速定位这种问题。
4.5 数据接口与管理接口的独立性验证
我经常用这个方法来验证MDIO是否独立于MII/RMII工作:
测试步骤:
- 先确保MII/RMII数据通路正常(能Ping通或看到链路指示灯亮)
- 然后读PHY的寄存器0(基本控制寄存器),写出全部位然后回读,看读写一致性
- 如果读写的值不一致,说明MDIO有问题。但如果此时Ping依然能通,说明数据通路是好的!
反过来,我也试过:故意断开MII数据线中的某根(比如RXD[0]),Ping立刻不通,但MDIO读写全部正常。这两个接口在硬件上是完全独立的物理路径。
4.6 如何区分是MDIO故障还是MII/RMII故障?
把常见现象列个表,平时排查时直接对照:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| PHY寄存器读回0xFFFF | MDIO线开路、时序错、PHY未响应 | 先查MDIO |
| PHY寄存器读回0x0000 | MDIO线与GND短路(常见) | 先查MDIO |
| Ping不通,但PHY的链路指示灯亮 | MII/RMII数据线开路或极性错 | 查数据接口 |
| 链路指示灯不亮,寄存器读正常 | PHY未检测到对端、自协商失败、变压器问题 | 查物理层或MDIO读寄存器状态 |
| 通信速率异常(如100M卡在10M) | MDIO写配置失败、PHY默认配置错误 | MDIO写寄存器后再回读验证 |
这个表我自己用了很多年,每次出差排查都带在身上(当然现在都在手机里存着)。说真的,很多现场问题你都不用动示波器,光靠这个表就能锁定八成。
4.7 一个真实案例:MII信号串扰导致MDIO失效
我要讲个实际碰到的案例。有一款产品,PCB布局很紧凑,MII数据线和MDIO线在10cm长度内平行走线。成品出现约5%的不良率:上电后MDIO读PHY寄存器全为0,但重新上电几次就正常了。
我用示波器抓MDIO波形,发现当MII的TX_CLK跳变时,MDIO线上会出现一个约1V的毛刺。因为MDIO的上拉电阻把线拉高到3.3V,毛刺会瞬间拉低到2.3V,对于CMOS电平的PHY,可能正好落在不确定电平区域。我赶紧改板,让MDIO走线跟MII数据线至少隔开2倍线宽,并且加了一颗33pF的滤波电容到地。之后不良率降到千分之一以下。
好了,这一章把MDIO跟MII、RMII的关系讲清楚了。核心就是两句话:数据接口变了,但管理接口不变;管理接口的排查方法完全通用。