第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时序图,都可以拿这张图当地图对照。
图上几点要记住:
1. 所有时钟都由PHY产生,MAC只能被动接收。
2. TX_CLK和RX_CLK频率在100M时都是25MHz。
3. CRS在TX_EN或RX_DV有效时都会拉高,而COL是两者同时发生的瞬间拉高。
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验证环境时,随时翻阅。毕竟接口定义是基础,基础错了后面全是白费功夫。