RMII 接口概述与定时要求
RMII——简化媒体独立接口。说白了,就是把原来 MII 的 16 根数据线砍成 6 根,时钟也从 25MHz 提了一倍到 50MHz。我刚开始接触 RMII 时觉得挺简单,少走线嘛,布板子省事。但后来才发现,时序余量反而更紧了,稍微一点偏差就可能丢包。
这章我们先捋清楚 RMII 的信号定义和定时要求,为后面的建立保持时间计算打底。你想想看,搞不清楚接口时序,光盯着数字算,到头来还是白搭。
1.1 信号定义
RMII 一共 6 个信号(收发各两路数据线 + 控制 + 时钟),比 MII 清爽得多。下表列出了典型方向:
| 信号 | 宽度 | 方向(MAC→PHY) | 方向(PHY→MAC) | 说明 |
|---|---|---|---|---|
| REF_CLK | 1 | — | — | 50MHz ±50ppm 参考时钟,由 PHY 或外部晶振提供 |
| TXD[1:0] | 2 | → | — | 发送数据,在 REF_CLK 上升沿由 MAC 驱动 |
| TX_EN | 1 | → | — | 发送使能,与 TXD 同步 |
| RXD[1:0] | 2 | — | → | 接收数据,在 REF_CLK 上升沿由 PHY 驱动 |
| CRS_DV | 1 | — | → | 载波侦听/数据有效,接收侧状态指示 |
1.2 时钟与数据的关系
REF_CLK 是 50MHz 单沿时钟,所有数据信号都在上升沿采样。这意味着一个周期只有 20ns。我之前遇到过一个项目,PHY 手册写 tCO(时钟到输出)最大 10ns,MAC 的 tSU 要求 5ns,留的余量也就 5ns,还不算 PCB 走线延迟和抖动。你说紧不紧?
标准的定时参数包括:
- tCYC — 时钟周期,50MHz 下为 20ns。
- tCO_MAX — 时钟上升沿到数据/控制输出的最大延迟。
- tSU — 接收端要求的建立时间。
- tH — 接收端要求的保持时间。
- tSKEW — 同一组信号之间的时滞。
嗯,这里要注意:很多工程师只盯着 tSU 和 tH,忽略了信号之间的 skew。我曾经碰到过 TXD[0] 和 TXD[1] 差了几纳秒,直接导致 PHY 解码出错,抓包全是 CRC 错误。
1.3 建立时间与保持时间的概念
说白了,建立时间就是数据必须在时钟沿 之前 稳定的最小时长;保持时间就是数据必须在时钟沿 之后 继续稳定的最小时长。RMII 里这两个值通常在 2~5ns 之间,具体查 PHY 和 MAC 的 datasheet。
我通常把计算式写得很简单:
发射侧提供:
可用建立时间 = tCYC - tCO_MAX - tSKEW
可用保持时间 = tCO_MIN + tSKEW (tCO_MIN 常为 0)
接收侧要求:
tSU_REQ + tH_REQ
只要 可用 > 要求,就 OK。
1.4 发送路径时序结构
我画了一张简图,把发射侧的时序关系捋清楚。你可以对照着看后面的公式推导。
从上图可以看出,MAC 把数据发出后,经过 tCO_MAX 的延迟,数据到达 PHY 引脚。PHY 在下一个时钟沿采样,它要求数据在沿前 tSU 和沿后 tH 都稳定。如果 MAC 的 tCO 太大,或者走线太长,数据的有效窗口就会右移,可能盖不住 PHY 的采样窗口。
1.5 设计中的坑与应对
几个实战建议:
- PCB 走线:REF_CLK 优先走内层、包地,避免与 TXD 长距离平行跑。我习惯在时钟线旁加一排地过孔。
- 查手册:把 PHY 和 MAC 的 tCO_MAX、tSU、tH 抄到一张表里,再算余量。
- 留余量:算出来的可用窗口至少要比要求大 1ns 才放心,不然打样回来改板子太痛苦。
- 仿真验证:IBIS 模型跑一遍信号完整性,看看边沿有没有过冲导致虚假触发。
1.6 本章要点
| 关键点 | 说明 |
|---|---|
| RMII 信号数 | 6 根,REF_CLK 50MHz 单沿采样 |
| 周期 20ns | tCYC 固定,但走线延迟、抖动会吃掉余量 |
| 建立时间 | 数据须在时钟沿前稳定,通常 2~5ns |
| 保持时间 | 数据须在时钟沿后保持稳定,常为 0~2ns |
| 最坏情况分析 | 用 tCO_MAX 和 tSU/tH 最大值,不要用典型值 |