RMII 接口概述与定时要求

RMII——简化媒体独立接口。说白了,就是把原来 MII 的 16 根数据线砍成 6 根,时钟也从 25MHz 提了一倍到 50MHz。我刚开始接触 RMII 时觉得挺简单,少走线嘛,布板子省事。但后来才发现,时序余量反而更紧了,稍微一点偏差就可能丢包。

这章我们先捋清楚 RMII 的信号定义和定时要求,为后面的建立保持时间计算打底。你想想看,搞不清楚接口时序,光盯着数字算,到头来还是白搭。

1.1 信号定义

RMII 一共 6 个信号(收发各两路数据线 + 控制 + 时钟),比 MII 清爽得多。下表列出了典型方向:

信号宽度方向(MAC→PHY)方向(PHY→MAC)说明
REF_CLK1——50MHz ±50ppm 参考时钟,由 PHY 或外部晶振提供
TXD[1:0]2→—发送数据,在 REF_CLK 上升沿由 MAC 驱动
TX_EN1→—发送使能,与 TXD 同步
RXD[1:0]2—→接收数据,在 REF_CLK 上升沿由 PHY 驱动
CRS_DV1—→载波侦听/数据有效,接收侧状态指示
个人习惯: 我画原理图时,TXD[1:0] 和 TX_EN 尽量等长走线,否则 REF_CLK 沿到来时数据还没稳定,建立时间就崩了。

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 发送路径时序结构

我画了一张简图,把发射侧的时序关系捋清楚。你可以对照着看后面的公式推导。

RMII 发送路径时序关系 发送路径时序(REF_CLK 与 TXD/TX_EN) t=0 tCYC=20ns 40ns TXD/TX_EN 输出 MAC 内部延迟 tCO_MAX tCO_MAX PHY 采样窗口 tSU 要求 + tH 要求 tSU tH 数据有效窗口必须完全覆盖采样窗口

从上图可以看出,MAC 把数据发出后,经过 tCO_MAX 的延迟,数据到达 PHY 引脚。PHY 在下一个时钟沿采样,它要求数据在沿前 tSU 和沿后 tH 都稳定。如果 MAC 的 tCO 太大,或者走线太长,数据的有效窗口就会右移,可能盖不住 PHY 的采样窗口。

1.5 设计中的坑与应对

我曾经踩过的坑: 某次设计用了不同批次的 PHY 和 MAC,手册上的 tCO 典型值差 1ns,但没注意最大值。结果 PCB 打样回来,高温下 PHY 的 tCO 飙到 11ns,MAC 的 tSU 要求 5ns,差一点就 hold 不住。后来增加了时钟相位微调,才勉强过关。所以永远用最大值做最坏情况分析,别信典型值。

几个实战建议:

  1. PCB 走线:REF_CLK 优先走内层、包地,避免与 TXD 长距离平行跑。我习惯在时钟线旁加一排地过孔。
  2. 查手册:把 PHY 和 MAC 的 tCO_MAX、tSU、tH 抄到一张表里,再算余量。
  3. 留余量:算出来的可用窗口至少要比要求大 1ns 才放心,不然打样回来改板子太痛苦。
  4. 仿真验证:IBIS 模型跑一遍信号完整性,看看边沿有没有过冲导致虚假触发。

1.6 本章要点

关键点说明
RMII 信号数6 根,REF_CLK 50MHz 单沿采样
周期 20nstCYC 固定,但走线延迟、抖动会吃掉余量
建立时间数据须在时钟沿前稳定,通常 2~5ns
保持时间数据须在时钟沿后保持稳定,常为 0~2ns
最坏情况分析用 tCO_MAX 和 tSU/tH 最大值,不要用典型值