
1. 从一次链路起不来说起TRL8367s与RK3588的RGMII组合到底难在哪RK3588这颗片子做网络扩展的方案里用RGMII挂一颗外置千兆交换芯片是很常见的做法TRL8367s就是被大量采用的其中一款。它的定位很清晰一颗支持多口千兆的交换芯片可以通过RGMII或者SGMII这类MAC层接口和主控对接把RK3588自带的一路GMAC扩展成多口交换能力。听起来是个标准动作但真正上手调的时候很多人会卡在同一个地方——链路协商不上、速率掉到百兆甚至十兆、ping大包丢包、跑一段时间就断。这些问题表面看是网络不通根子上往往出在RGMII的时序和硬件设计细节上。我自己在这套组合上前后折腾过好几轮从最初线接上就该通的天真想法到后来拿着示波器一个引脚一个引脚量延时中间踩的坑足够写一篇长文。这篇就把TRL8367s和RK3588之间RGMII信号调试的完整经验梳理出来重点讲清楚三件事RGMII这个接口在千兆速率下到底对时序有多敏感、TRL8367s这颗芯片在配置上有哪些容易忽略的开关、以及当链路异常时应该按什么顺序去排查。适合正在做RK3588网络扩展、或者已经画好板子但调不通的硬件和驱动工程师参考也适合想提前避坑、在原理图阶段就把问题掐掉的方案设计者。需要先说明一点RGMII在百兆和千兆下的行为差异非常大。百兆时时钟只有25MHz时序余量宽松很多设计随便连连也能通一旦切到千兆时钟拉到125MHz周期只有8ns建立和保持窗口被压缩到纳秒级这时候PCB走线长度、芯片内部延时、时钟采样边沿这些因素全部开始起作用。所以下面所有的讨论默认前提都是目标跑千兆百兆能通不代表设计没问题。2. RGMII接口在千兆速率下的时序账得先算明白2.1 RGMII为什么要在时钟上下双沿做文章RGMII全称Reduced Gigabit Media Independent Interface是GMII的精简版。GMII用8根数据线加一堆控制线引脚太多RGMII把它砍到4根数据线代价是数据要在时钟的上升沿和下降沿都传——上升沿传低4位下降沿传高4位一个时钟周期传8位。千兆下时钟125MHz双沿采样等效250Mbps每根线4根线正好1Gbps账是这么算平的。这个双沿传输就是所有时序问题的根源。单沿采样时你只要保证数据在时钟某个边沿前后稳定就行双沿采样时上升沿和下降沿都要采两个边沿之间的间隔只有半个周期千兆下就是4ns。数据从发送端出来、经过PCB、到达接收端这个飞行时间如果没控制好很容易让某一个边沿踩在数据跳变区上采到错误的值。2.2 建立保持窗口到底剩多少余量RGMII规范里对发送端有个明确要求数据要在时钟边沿之前稳定一段时间建立时间边沿之后继续保持一段时间保持时间。业界通用的做法是让发送端把数据和时钟做一个约2ns的偏移也就是所谓的时钟延迟或数据延迟模式让接收端能在数据眼图的正中间采样。我实际算过一笔账千兆下时钟周期8ns理想情况下数据眼图张开约8ns扣除发送端抖动、PCB偏斜、接收端采样窗口真正能用的余量可能只剩1到2ns。这意味着PCB上时钟线和数据线的长度差如果超过某个阈值余量就被吃光了。按常见的FR4板材、信号传播速度约6英寸每纳秒来估算1ns对应大约15厘米的走线长度差——听起来很宽松但别忘了这是总预算要分给时钟线本身、4根数据线之间的偏斜、以及连接器和过孔的寄生参数。提示很多调试卡壳的板子问题不是出在差得离谱而是差了几百皮秒百兆看不出来千兆就间歇性丢包。这种问题最难查因为它是概率性的。2.3 时钟到底由谁提供这个选择决定了后面所有配置RGMII的时钟方向有两种模式一种是MAC也就是RK3588提供TX时钟给PHY/交换芯片RX时钟由对端提供另一种是芯片内部做时钟环回。TRL8367s这类交换芯片通常支持配置时钟来源RK3588的GMAC也有对应的时钟输出能力。这里最容易踩的坑是两边都以为对方在提供时钟结果谁都没输出链路自然起不来或者两边都输出时钟打架。我的建议是在原理图阶段就把时钟方向定死并且明确写进设计文档。通常做法是让RK3588的GMAC输出TX时钟TRL8367s接收并据此发送RX时钟回来。这样时钟的源头单一时序分析也好做。如果选反了或者用了内部环回但配置没对上后面调起来会非常痛苦因为你会怀疑是硬件问题还是配置问题而这两者的排查手段完全不同。3. TRL8367s这颗交换芯片配置上有几个默认值陷阱3.1 上电默认模式和寄存器配置的优先级TRL8367s上电后会根据若干strap引脚的电平决定初始工作模式比如接口类型是RGMII还是SGMII、时钟是内部产生还是外部输入、PHY地址是多少。这些strap引脚在复位释放的瞬间被采样之后就不再影响。问题在于很多板子设计时把这些引脚悬空或者随便拉导致芯片进入了一个能用但不是你要的模式然后你在驱动里拼命写寄存器却发现某些配置被硬件strap锁死了写不进去。我遇到过一次典型情况strap把接口配成了SGMII模式但硬件实际走的是RGMII结果就是链路完全不通量波形发现TX时钟有、数据线没动静。查了半天寄存器手册才发现是strap的问题。所以第一件事永远是对照数据手册把每一个strap引脚的实际电平确认一遍别信默认应该是对的。3.2 内部延时Internal Delay这个开关必须两边对齐RGMII的时序调整核心就是谁来做延时。常见的有三种组合MAC侧加延时、PHY侧加延时、两边都不加靠PCB走线自然延时。TRL8367s内部有可配置的TX/RX延时单元RK3588的GMAC驱动里也有对应的延时配置项。这两个配置必须匹配否则时序窗口就偏了。举个具体的如果RK3588侧配置了TX延时2ns而TRL8367s侧也开了TX延时那总延时就是4ns可能直接让数据踩到下一个时钟边沿上。反过来如果两边都不开而PCB走线又是等长的那采样点就落在数据跳变区同样出错。我的经验是优先让一侧做延时另一侧保持直通然后通过实测眼图微调。具体选哪一侧取决于哪边的配置更灵活、更容易在驱动里改。3.3 自协商和强制模式的取舍千兆链路协商涉及自协商Auto-Negotiation过程。TRL8367s的每个端口可以配置成自协商或者强制速率。调试阶段我强烈建议先强制成1000M全双工把自协商这个变量排除掉。因为自协商本身依赖链路质量如果时序刚好卡在边缘自协商可能协商出一个低速率让你误以为是协商问题而不是时序问题。等强制千兆能稳定跑通了再打开自协商验证。如果强制能通、自协商不通那问题就在协商相关的寄存器配置或者链路质量上排查方向就清晰了。这个先强制后协商的顺序能帮你省下大量来回试的时间。4. 硬件设计阶段就该盯死的几个细节4.1 走线等长不是差不多就行前面算过千兆下时序余量只有1到2ns。RGMII的TX组和RX组要分别做等长组内时钟线和数据线的长度差建议控制在5mil以内严格一点可以做到2mil。注意是组内TX组和RX组之间不需要等长因为它们各自有独立的时钟。我见过一些板子数据线做了等长但时钟线忘了算进去结果时钟比数据短了一大截采样点直接偏出窗口。还有的把RGMII线和别的信号比如USB、PCIe走在一起串扰把眼图糊掉了。RGMII虽然是低速接口但在千兆下它的边沿速率并不慢串扰和反射一样会要命。4.2 串联端接电阻的位置和阻值RGMII的发送端通常会串一个电阻做端接常见阻值22欧到33欧。这个电阻的作用是匹配驱动阻抗、抑制反射。位置很关键要尽量靠近发送端引脚越近越好。如果放得离发送端很远那这段走线本身就成了一个 stub反射照样发生。阻值的选择要看实际驱动能力和走线阻抗。走线按50欧姆设计的话串阻一般取22到33欧。如果发现过冲严重可以适当加大如果边沿太缓、上升时间不够就减小。这个值最好在打板后用示波器实测调整不要照抄参考设计——参考设计的叠层和你的可能不一样。4.3 电源和地的处理别偷懒TRL8367s的模拟电源和数字电源要分开处理去耦电容要按手册推荐放足。RGMII的IO电源电压要和RK3588侧的GMAC IO电压一致这个如果搞错轻则电平不匹配、重则烧引脚。我见过把1.8V和3.3V搞混的板子上电后链路时通时不通查了很久才发现是IO电压不匹配导致电平判决在临界点。5. 链路异常时的排查链路按这个顺序走5.1 第一步永远是量时钟链路不通先别急着看寄存器。拿示波器带宽至少500MHz探头用低电容的量TX时钟和RX时钟。确认三件事时钟有没有、频率对不对千兆应该是125MHz、幅度和波形质量如何。如果时钟都没有那问题在时钟源配置或者硬件连接上跟数据时序无关。量时钟的时候要注意探头负载效应。普通无源探头电容有十几皮法搭在125MHz时钟上可能把波形拉变形让你误判。有条件的话用有源探头或者至少用探头自带的短地线弹簧别用那根长长的鳄鱼夹地线。5.2 时钟正常了再看数据眼图时钟没问题就量数据线。触发在时钟上看数据相对时钟的位置。理想情况下数据跳变应该发生在时钟边沿的中间采样点落在数据眼图正中。如果数据跳变离时钟边沿太近说明延时配置不对需要调整内部延时或者检查走线。这一步最好用示波器的眼图功能或者至少用余辉模式多看几秒把抖动和偏斜都看进去。单次触发看到的波形可能是碰巧好的余辉模式才能暴露间歇性问题。5.3 波形没问题但链路还是不通去查寄存器和驱动如果时钟和数据波形都正常链路还是起不来那问题大概率在配置层。这时候按这个顺序查先确认strap引脚电平对不对再读TRL8367s的关键寄存器看接口模式、速率、双工状态然后看RK3588侧GMAC驱动的延时配置和时钟配置。很多时候是驱动里的设备树节点写错了比如时钟频率、延时参数、PHY地址对不上。我建议在驱动里加一些打印把协商结果、链路状态、错误计数都打出来。Linux下可以用ethtool看链路状态和统计ethtool -S能看到很多底层计数比如CRC错误、对齐错误这些计数能直接告诉你问题是出在发送还是接收方向。5.4 间歇性丢包怎么定位最烦的是能通但丢包。这种情况通常是时序余量不够处在临界状态。定位方法是先跑长时间ping大包比如ping -s 1472 -f看丢包率然后用示波器长时间监测眼图看有没有偶发的时序偏移再结合ethtool的错误计数看错误是集中在某个方向还是双向都有。如果错误集中在接收方向重点查RX组的走线和延时如果双向都有可能是时钟本身的问题比如时钟抖动太大或者电源噪声耦合进来了。6. 几个我实际踩过的坑和对应的解法6.1 百兆能通千兆不通别怀疑芯片坏了这个现象太常见了几乎每个调RGMII的人都遇到过。原因就是前面说的百兆时序宽松千兆时序紧张。这时候不要急着换芯片先按第5节的顺序量波形。十有八九是延时配置或者走线偏斜的问题。我自己的板子第一次就是RX组少配了延时百兆跑得好好的千兆一开就丢包加上延时后立刻稳定。6.2 设备树里的延时参数单位容易搞错RK3588的GMAC驱动里延时参数有的是以皮秒为单位有的是以某个内部步进为单位不同内核版本还不一样。我吃过一次亏照着旧版本文档填了个值结果实际延时差了好几倍链路直接不通。后来是翻驱动源码里的宏定义才确认单位。所以填这类参数前一定去核对当前内核版本对应的驱动源码别信网上抄来的配置。6.3 交换芯片的端口和MAC的对应关系要理清TRL8367s是多口交换芯片RK3588通过RGMII连的是其中一个内部端口或者CPU端口。这个端口的编号、它和外部物理端口的映射关系在配置的时候要搞清楚。我有一次把CPU端口配错了导致外部端口能互相通信但就是上不了CPU表现就是局域网内通、出不去。这种问题查起来很绕因为链路本身是好的问题在交换逻辑上。6.4 复位时序和上电顺序别忽略TRL8367s的复位引脚要保持足够长的低电平等电源稳定后再释放。如果复位释放太早芯片可能进入未定义状态。RK3588这边也有上电时序要求。我遇到过一块板子复位电路用的是简单的RC结果上电慢的时候复位释放时机不对十次有两次起不来。后来改成用GPIO控制复位等系统起来后再释放问题就没了。7. 把经验固化成检查清单下次直接照着走调通之后我整理了一份检查清单新板子bringup的时候按这个顺序过一遍能省很多时间。硬件阶段确认strap电平、确认IO电压匹配、确认走线等长和端接电阻位置、确认复位和时钟设计。软件阶段确认设备树时钟和延时配置、确认驱动版本对应的参数单位、先强制千兆再开自协商、用ethtool和示波器交叉验证。这套组合本身不复杂难的是细节多、每个细节都可能成为卡点。RGMII这个接口的设计哲学就是用最少的引脚换最高的速率代价就是把时序压力全压给了硬件设计和配置对齐。理解了这一点再回头看那些莫名其妙不通的现象其实都有迹可循。最后分享一个我个人的习惯每次调通一个RGMII链路我都会把当时的示波器眼图、寄存器配置、设备树参数截图存档。下次遇到类似问题先翻存档对比往往一眼就能看出差异在哪。这个习惯帮我省下的时间比任何调试技巧都多。