第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根信号线。我今天画张图,大家直观感受一下:

MDIO总线与MII/RMII接口关系 MAC(媒体访问控制器) 内部集成MII/RMII接口 PHY(物理层芯片) 外部晶振/时钟管理 MII 数据接口 TXD[3:0], RXD[3:0], TX_CLK, RX_CLK, TX_EN, RX_DV, CRS, COL RMII 数据接口 TXD[1:0], RXD[1:0], REF_CLK, TX_EN, CRS_DV MDIO 管理接口 MDC(时钟)+ MDIO(数据) 读/写PHY寄存器(控制、状态、协商) MDC MDIO MDC MDIO 核心要点 MDIO是独立于MII/RMII数据通道的管理总线,负责读写PHY内部寄存器;MII/RMII负责数据传输。 MDIO故障不会导致数据完全中断,但会使PHY工作异常(速率/双工不匹配、协商失败等)。

嗯,图上很清楚了。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,方法一模一样。

避坑指南:我曾经遇到一个项目,硬件工程师为了省PCB面积,把MDIO的上拉电阻省了。结果MDIO线在总线上无驱动时呈现高阻态,读什么都乱码。后来我在PHY的MDIO引脚外接了4.7kΩ上拉到3.3V,问题解决。记住:MDIO是双向开漏,必须上拉!不管MII还是RMII,都要有这个电阻。

4.4 MDIO在MII/RMII中的角色到底重不重要?

坦白讲,如果只做最简配置——硬件一切正常、自协商搞定、速率双工自动匹配——MDIO甚至可以完全不连。但你千万别这么干,因为:

  1. 调试阶段必须要读PHY寄存器:上电后检查PHY ID(寄存器2和3)、链接状态(寄存器1的bit 2)、协商结果(寄存器5、6)
  2. 生产测试必用MDIO:写回环模式、写速率强制模式、读信号质量指示
  3. 现场故障排查:网口不通时,第一件事就是通过MDIO读寄存器,看PHY是否检测到链接、协商是否完成

我记得有一次在客户现场,设备网口时通时不通。我直接连上MDIO,读寄存器1发现link状态位在0和1之间抖动,根本不是物理层断链的问题,而是PHY的自动极性校正功能跟对端交换机的极性配置冲突。最后我通过MDIO写寄存器19关掉自动极性校正,问题消失。没有MDIO,你根本不可能快速定位这种问题。

4.5 数据接口与管理接口的独立性验证

我经常用这个方法来验证MDIO是否独立于MII/RMII工作:

测试步骤:

  1. 先确保MII/RMII数据通路正常(能Ping通或看到链路指示灯亮)
  2. 然后读PHY的寄存器0(基本控制寄存器),写出全部位然后回读,看读写一致性
  3. 如果读写的值不一致,说明MDIO有问题。但如果此时Ping依然能通,说明数据通路是好的!

反过来,我也试过:故意断开MII数据线中的某根(比如RXD[0]),Ping立刻不通,但MDIO读写全部正常。这两个接口在硬件上是完全独立的物理路径。

故障排查第一定律:MDIO故障不会导致数据中断,但数据中断可能是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的信号速率只有2.5MHz(100Mbps模式下),但它的电平精度要求很高,因为是开漏接口,噪音容限本来就低。别因为它是低速信号就忽视布局!

好了,这一章把MDIO跟MII、RMII的关系讲清楚了。核心就是两句话:数据接口变了,但管理接口不变;管理接口的排查方法完全通用。