第2章:MII接口信号定义——每个引脚的真实作用

MII接口总共就16根线,但每一根都不能乱接。我见过不少工程师把CRS和COL当成一回事,结果调试时死活不通,最后发现是半双工模式下碰撞检测对不上。所以这一章,我们就把这8组关键信号一个一个说清楚。

2.1 时钟信号:TX_CLK与RX_CLK

先说时钟。MII接口使用独立的发送和接收时钟,分别由PHY提供,这是它和RMII最大的区别。

  • TX_CLK(发送时钟):100M下频率25MHz,10M下2.5MHz。PHY持续输出这个时钟,MAC在它的上升沿发送TXD和TX_EN。
  • RX_CLK(接收时钟):同样由PHY提供,频率同上。MAC在它的上升沿采样RXD和RX_DV。
我的小经验: 以前我调试一块FPGA板,TX_CLK波形正常,但MAC死活收不到数据。后来发现是PCB上TX_CLK走线太长,相位偏了半个周期。所以强烈建议这俩时钟线尽量等长,且远离其他高速信号。

你可能要问:为什么不用同一个时钟?说白了,MII设计之初就要支持全双工,收发独立时钟才能同时跑。虽然现在PHY内部基本都用同源PLL,但协议上还是两套时钟。

2.2 数据信号:TXD[3:0]与RXD[3:0]

数据总线是4位宽的,所以叫“四比特接口”。

信号 方向 说明 100M有效数据速率
TXD[3:0] MAC → PHY 发送数据,与TX_EN同时有效 4位×25MHz = 100Mbps
RXD[3:0] PHY → MAC 接收数据,与RX_DV同时有效 同上

注意:当TX_EN为低时,TXD可以被MAC驱动为任意值,但PHY会忽略。我遇到过有的PHY对空闲时TXD的电平有要求,比如0x0才稳定。这属于芯片特性,设计前一定看对应PHY的datasheet。

重要细节: 在100M模式下,每个时钟周期传送4位数据。10M模式下,数据还是4位并行,但时钟速率低,所以总速率是10Mbps。换句话说,MII的数据位宽和时钟速率是耦合的,不能随意改变。

2.3 控制信号:TX_EN与RX_DV

这两根线分别是发送和接收的“使能信号”,是区分数据帧和空闲间隔的关键。

  • TX_EN(发送使能):MAC拉高时,表示TXD上的数据有效,PHY应该发送到介质上。在帧间间隔(IPG)中,TX_EN必须保持低电平。
  • RX_DV(接收数据有效):PHY拉高时,表示RXD上收到了有效的数据。注意:RX_DV和CRS是同时变化的吗?我后面会讲区别。
避坑指南: 我曾经在一个项目中,MAC的TX_EN在帧结束后还多拉了半个时钟周期,结果PHY认为数据还没完,把CRC校验位也当作有效数据发出去,导致对端解包失败。所以一定要严格按照时序图控制TX_EN。

2.4 载波检测信号:CRS与COL

这两个信号只用于半双工模式下的冲突检测和退避算法。

信号 行为 常见误解
CRS(载波监听) 只要介质上有活动(发送或接收),PHY就拉高 有人以为只有接收时才拉高,其实发送时也会拉高
COL(冲突检测) 当同时检测到发送和接收时拉高(即碰撞发生) 很多人把COL当成“持续高表示有冲突”,其实它只在冲突瞬间跳变

说实话,现在全双工模式已经很普遍了,CRS和COL在很多设计里直接悬空或者接地。但如果你做的是工业以太网交换机,半双工模式依然会出现,这两个信号就必须正确接上。

实战提醒: 我在调试一个半双工系统时,发现COL一直为低,但网络明显有丢包。用示波器抓了一下,发现CRS和COL的时序完全正常。最后查出来是PHY的寄存器配置把冲突检测关掉了。所以软件工程师也得懂硬件信号。

2.5 信号整体关系图

下面这张图把MII接口的8组信号按功能分组,并标明了方向。你以后看任何MII时序图,都可以拿这张图当地图对照。

MII接口信号功能分组与流向 MII 接口信号功能分组与流向 时钟组 TX_CLK (PHY→MAC) RX_CLK (PHY→MAC) 发送数据 TXD[3:0] (MAC→PHY) TX_EN (MAC→PHY) 接收数据 RXD[3:0] (PHY→MAC) RX_DV (PHY→MAC) 碰撞检测 CRS (PHY→MAC) COL (PHY→MAC) 管理接口(选读) MDC (MAC→PHY) MDIO (双向) 上升沿发送 上升沿采样 TX_EN拉高时CRS也拉高 RX_DV有效时CRS也拉高 COL = CRS(发送方向) & 介质同时接收 (仅在半双工模式有效)
图上几点要记住:
1. 所有时钟都由PHY产生,MAC只能被动接收。
2. TX_CLK和RX_CLK频率在100M时都是25MHz。
3. CRS在TX_EN或RX_DV有效时都会拉高,而COL是两者同时发生的瞬间拉高。

2.6 信号总结与个人经验

我最后给你一个速查表,下次画板子或者软件配置寄存器时,直接参考这个表格就够了。

信号 方向 100M速率 关键点
TX_CLK PHY→MAC 25MHz MAC在上升沿发送
RX_CLK PHY→MAC 25MHz MAC在上升沿采样
TXD[3:0] MAC→PHY 4位/周期 TX_EN为高时有效
TX_EN MAC→PHY — 帧开始拉高,帧结束拉低
RXD[3:0] PHY→MAC 4位/周期 RX_DV为高时有效
RX_DV PHY→MAC — 数据有效时拉高
CRS PHY→MAC — 介质活动时拉高
COL PHY→MAC — 半双工碰撞发生时拉高
再次提醒: 如果你做的是GMII或RGMII,虽然名字有相似,但时序完全两码事。MII的这些信号定义只适用于MII接口。我曾经见过有人把MII的TX_EN接到GMII的GTX_CLK上,结果烧了PHY。真的。

嗯,这一章内容差不多了。我建议你把这张信号表格截图存下来,以后画原理图或者写UVM验证环境时,随时翻阅。毕竟接口定义是基础,基础错了后面全是白费功夫。