第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布局。你注意看信号分组和方向,尤其是发送组和接收组是镜像对称的——理解了对称性,就理解了为什么发送端延时和接收端延时可以独立配置。
图上每个信号都标了方向箭头,注意发送组全部指向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的痛苦案例了。