第2节:RGMII信号定义与引脚功能归纳总结

做RGMII时序校准,第一步不是去看寄存器手册,而是把接口上的每根信号搞明白。说白了,你连信号干什么用都不清楚,后面调延时就是在乱试。我刚开始接触RGMII的时候,就是被那几根双沿复用的线给绕晕了,后来返工重新梳理了一遍才彻底吃透。

核心原则:RGMII用4位数据线+2位控制线,在时钟双沿传输完整的数据字节和控制信息,把引脚数从25根减到了12根。付出的代价是——时序窗口只剩原来的一半。

信号分组一览

我们可以把RGMII接口分成三组:发送组、接收组、管理组。另外还有电源和复位,但那些跟时序校准关系不大,今天先放一边。

组别 信号名 方向 功能描述 双沿复用
发送组 TX_CLK MAC → PHY 125MHz参考时钟,数据在此时钟双沿采样 —
TX_CTL MAC → PHY 复用了TX_EN(上升沿)和TX_ER(下降沿) 是
TXD[3:0] MAC → PHY 4位数据总线,上升沿送低4位,下降沿送高4位 是
接收组 RX_CLK PHY → MAC PHY从线路上恢复的125MHz时钟 —
RX_CTL PHY → MAC 复用了RX_DV(上升沿)和RX_ER(下降沿) 是
RXD[3:0] PHY → MAC 4位数据总线,上升沿送低4位,下降沿送高4位 是
管理组 MDC MAC → PHY 管理时钟,通常2.5MHz(1000BASE-T) 否
MDIO 双向 管理数据线,用于读写PHY内部寄存器 否

注意这个表里我特意标了方向——你想想看,调试的时候信号方向搞反,示波器怎么量都是错的。我个人习惯在原理图上直接用颜色区分发送组和接收组,省得后面混乱。

每条信号的关键细节

TX_CLK 和 RX_CLK

这两根时钟都是125MHz,周期8ns。但时序校准关注的是相对于数据的相位关系,不是频率。RGMII规范允许MAC或PHY提供TX_CLK,但绝大多数场景下MAC输出TX_CLK给PHY。RX_CLK由PHY从接收数据中恢复出来,所以它的抖动和占空比直接影响接收侧时序。

警告:有些PHY支持TX_CLK的极性翻转(寄存器BIT),我曾在项目里不小心打开了这个开关,结果整个发送链路的数据都错位了一个周期,花了整整半天才定位到。调试前务必确认寄存器默认值。

TX_CTL 和 RX_CTL

这是个容易踩坑的信号。它的上升沿对应发送使能(TX_EN),下降沿对应发送错误(TX_ER)。MAC必须在每个时钟沿都输出有效电瓶,哪怕没有使能或错误,也要保持逻辑0。为什么?因为PHY会在下降沿采样TX_ER,如果悬空或者高阻,PHY会认为发送了错误数据。

我曾经遇到过一块MAC,在空闲时把TX_CTL拉高了,结果PHY一直报接收错误(RX_ER闪烁)。后来在PHY寄存器里看到错误计数器狂涨,排查了三天才发现是TX_CTL空闲电平的问题。

TXD[3:0] 和 RXD[3:0]

这两组4位总线是双沿传输的核心。一个字节分成两个半字节:上升沿传低4位(D[3:0]),下降沿传高4位(D[7:4])。MAC和PHY必须精确对齐这些切换点。换句话说,如果TX_CLK上升沿到TXD的skew超过约束,那低4位可能被当作高4位采样——数据全乱。

我一般会做一个简单的验证:在MAC端发送固定模式(比如0x55,即01010101),然后在PHY侧用示波器同时抓TX_CLK和TXD,看看切换沿是否对齐。如果可以读到寄存器里的接收数据,直接对比0x55也能发现问题。

MDC 和 MDIO

这两根信号虽然不涉及高速时序,但它是配置PHY内部延时的唯一通道。如果MDIO读写不稳定,后面的所有寄存器配置都是空谈。我建议调试的第一步就是验证MDIO通信:先写一个寄存器,再读回来对比。如果读写不一致,查上拉电阻、时钟极性、地址冲突。

小技巧: 很多PHY有一个“PHY ID”寄存器(地址0x02和0x03),只读。如果可以正确读出制造商ID和型号,说明MDIO链路没问题。我每次换一块PHY都会先读这个,比读其他寄存器都放心。

用一张图理清所有信号

下面这张SVG图是我自己画的结构框架,每次做新项目都会参考它来核对PCB布局。你注意看信号分组和方向,尤其是发送组和接收组是镜像对称的——理解了对称性,就理解了为什么发送端延时和接收端延时可以独立配置。

RGMII接口信号连接图 MAC (主控端) PHY (物理层) TX_CLK TX_CTL TXD[3:0] RX_CLK RX_CTL RXD[3:0] MDC MDIO 发送组(MAC→PHY) 接收组(PHY→MAC) 管理组(双向虚线)

图上每个信号都标了方向箭头,注意发送组全部指向PHY,接收组全部指向MAC,管理组是双向的。分组色块让你一眼看清哪组归哪组——调试时先锁定问题出现在发送侧还是接收侧,能节省一半的时间。

时序校准的起点

看完上面这些,你应该对RGMII的每一根信号都心里有数了。其实所有的时序问题,最终都归结为:数据在时钟沿到达时,有没有落在保持时间和建立时间窗口内。而引脚功能搞清楚之后,你才能判断是走线等长问题、还是PHY内部延时配置不对、还是MAC本身输出有问题。

我个人的经验是,先拿示波器看TX_CLK和TXD的沿对齐情况。如果MAC输出已经歪了,调PHY的延时也没用。确认MAC没问题,再动PHY寄存器里的TX delay/RX delay。下一节我们会详细看这些寄存器到底怎么配置,但前提是——你先把这章的内容印在脑子里。

常见误区: 有些工程师一上来就调PHY的“TX延时寄存器”,以为数值越大越好。实际上RGMII规范要求总延时在1.5ns~2.0ns之间(具体看规格书),并不是越大越稳。我曾经在某个项目里把TX延时设为最大值,结果没留出足够的保持时间,反而把眼图搞闭合了。

最后留个具体建议:设计阶段就在原理图上把每组信号的等长约束标清楚,发送组和接收组分别约束,等长控制在±50mil以内。这样硬件投板之后,绝大多数情况下你只需要微调PHY的延时寄存器就能满足时序。一旦超过±100mil,寄存器也很难救回来——我见过太多被迫改PCB的痛苦案例了。