
做了这么多年嵌入式ST的片子用了不少从早期的F103到现在的H7系列基本上每次涉及以太网功能硬件设计上总能在打样回来之后给我“上一课”。最早一次画带网口的板子以为照着参考设计把线连上就完事了结果板子回来要么是Link灯不亮要么是能识别到速率但ping不通折腾了快一周才定位到是差分对布线绕了太多弯、阻抗严重不匹配。后来在几个量产项目里反复调过、改过、验证过把STM32以太网电路设计这块的坑基本都踩了一遍今天把这些经验整理出来希望能帮你少走点弯路。这篇文章主要聊的是STM32内置以太网MAC外设配合外部PHY芯片的方案也就是常见的“STM32PHY网络变压器RJ45”这套硬件链路。核心价值在于器件选型、接口设计、电源时钟、PCB布局布线、防护处理以及硬件和驱动联调时容易忽略的细节。不管你是第一次做带网口的板子还是已经在调试中遇到了疑难杂症这篇文章都值得花几分钟过一遍很多问题其实是可以在原理图阶段就提前规避的。1. 先想清楚再画板接口模式选型直接影响布线难度很多人在原理图阶段不太在意STM32的以太网MAC和PHY之间的接口模式随手选个MII或者RMII就开始画。等到画PCB布局布线的时候才发现引脚不够用、布线绕不过来这就是典型的“前期欠账后期还”。先说清楚这两种模式的区别和适用场景你再决定自己的项目怎么选。1.1 RMII接口为什么在STM32项目里更主流MII是Media Independent Interface的缩写需要16根数据线数据位宽4bit时钟参考25MHz收发各有独立的时钟同步。RMII是Reduced Media Independent Interface把数据线压缩到7根数据位宽2bit时钟统一到50MHz收发共用同一个参考时钟。从PCB布局布线角度看RMII的优势非常明显信号线数量少、布线空间要求低、和MCU引脚冲突的概率小而且STM32本身内置的以太网外设对RMII的支持也更常规部分型号默认推荐RMII。同时RMII对PHY芯片的要求是参考时钟必须由外部提供50MHz不能像MII那样由PHY自己产生25MHz参考时钟然后反馈给MAC。我个人的习惯是只要不是对吞吐有极致要求比如必须跑满百兆线速且对CPU占用率敏感优先选RMII。数据线少带来的直接好处是PCB内侧信号换层更容易、串扰更可控、差分对和时钟线的包地也更好处理。而且从实际调测经验看RMII配ST官方的HAL库初始化流程基本是标准的不会遇到太多坑。1.2 引脚复用冲突最常见的第一道坑STM32的以太网功能不是随便挑几个引脚就能用的每个型号的MAC引脚都有固定的复用映射。比如F407、F429、H743这些常见芯片RMII模式下通常用的引脚是ETH_RMII_REF_CLKPA1ETH_RMII_CRS_DVPA7ETH_RMII_RXD0PC4ETH_RMII_RXD1PC5ETH_RMII_TX_ENPB11ETH_RMII_TXD0PB12ETH_RMII_TXD1PB13ETH_MDCPC1ETH_MDIOPA2这些引脚一旦被占用别的外设就得让路。我在一个项目里就吃过亏串口2用了PA2和PA3结果以太网的MDIO也要用PA2两个功能直接撞车。当时为了不改板只能把串口2换到别的引脚上重新飞线非常被动。所以建议你在原理图阶段的第一件事就是把这些引脚在Excel或原理图里锁死标注“以太网专用”再排其他功能。另外要注意的是STM32的MAC引脚有些是特殊的“快速翻转”引脚比如PA1、PA7等这些引脚如果周边有高频数字信号比如SPI时钟、PWM输出紧挨着走线容易造成串扰影响RMII的数据采样。布局阶段要给这些引脚留出干净的走线通道。1.3 一个被忽视的问题PHY芯片地址和中断引脚PHY芯片通常通过MDIO总线访问内部寄存器每个PHY器件都有一个物理地址一般由外部引脚PHYAD[4:0]的电平决定。很多PHY默认地址是0如果板子上只有一个PHY一般不需要改。但如果你的系统里可能出现多个MDIO设备或者你要在调试时快速确认PHY访问是否正常建议把PHYAD引脚通过电阻配置成非0地址比如1这样可以通过读寄存器的方式快速判断MDIO总线是否通。另一个容易忽略的是PHY的中断输出引脚INT#或INTR。有些应用不需要中断但至少在调试阶段建议预留一个GPIO口接到PHY中断脚。因为PHY的Link状态变化比如网线插拔是一个很有用的调试信号驱动里可以根据中断及时更新网络状态而不是靠轮询。2. 变压器和RJ45的选型组合决定了信号完整性的下限MCU和PHY之间的信号是数字电平真正到网线上传输的是经过变压器耦合的差分模拟信号。变压器的作用包括电平隔离、共模噪声抑制、阻抗匹配和浪涌保护。很多人觉得这部分随便选个RJ45带变压器的一体化座子就能用实际上变压器选型不当或者电路接法错误会导致信号幅度不足、误码率高甚至通信完全不通。2.1 分立变压器与集成连接器的取舍市面上的方案主要有两类分立网络变压器比如HR911105A里面自带的变压器或者单独的HX1188NL、20F-101T之类再加普通RJ45座集成变压器和RJ45座的一体化连接器比如HR911105A本身、带网络变压器的RJ45带滤波器插座从性能和设计灵活性来看分立变压器独立RJ45更方便调试和布局调整因为变压器位置可以灵活放置而且坏了可以单独更换。但缺点是BOM器件多PCB占板面积大。一体化连接器的好处是体积小、生产焊接方便而且很多自带LED指示灯和屏蔽外壳适合工控、消费类产品。缺点是变压器的位置被固定在连接器内部如果走线从PHY到连接器的路径跨分割或过长很难在布局上补救。我的建议是如果PCB空间允许优先用带变压器的一体化RJ45比如HR911105A这类对新手最友好也减少了自己画变压器外围电路的出错概率。如果你对成本敏感或者要过严格的电磁兼容测试那大概率要用分立方案因为可以针对性地换不同品牌变压器来调辐射和抗扰度。2.2 中心抽头与终端电阻的接法不能抄错网络变压器内部一般有中心抽头Center Tap用于为PHY一侧和线缆一侧提供共模电压。PHY芯片不同中心抽头的接法也不同这是最容易踩坑的地方。拿最常见的百兆以太网方案举例PHY差分发送对的中心抽头通常接电源VDD常见为3.3V或2.5V并通过一个0.1uF电容接GND接收对的中心抽头也可能接上拉电源。但具体接法一定要以PHY芯片数据手册里的参考电路为准不要直接照抄其他PHY的电路。比如有的PHY要求中心抽头直接接地有的要求通过电容接地再上拉接反了会导致信号共模电压不对表现为Link能起来但大量CRC错误。另外差分对上的终端电阻一般是50Ω对地在部分PHY芯片里已经集成在芯片内部外部不需要再加而有些则需要外部加上。我遇到过有同事在PHY已经内置终端电阻的芯片上又加了外部电阻导致差分信号幅度偏小通信距离变短。正确做法是仔细阅读PHY数据手册确认哪些电阻内置哪些需要外置。2.3 网络变压器的摆放朝向有讲究变压器在网络链路中扮演着“物理隔离阻抗变换”的双重角色PCB布局时的方向很关键。PHY一侧的引脚属于“数字侧”或“驱动侧”RJ45一侧属于“线缆侧”或“隔离侧”。为了防止线缆侧的共模干扰和浪涌通过耦合路径串到PHY侧变压器下方的PCB区域要做“净空”处理也就是变压器下方和周围不要铺铜尤其是不要铺连续的GND铜皮。实际项目里我有个习惯把变压器放在靠近RJ45座的位置PHY到变压器的走线控制在30mm以内差分对尽量短、直、等长。变压器的次级侧RJ45侧和初级侧PHY侧之间在变压器下方用挖空或隔离带断开地平面确保“隔离带”两侧不共用铜皮。虽然这个做法不是绝对必须但对过EMC测试帮助很大。3. PHY芯片的电源和时钟是“隐性”故障高发区如果PHY芯片的供电和时钟设计不过关以太网会出现各种“神鬼莫测”的现象时而能通信时而掉线、丢包时好时坏、低温下完全不通但常温正常。这些问题的根源往往不是PHY本身坏了而是电源纹波太大或者时钟质量太差。3.1 电源纹波对PHY的影响远超预期PHY芯片内部有模拟收发器对电源的干净程度比较敏感。常见的PHY如LAN8720A、DP83848、KSZ8081等核心电压常见为1.2V或1.8VI/O电压常见为2.5V或3.3V。如果供电纹波超过50mV甚至更高就可能出现发送信号抖动增大、接收端误判的问题。设计时应注意几点PHY的每个电源引脚都要就近放0.1uF陶瓷电容特别是有模拟电源AVDD引脚的建议再加一个1uF或10uF的电容并联如果系统里同时有DCDC开关电源比如从12V降压到3.3VPHY的3.3V电源最好经过一个磁珠或π型滤波器再给到PHY有条件的话在原理图阶段就把电源的测试点预留出来方便调试时用示波器观察纹波3.2 参考时钟选25M还是50M逻辑是什么在RMII模式下PHY需要一个50MHz的参考时钟。这个50MHz时钟一般有两种产生方式外部25MHz晶振接PHY由PHY内部PLL倍频到50MHzPHY再输出50MHz给STM32的REF_CLK外部50MHz有源晶振直接给PHY和STM32提供时钟第一种方式更常见因为很多PHY芯片内部自带PLL比如LAN8720A的就是25MHz晶振输入内部倍频后输出50MHz的REF_CLK。STM32侧的RMII REF_CLK就是由PHY提供的。第二种方式需要外部50MHz有源振荡器STM32的REF_CLK和PHY的REF_CLK都来自这个信号源这时要注意时钟信号的分支和驱动能力不要让时钟信号过冲或振铃。从实际工程经验看第一种方式25MHz无源晶振对新人更友好因为无源晶振电路简单周边只需两个负载电容。但要注意晶振到PHY芯片的走线要尽量短两个负载电容典型值18pF~33pF具体看晶振规格要靠近PHY的XI、XO引脚放置而且晶振下方尽量不要走其他信号线。3.3 去耦电容的位置比容量更重要很多人在原理图上画了一堆去耦电容但在PCB布局时随意摆放电容离引脚很远结果滤波效果很差。电容的工作原理是“就近旁路”离引脚越远回路电感越大高频噪声滤不掉等于白放。对于PHY芯片每个电源引脚旁边都应有至少一个0.1uF陶瓷电容且电容到电源引脚的走线要短而粗最好直接打过孔到GND平面。模拟电源和数字电源要分开走避免在芯片内部和PCB上耦合。电源进入PHY之前如果能加一个磁珠或者0欧电阻把模拟电源和数字电源隔开对提升信号质量有明显帮助。4. 差分对布线线宽、间距、参考平面一个都不能少到了PCB布局布线阶段这是整个以太网硬件设计里技术要求最高的部分。很多板子功能异常最后排查下来都是差分对布线出了问题。RMII的数据信号是单端的但PHY到变压器之间是差分对TXD/-、RXD/-这部分对布线要求最严格。4.1 100欧姆差分阻抗怎么算出来以太网物理层的差分对特性阻抗要求是100Ω±10%这个100Ω是由走线宽度、走线间距、参考平面距离介质厚度共同决定的。最简单的办法是让PCB厂帮你算阻抗他们料比较准。但你自己也需要有个大概概念不然提出的线宽线距要求连厂家都看不懂。以常规4层板层叠为TOP-GND-PWR-BOTTOM为例表层到参考平面约0.1mm~0.2mm差分线宽0.15mm6mil、间距0.15mm6mil左右通常就能做到100Ω差分阻抗。如果是2层板参考平面是同一层的GND铺铜但因为参考回路不是完整平面阻抗会很难控制所以我建议做以太网至少用4层板。如果你用嘉立创或华秋这类打样平台可以直接在订单备注里写明“TXD/TXD-、RXD/RXD-差分对阻抗100Ω”他们一般会根据叠层帮你调整。如果自己做阻抗计算可以用Si9000或Saturn PCB Toolkit输入介电常数、层厚、线宽、线距等参数就能得到阻抗值。4.2 打孔换层和跨分割是信号质量的头号杀手差分对最忌讳的就是“半路换层”和“参考平面被割断”。换层意味着回流路径突然改变需要额外的过孔提供电流回路而过孔本身的寄生电容和电感会破坏差分信号的相位一致性。如果实在避免不了换层至少要做到以下两点换层过孔旁边必须加一个GND过孔提供回流路径差分对的两个过孔尽量靠近保持对称参考平面被分割是另一个隐蔽问题。比如TOP层走差分线第二层是GND但第二层上有一条长长的电源走线或者一条其他信号线把GND平面割开了那么差分线的回流电流就得绕道而行路径电感增大阻抗不连续EMC辐射也会超标。所以布线前要把叠层规划好确保差分对下方的第二层是完整的GND平面。4.3 其他信号的隔离与包地原则虽然是百兆以太网频率不算太高但在PCB布局上依然要遵守“高速信号远离干扰源”的原则。RMII接口的7根信号线REF_CLK、CRS_DV、RXD0、RXD1、TX_EN、TXD0、TXD1都是单端信号其中REF_CLK的频率是50MHz要特别注意时钟线尽量短远离其他信号线必要时两侧包地数据信号线和时钟线的长度差不要超过10mmTX信号组TX_EN、TXD0、TXD1和RX信号组CRS_DV、RXD0、RXD1尽量分别走线不要交叉差分对的包地不是必须的在某些情况下包地反而会引入额外的寄生电容改变差分阻抗。所以只要间距满足3W原则相邻信号线间距不小于线宽的3倍一般不需要特意给差分对包地。真正重要的是保持差分对内部的紧密耦合让两根线之间的距离恒定避免忽宽忽窄。5. 防护设计ESD、浪涌和金属外壳接地以太网接口是产品外露接口插拔网线、雷击浪涌、静电放电都会从RJ45座进入电路板。如果防护设计不过关轻则通信不稳定重则网口或PHY芯片直接烧毁。这一节完全是实践总结出来的血泪教训。5.1 ESD器件的摆放位置决定防护效果防静电的核心思路是“在静电进入芯片之前把它泄放到地”。所以ESD保护器件TVS管要尽量靠近RJ45座放置最好放在变压器线缆侧也就是靠近RJ45一端这样静电还没到变压器和PHY就被泄放掉了。具体到接线一对差分线比如TXD和TXD-分别接一个TVS管到GNDTVS管的结电容要低小于5pF否则会影响差分信号质量。常用的型号有PESD1F01BL、ULC0504T05等这些是专为以太网设计的低电容TVS阵列。5.2 金属外壳接地单点还是多点怎么选RJ45座如果是金属屏蔽壳就会涉及外壳接地问题。以太网连接器的金属外壳接地方式一直是个有争议的话题到底是通过一个大电阻比如1MΩ并联一个高压电容接地还是直接大面积接地到GND正确答案取决于你的产品形态和过EMC测试的需要。单点接地外壳通过一个高阻值电阻如1MΩ和并联电容如1000pF/2kV连接到GND好处是隔离低频地环路减少噪声耦合多点接地外壳直接通过多个过孔和GND平面连接好处是泄放路径低阻抗对ESD和浪涌防护更有效我在量产项目里的经验是如果是工控机箱类的金属外壳产品RJ45固定座和机箱结构本身就是连通的外壳接地做多点接GND效果更好如果是塑料外壳产品RJ45屏蔽壳必须单独接地建议用一个1MΩ电阻并联1nF高压电容接地既避免地环路又提供ESD泄放路径。这个方案在很多EMC整改案例里都证明了有效。5.3 电源入口的防护也不可忽略很多人的防护只做在信号线上忽略了PHY的电源。实际上网线中也有通过变压器耦合过来的共模干扰或者浪涌如果PHY的电源抗不住一样会死机或者烧毁。建议在PHY的电源入口加上防反接和过压保护这个在很多应用里是必须的。常用做法是3.3V进PHY前串联一个磁珠再加一个TVS管比如ESD5V0D5管住过压配合前面说的π型滤波既能抗浪涌又能滤高频杂讯。6. 软件配合硬件排查Link灯亮不等于通信正常硬件最终能不能跑起来调试阶段才是最折磨人的。我见过太多人卡在“Link灯亮了但ping不通”这个阶段然后开始在驱动代码里抓耳挠腮。实际上这种问题有相当大一部分根源在硬件电路细节上。这节分享几个从硬件角度切入的排查手段。6.1 用wireshark抓包判断物理层有没有问题如果板子和电脑直连后ping不通先别急着改代码。用wireshark在电脑端抓包看能不能收到板子发出的广播包比如ARP请求。如果能收到ARP但回包不通说明物理层发送没问题、接收可能存在问题如果连ARP都收不到大概率是物理层发送链路断了比如差分对断路、变压器焊虚、PHY配置不对。实际工作中wireshark配合过滤条件“arp”能非常直观地判断设备是否在网络层正常工作。如果看到板子在反复发送ARP请求但没人应答同时板子也能收到来自电脑的ARP请求那问题可能在MAC地址或协议栈配置如果板子根本不出现在ARP请求里那就要回头查硬件了。6.2 丢包和CRC error的常见原因如果Link是通的ping成功率也很高但长时间大流量传输时会出现丢包或者ping的延迟忽高忽低多半是信号质量问题。丢包背后通常隐藏着物理层的不稳定可以重点查以下几处差分对走线是否过长或绕线太多导致信号完整性劣化PHY的电源纹波是否过大用示波器测PHY电源引脚的纹波PHY的终端电阻是否匹配阻抗不匹配会造成信号反射严重时就是偶发CRC错误网络变压器焊接是否可靠虚焊会导致偶发性丢包还有一个很容易被忽略的点PHY芯片和STM32之间的RMII接口数据线如果PCB走线过长且没有做等长处理数据建立保持时间不够满足PHY/STM32的时序要求也会导致偶发丢包。可以用示波器单次触发抓取REF_CLK和数据线的相对时序确认是否满足数据手册要求。6.3 从硬件角度检查RMII时序RMII接口的时序要求其实很明确STM32在REF_CLK的上升沿采样数据和控制信号。如果REF_CLK抖动过大或者数据信号相对时钟的建立/保持时间不够就会出现“时而通时而不通”的现象。排查时用示波器同时抓REF_CLK和TXD0/TXD1或者CRS_DV观察数据信号翻转的时刻是否在时钟上升沿之前稳定。一般建议数据信号在时钟上升沿前至少有几个纳秒的稳定时间。如果时序余量太紧可以尝试调整STM32的ETH外设采样点配置比如在驱动里调整RMII的RX采样偏移但这属于软件层面的临时手段根治还是要从布线长度、时钟质量上解决。我在实际项目中遇到过REF_CLK信号被旁边的GPIO翻转干扰导致REF_CLK上叠加了毛刺RMII数据采样偶发错误。后来在REF_CLK线上串联了一个22Ω的电阻毛刺明显被抑制了通信稳定了很多。这种小技巧如果没有示波器实测很难想到。7. 一次完整的调试经历从“完全不通”到“稳定运行”光讲理论不够分享一个我做过的具体案例。有一款STM32F407的控制板带LAN8720A的百兆以太网打样了10片板子烧录程序后上电现象是所有板子的Link灯都能正常亮RJ45座上绿色LED亮但接入电脑后电脑显示“网络电缆被拔出”或“识别到10Mbps但无法获取IP”用wireshark抓包电脑端收不到任何来自板子的帧当时我在办公室排查了一天最后定位到三个问题而且都是硬件上的第一个问题是LAN8720A的REF_CLK输出引脚虚焊。因为是LQFP封装的PHY引脚间距比较小手工焊接时有个别引脚锡量不足REF_CLK没有正常输出到STM32。用示波器测REF_CLK引脚发现电平始终为低。补焊之后Link灯状态正常了电脑端也识别到了100Mbps连接。第二个问题是TXD0和TXD1两根数据线在PCB上走了差不多40mm而且中间打了两对过孔换层导致信号时序余量不大。虽然能通了但长时间大流量跑ping会有偶发丢包。后来调整了布局把PHY放到了更靠近STM32的位置数据线缩短到15mm以内丢包问题消失。第三个问题更戏剧性有一个板子在低温箱-20℃测试时网口完全不通常温下一切正常。排查了很久发现是PHY的25MHz晶振在低温下起振困难。原来晶振的两个负载电容值被我按默认的20pF选了但用的晶振规格书上推荐值是12pF负载电容过大导致负性阻抗不足低温起振慢。换回规格书推荐值后问题解决。这个例子很有代表性因为三个问题分别对应了焊接质量、PCB布局布线、时钟电路参数这三个最常见的盲区。如果你也碰到类似现象建议按这个顺序排查先确认CLK有没有、再确认MDIO能不能读写PHY寄存器、最后看数据线上的信号质量。8. 回头再看原理图阶段最该多花时间的几个地方最后以一个“过来人”的身份再啰嗦几句。以太网电路设计最怕的就是“原理图画得飞快PCB调得想哭”。很多问题如果在原理图阶段仔细核对数据手册是可以完全避免的。总结几个我每次做以太网项目都会反复检查的点PHY芯片数据手册里的参考电路尤其是中心抽头、终端电阻、LED指示灯电路必须逐项对照STM32的引脚复用表确认每个以太网引脚没有被其他外设占用同时确认这些引脚的外部电路比如上下拉不会影响以太网信号晶振的负载电容值是否和晶振规格书匹配这是低温不稳定的常见原因电源设计是否给PHY留了足够的滤波和去耦空间差分对走线是否有足够的布线空间RJ45座的位置是否方便走线我在第一次画以太网板子时总觉得这些“细节”不着急等板子回来再调也行。后来被现实教育了几轮才知道以太网电路设计里最值钱的就是这些细节。原理图阶段多看半小时数据手册能帮你省下几天调试时间还能避免改板带来的成本和周期损失。另外再说一点和硬件关系不大但实际很影响体验的STM32的以太网驱动HAL库或者LwIP协议栈在调试阶段一定要打印出PHY的ID和状态寄存器值。很多问题其实一眼就能从寄存器值看出来比如连接状态寄存器里值不对说明PHY没正确配置而没配置好可能不是软件问题是硬件上PHY地址或MDIO引脚接错了。软硬结合排查效率才能拉满。