以太网传输硬件设计实战:从MAC到PHY的链路解析与调试指南

发布时间:2026/10/8 1:32:55
以太网传输硬件设计实战:从MAC到PHY的链路解析与调试指南 做以太网传输硬件设计这几年我最大的体会是很多人把这件事想小了。以为只要把一颗PHY芯片往板子上贴RJ45座子一连固件一跑网络自然就通了。真开始做才发现从MAC到PHY从变压器到连接器每一级都在啃信号完整性、时钟同步、电源噪声这些基本功。以太网硬件设计真正的难点不在哪颗芯片更高级而在整条链路在PCB上能不能跑出该有的质量。这篇文章我就把整条链路拆开讲从接口选型、PHY芯片选择到原理图细节、PCB布局布线再到STM32、FPGA和车载以太网场景下的落地方法最后附上我实际调试中遇到的高频问题和排查思路。内容主要覆盖10/100/1000M级别这套方法论往上延伸到25G/100G SerDes场景也同样适用。1. 链路拆解从RJ45到MAC数据到底走过了什么1.1 一条标准的以太网传输链路包含哪些环节常见的百兆或千兆以太网数据从CPU出发到网线中间要经过MAC、接口总线、PHY、隔离变压器、RJ45连接器这几个环节。以发送方向为例CPU产生数据MAC负责组帧填充MAC地址、类型长度、FCS校验然后通过MII/RMII/RGMII这类接口把并行数据交给PHYPHY内部完成编码、扰码、并串转换最后经差分线驱动到隔离变压器再由连接器送上网线。很多人以为PHY就是把电平转一下但实际上PHY承担的工作比这复杂得多。以千兆为例PHY内部要做8B/10B编码或者更准确的PCS层处理、自适应均衡、回声消除、基线漂移补偿还要完成自动协商。硬件工程师如果不懂PHY内部这些处理逻辑就很难理解为什么差分走线长度差几毫米就会导致丢包。我用一个生活化类比来解释MAC像分拣中心负责把包裹按规则打包贴单PHY像装卸工负责把包裹搬到对应的运输车上隔离变压器像安检门隔离掉不该进来的共模干扰双绞线就是公路。包裹能不能准时到达既取决于分拣规则也取决于路上跑得稳不稳。1.2 每个环节失效的症状是什么链路中任何一个环节出问题表现可能完全不一样。MAC配置错了最常见的现象是ping不通但LED灯可能正常闪烁PHY自协商失败表现为网口灯不亮或者协商速率一直跌变压器中心抽头接错轻则丢包重则完全不通连接器虚焊、差分走线跨分割可能表现为低速能通、高速千兆就不稳定。这就引出硬件设计里一个很重要的理念出现问题时要能快速定位到哪一层。所以我建议从一开始就把链路分层去看MAC层管帧、PHY层管物理信号、变压器和连接器管电气隔离与机械连接。每一层的调试手段不一样MAC层用逻辑分析仪、寄存器查询、抓包工具PHY层用示波器测差分波形、看眼图变压器和连接器则更多靠万用表、TDR和视觉检查。2. PHY和MAC怎么搭接口选型与芯片选择的实战对比2.1 主流PHY芯片怎么选现在市面上常见的以太网PHY芯片不同场景有不同选择。我这里列一个选型参考表都是我用过或者周围同行用得多的型号芯片常用接口速率典型封装适用场景LAN8720ARMII10/100MQFN24STM32等MCU低成本百兆DP83848MII/RMII10/100MLQFP48工业控制老牌稳定KSZ9031RGMII10/100/1000MQFN48千兆工业板、核心板RTL8211FRGMII/SGMII10/100/1000MQFN40网卡板、交换机、嵌入式88E1512RGMII/SGMII10/100/1000MQFN56企业级、功能丰富88Q2112取决于MAC接口车载100BASE-T1QFN48车载以太网PHY选型时除了看速率和价格一定要看三样东西接口电平、工作温度和是否容易买到。接口电平决定能不能直接和MCU/FPGA的IO电平匹配工作温度决定能不能过工业级认证供货则是量产之后最大的变量。有些芯片看起来参数很好但交期长、参考设计不完整反而把项目拖垮。2.2 MII、RMII、RGMII、SGMII到底怎么选MAC和PHY之间的接口是原理图设计首先要定的事。MII接口引脚多17根信号线百兆下时钟25MHz优点是时序余量大、老芯片兼容好缺点是占IO太多现在MCU方案基本不推荐。RMII把信号线压缩到7根左右时钟固定50MHz但要求MAC和PHY的50MHz参考时钟必须同源否则收发容易失步这是新手最容易踩的坑。千兆场景基本绕不开RGMII。RGMII用DDR双沿采样时钟125MHz在上升沿和下降沿各有4位数据信号线数量不多但时序要求高。RGMII的发送时序有一个关键点数据是相对时钟中心对齐的也就是说时钟沿在数据窗口中间而不是边沿对齐。到了RGMII 2.0规范MAC侧还要为TX数据提供额外的延迟PCB上也要格外注意时钟和数据的等长关系。如果是FPGA、交换芯片或者高速处理器内部自带SerDes那么SGMII接口更常见。SGMII本质是1.25Gbps的串行差分对外部走线简单但MAC内部或外置芯片通常集成了PCS层设计时偏重SerDes的交流耦合电容和阻抗控制。有些项目里MAC端直接出SGMII接光模块或者铜缆硬件实现比RGMII更干净。我个人的选型习惯是百兆MCU优先RMII千兆MCU/FPGA优先RGMII涉及背板或高速交换优先SGMII。这个顺序不是绝对的但大概率不会错。2.3 时钟和复位的细节很多人第一步就错时钟是PHY设计的生命线。百兆RMII场景PHY通常需要25MHz晶振内部PLL倍频到50MHz给RMII用但很多MCU的RMII接口要求外部直接给50MHz参考时钟。这时候就出现两种接法一种由MCU的MCO引脚输出50MHz给PHY另一种用独立有源晶振同时给两边。实测下来由MCU统一提供50MHz时钟通常更稳因为RMII要求MAC和PHY的REF_CLK同源独立晶振如果两路时钟偏差稍大百兆链路就可能出现偶发CRC错误。复位设计也常被忽略。PHY的复位脉冲宽度、复位释放时时钟是否已经稳定都有讲究。很多PHY手册要求时钟稳定后再释放复位否则内部PLL锁定状态不确定表现为上电后有时候能link有时候不能link。我之前在批量产线上遇到过一批板子10%link失败查到最后就是复位RC时间常数不够系统上电后PHY还在复位态CPU已经去读PHY寄存器了自然读不到ID。后来改成专用复位芯片加延时问题才彻底解决。晶振选型也有讲究。无源晶振要匹配负载电容不能随手放两个22pF要看PHY数据手册要求的CL值。有源晶振则要注意供电电压是3.3V还是2.5V电平不匹配可能导致时钟幅度不足。3. 从原理图到PCB信号完整性才是大头3.1 隔离变压器和连接器怎么接标准以太网PHY的输出是差分信号直接连网线是不行的必须经过隔离变压器。隔离变压器的作用有三个提供共模隔离、完成电平匹配、在一定程度上抑制共模干扰。家用路由器里常见的做法是把变压器集成到RJ45座里座子自带的LED指示灯能省不少事。但工业级或者需要过认证的板子我一般用独立网络变压器加连接器这样便于选更高级别的变压器也方便散热和返修。原理图设计时要注意变压器中心抽头怎么接。不同PHY要求不一样有的中心抽头要接电源比如3.3V或2.5V有的要接电容到地。接到哪一侧、电压多少必须以PHY手册为准。我见过有工程师想当然把中心抽头统统接VCC结果某些PHY的共模输出直接异常信号发不出去。RJ45连接器侧还有Bob Smith端接的细节。很多集成RJ45座内部已经做了端接方案但如果用普通RJ45座加独立变压器就需要自己加端接电阻和电容通常是在差分对之间和到地之间接一个特殊阻容网络用来匹配线缆的共模阻抗。这个网络取值可以参考IEEE规范或变压器厂商的参考设计别自己拍脑袋改。3.2 差分对的布局布线原则以太网差分对的PCB设计要求说到底就一句话保证100欧姆差分阻抗走线连续、对称、少过孔。FR4四层板常规叠层下100欧姆差分线大概是外层线宽5-7mil、间距6-8mil但具体数值必须根据叠层用阻抗计算工具算不能照抄别人的板子。层叠不同线宽差异很大。差分对内等长是必须的对外等长在千兆场景也建议做。百兆对等长要求相对宽松千兆RGMII的时钟频率已经不低再加上PHY内部处理对外部走线长度差会更敏感。具体等长约束以芯片手册建议为准一般控制在一对线内部差距5-10mil以内整体走线尽量短。还要特别注意差分对不能跨越分割的地平面。如果底层或者第三层的地被割裂成不同区域差分返回电流就得绕路等效于在走线上串了电感高速信号质量会明显下降。正确的做法是走线区域下方保持完整参考地。如果实在跨了至少要保证旁边有就近的通孔和足够宽的返回路径。从PHY到变压器的走线要尽量短变压器到RJ45座之间的走线反而可以稍长因为这段已经是隔离后的次级信号。但连接器外壳接地要做扎实RJ45的金属外壳最好通过多个通孔连接到机壳地必要时加高压电容跨接在两地之间。3.3 电源、地平面、EMI屏蔽的配合PHY芯片一般有数字电源和模拟电源有些还有IO电源。数字电源纹波噪声会通过内部耦合影响模拟部分进而影响信号质量。常规做法是用磁珠把数字电源和模拟电源隔开每种电源在引脚附近放足够多的去耦电容容值从小到大组合。去耦电容的位置原则是离电源引脚越近越好FPGA这类BGA封装的PHY背面尤其要放满电容。整板电源分配也要考虑峰值电流。千兆PHY工作在125MHz DDR模式功耗并不低如果LDO或DC-DC余量不足遇到大流量收发时电源电压跌落就会产生偶发丢包。这个现象很隐蔽因为静态测试看不出问题跑流量才暴露。EMI方面差分走线本身有天然的共模抑制能力但变压器初级侧如果有较大共模噪声还是会通过网线辐射出去。除了尽量缩短走线、保证地平面连续还可以在PHY和变压器之间预留共模扼流圈的位置。注意共模扼流圈并不是所有设计都必须加加了会引入一点插入损耗需要看产品是否需要过严格的EMC标准。4. 典型平台实操STM32、FPGA和车载以太网怎么落地4.1 STM32 RMII加LAN8720的最小系统STM32做以太网最经典的方案是F407/H743配LAN8720A走RMII接口。硬件连接上STM32的ETH_RMII_TXD0、ETH_RMII_TXD1、ETH_RMII_TX_EN、ETH_RMII_RXD0、ETH_RMII_RXD1、ETH_RMII_CRS_DV分别对应PHY的TXD0、TXD1、TX_EN、RXD0、RXD1、CRS_DV另外MDC和MDIO用于读写PHY寄存器REF_CLK最好由STM32的MCO输出50MHz供给LAN8720。LAN8720的PHY地址由AD0引脚决定上电时它作为strap引脚被采样硬件上要么拉高要么拉低。很多参考设计把AD0拉低PHY地址就是0x00如果拉高则是0x01。这个地址必须和软件配置一致否则MDIO读写不成功。还有一个引脚REGOFF用来控制内部1.2V稳压器一定不能悬空乱接按手册来。LAN8720的nINT/RMII引脚复用了RD2如果不小心当成普通GPIO控制可能会干扰数据。软件层面STM32CubeMX生成代码后主要做两件事初始化RMII和配置PHY的自动协商。自动协商开启后PHY会自动侦测对端速率和双工模式正常情况下灯亮、link up。我刚开始调的时候习惯先把PHY的Basic Mode Control Register读出来确认自协商状态位已经置位然后看是否得到100M全双工的结果。这样能最快区分是硬件link问题还是软件协议栈问题。4.2 FPGA三速以太网Vivado配置与约束FPGA做以太网比MCU灵活但工作量也大很多。Xilinx平台常用1G/2.5G Ethernet MAC IP选择RGMII接口时数据是DDR形式外部管脚需要ODDR原语或者把接口配置为SDR模式由FPGA处理。如果是10G/25G级别已经不走RGMII而是直接SerDes接光模块或高速PHY这部分更偏高速串行设计。用Vivado搭三速以太网时IP配置里要注意几点MAC地址可以设为全F或者指定测试地址帧过滤可以先关掉避免调试时被过滤规则挡住。三速以太网的时钟比较复杂1000M时GTX_CLK是125MHz100M时是25MHz由IP内部或外部时钟逻辑切换。FPGA工程里要针对不同速率做时钟约束最直接的做法是先约束125MHz低速时再补充。约束文件里典型内容是设置RGMII引脚位置、创建125MHz时钟周期约束。设置引脚位置set_property PACKAGE_PIN AB16 [get_ports rgmii_rd[0]]创建时钟create_clock -period 8.000 -name gtx_clk [get_ports gtx_clk]如果RGMII数据时序不满足通常用IDELAY做微调。实测中常见问题是PCB走线差异导致某几根数据线建立保持时间不够这时候在逻辑里对RGMII RX数据加入可调延迟并对不同延迟值做遍历测试找到眼图张得最开的窗口。FPGA调试还有一个价值可以直接用ILA观察MAC接口的内部信号比如发送帧的前导码、目的MAC、帧长、CRC是否正常。配合Wireshark抓包能非常快速定位问题时序在MAC还是PHY。比如ILA显示TX端CRC计算有误那问题就在FPGA逻辑如果ILA数据正确但PC网卡收到的包有FCS错误那才怀疑PHY或PCB。4.3 车载以太网100BASE-T1和普通以太网的本质差别车载以太网是这几年很火的方向和传统以太网差别不小。普通百兆以太网100BASE-TX用两对双绞线一对发一对收基于三电平MLT-3编码车载以太网100BASE-T1只用一对非屏蔽双绞线全双工通信靠回声抵消实现编码采用PAM3。这意味着数据在单对线上同时收发物理层复杂度比传统百兆高很多。硬件设计的差别首先体现在变压器上。传统以太网用隔离变压器车载以太网因为要节省空间和线束重量通常不用标准隔离变压器而是用共模扼流圈配合直流去耦电容实现共模抑制和信号耦合。实际车载PHY的参考设计里那一段模拟前端电路的阻容取值都是有讲究的直接照抄传统RJ45设计肯定不行。车载以太网设计还要格外关注电源和地。车内环境EMC恶劣12V蓄电池供电会有大量瞬态干扰电源设计必须考虑反接、浪涌、抛负载等工况。PCB布局时PHY的模拟电源要从系统的模拟电源域取电不要直接挂在数字大电流上去。线束端还要考虑屏蔽和连接器选型100BASE-T1的连接器很多就是专用的单对连接器和RJ45完全不是一个东西。软件配置上车载以太网PHY通常支持更丰富的诊断功能包括链路质量监测、电压电流监测、线缆开路短路检测。这在整车诊断里特别重要硬件设计时要把这些引脚引出来方便产线和售后调试。5. 调试工具与方法让不通变成能跑5.1 从链路层到协议栈的排查顺序板子贴出来上电第一件事不是跑协议栈而是按顺序确认电源、时钟、复位、PHY寄存器、链路状态。电源用万用表量各路电压是否在误差范围内时钟用示波器看PHY的晶振或参考时钟频率和幅度复位引脚电平在上电后是否稳定拉高。这些基本功检查完再上软件。确认PHY能读写后要看PHY的基础状态寄存器。百兆/千兆PHY的地址不一定相同以具体手册为准。重点关注自协商完成位、link状态、实际协商速率和双工模式。如果一直在协商中先怀疑时钟、差分走线和变压器端接不要急着改软件。当PHY报link up但仍然ping不通时就要往MAC侧走。STM32平台先看DMA描述符状态丢包时RX描述符有没有被正确释放FPGA平台用ILA抓MAC接口的信号确认有没有帧进来、帧长度是否正常、CRC是否正确。如果MAC这边都是好的再回到软件协议栈检查IP地址、子网掩码、网关配置。5.2 ethtool、Wireshark和抓包技巧Linux平台下调试以太网非常顺手。ethtool eth0能看到速度和自协商状态ethtool -S eth0还能看收发的统计计数。很多硬件问题会先在统计计数里暴露出来比如rx_crc_errors持续增加说明物理层信号质量有问题tx_dropped增加说明MAC侧缓冲或DMA出了问题。抓包是判断问题层级最好的手段。用Wireshark抓包时如果能看到对端发来的ARP请求但回复石沉大海问题多半在自己发送方向如果连对端发的包都抓不到问题在物理层或者PHY/MAC配置。抓包时还可以看以太网帧头部的字段比如目的MAC、源MAC、类型长度字段是否正常Wireshark里还能直接看到FCS校验字段虽然很多网卡驱动会剥掉FCS但FPGA抓包工具里能看到原始帧。Linux下还有一个很好用的回环测试思路先把PHY配置成内部回环或者把MAC层面做成loopback用来区分问题在MAC内部还是外部链路。具体命令不一定每个平台一样但思路是通用的。如果PHY内部回环能通说明PHY和MAC接口没问题再查变压器和线缆侧如果回环都不通先查MAC配置和RGMII时序。6. 常见问题速查表与避坑总结6.1 高频问题的原因和对策现象可能原因排查方法网口灯亮但ping不通IP配置错误、MAC过滤、PHY协商异常检查PHY寄存器、抓包、查ARP回复能ping通但大包丢包MTU问题、缓冲不足、电源噪声减小MTU测试、看统计计数、量电源纹波协商只能到百兆RGMII时序、差分走线质量、PHY strap配置错误看寄存器、量RGMII波形、检查strap引脚上电偶发link失败复位时序不够、时钟未稳定测量复位和时钟时序增加复位延时PHY发热严重电源电压异常、PCB散热不足量各路电源、检查PCB铺铜和散热焊盘静电或雷击后PHY损坏TVS保护不够、外壳接地不良检查ESD防护器件、RJ45外壳接地设计千兆眼图差差分走线跨分割、阻抗不连续TDR测量、调整走线、检查参考地平面这类问题最怕的不是难找而是没有方法。我的习惯是先把问题分类到上电阶段链路阶段流量阶段三个区间每个区间只做对应的检查。上电阶段看电源时钟复位链路阶段看自协商和LED状态流量阶段看收发计数和抓包结果。6.2 几个真正的血泪教训第一个教训是关于PHY的strap引脚。PHY很多功能引脚在复位释放时会作为配置采样输入比如PHY地址、接口模式、速率档位。如果在原理图阶段没仔细看手册这些引脚只是随便上下拉或者直接悬空那上电后的PHY工作模式可能根本不是软件预期。我曾经遇到一块板子无论怎么写寄存器都只能工作在10M半双工查了好久才发现是接口模式strap引脚被外部电阻拉到了错误配置位。第二个教训是RGMII的时钟相位。RGMII接口的数据不是简单地和时钟沿对齐而是中心对齐。在FPGA里做约束时经常需要IDELAY和ODDR配合才能满足PHY的建立保持时间要求。示波器上看到的时钟和数据波形如果只是边沿对齐其实可能完全不符合RGMII规范必须按手册时序来做延迟调整。第三个教训是变压器中心抽头不能乱接。有些PHY要求在发送端通过中心抽头给一个特定共模电压有些PHY则要求直接接RC到地。这个值错了链路可能时通时断而且用示波器看差分波形时很难察觉必须回手册去确认。第四个教训跟测试环境有关。低速率测试时劣质网线和过长网线不一定能暴露问题但千兆对线缆要求高得多。有时候硬件板子没问题是手边那根网线是百兆线序或者接触不良导致怎么调都不稳定。我后来专门在调试桌上备了标准Cat6线所有怀疑链路的测试都用它排除线缆变量。做以太网硬件设计这几年我最深的感受是原理图可以很快画完但真正决定项目成败的往往是那些看起来不起眼的细节。时钟同源有没有做到、复位时序够不够、差分走线有没有跨分割、strap引脚有没有按手册设置每一个细节都会在量产的某个阶段出来找你。调试过程虽然有时磨人但每解决一个问题对链路、对信号完整性的理解就更深一层。希望这篇梳理能帮你少走一点弯路。