ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32F4+LAN8720硬件避坑:原理图、PCB与RMII信号完整性

STM32F4+LAN8720硬件避坑:原理图、PCB与RMII信号完整性 开头做嵌入式网络方案的朋友应该对STM32F4这颗芯片不陌生它内部自带以太网MAC外围只要配一颗PHY芯片就能把网络跑起来。而LAN8720正是这颗使用率极高的100M以太网PHY引脚少、外围省、成本低几乎成了STM32F4做以太网项目的默认搭配。但就是这颗“默认搭配”从原理图到PCB再到RMII信号完整性我踩过的坑能写满一页A4纸。这篇文章就把我调试LAN8720过程中积累的硬件连接经验完整梳理一遍包括原理图设计里最容易出错的引脚配置、50MHz参考时钟的来源选择、RMII信号线的布局要求以及烧录后网络不通的排查思路。无论你是刚接触以太网的新手还是正在被link灯闪但ping不通折磨的进阶开发者这篇文章应该都能帮你少走几段弯路。我尽量把每个坑背后的原理讲清楚不只是告诉你“这里要接上拉”而是告诉你为什么需要上拉、不接会出现什么现象。这样换个芯片、换个平台你也能自己推导出正确答案。1. 方案选型为什么RMII接口成了主流1.1 MII与RMII的取舍逻辑STM32F4内置的以太网MAC支持MII和RMII两种接口模式但绝大多数项目都选择了RMII。原因很简单MII需要16根信号线数据线是4位双向的TXD[3:0]和RXD[3:0]还要分别提供独立的TX时钟和RX时钟而RMII只需要7根信号线发送和接收各2位数据线收发共用一个50MHz参考时钟引脚数量直接砍掉一半多。省引脚带来的代价是信号速率翻倍。MII的时钟是25MHz而RMII的参考时钟是50MHz。别小看这个翻倍它在PCB布局和信号完整性上提出的要求完全不是一个量级。25MHz的走线稍微绕一点、阻抗不匹配一点通常不影响工作但50MHz的REF_CLK如果处理不好就真的会出现“时好时坏”的玄学问题。除了引脚数量RMII还有另一个优势它用单一时钟简化了MAC与PHY之间的时钟同步关系。MII模式下MAC发送数据时要跟随PHY提供的TX_CLK接收数据时要跟随RX_CLK两个时钟可能来自不同的参考源时序约束复杂。RMII模式下所有信号都以同一个50MHz REF_CLK为基准逻辑简单很多。1.2 LAN8720在STM32F4项目中的位置LAN8720是Microchip原SMSC推出的一款低功耗10/100M以太网PHY采用RMII接口QFN-24封装体积只有4x4mm外围器件少得可怜一颗25MHz晶振加几个电容电阻就能工作。它的内置稳压器可以直接用3.3V供电不需要额外的模拟电源。同类的PHY还有TI的DP83848、Microchip的KSZ8081等但LAN8720在STM32F4项目里尤其常见原因有这么几点一是价格便宜零售价不到几块钱二是外围电路简单参考设计几乎是标准答案三是STM32的软件生态里大量开源项目都基于LAN8720遇到问题网上能找到一堆现成的经验。但LAN8720也有它自己的脾气特别是它的nINTSEL/REGOFF引脚这个引脚同时承担了PHY地址选择、中断输出模式选择、内部稳压器开关三个功能一个引脚干三件事很多人第一次画原理图都会在这里翻车。这个我在后面原理图部分详细说。2. 硬件连接基础LAN8720的核心引脚功能2.1 电源与地引脚的正确处理LAN8720的电源引脚分为模拟和数字两部分。VDDCR是内部1.2V稳压器输出需要外接一个1uF的去耦电容到地这个电容一定要靠近芯片引脚远了容易引起内部逻辑不稳定。VDDIO是I/O电源接3.3V这个引脚决定了与MAC接口的信号电平。3.3V电源输入引脚建议并联一个10uF的钽电容和若干个0.1uF的陶瓷电容0.1uF的电容每个电源引脚旁边放一个不要只放一个共享的。我之前画第一版时图省事两个电源引脚共用一个0.1uF电容结果网络速率不稳跑吞吐测试时总会掉包后来把去耦电容补齐才正常。模拟电源AVDD和数字电源DVDD虽然都用3.3V供电但PCB上最好用磁珠或0欧电阻做一个单点连接避免数字开关噪声窜到模拟域。LAN8720内部对噪声还算宽容但既然数据手册这么要求了照做总比不做好。2.2 复位引脚与上电时序NRST引脚是低电平有效的硬件复位内部有上拉电阻外部接一个10k上拉和0.1uF电容到地作为上电复位电路就够用了。MCU的GPIO也可以直接控制这个复位引脚方便软件在初始化时对PHY做一次完整的复位操作。需要注意上电时序LAN8720的复位释放必须发生在25MHz时钟稳定之后。如果复位释放得太早PHY内部的时钟状态机可能没有正确锁定晶振频率导致PHY寄存器读取异常。我在调试中遇到过一种情况板子上电后第一次读PHY ID读到0xFFFF重新复位一次就能读到正确值就是上电时序没满足。GPIO控制复位的话软件初始化时应该先拉低复位引脚延时至少10ms再拉高释放复位然后等待PHY内部稳定延时约1ms后再通过MDIO读取寄存器。这个时序在数据手册里有明确说明照着做就不会有那种“时灵时不灵”的诡异问题。2.3 MDIO与MDC管理接口MDIO和MDC是MAC与PHY之间的管理接口用来读写PHY内部寄存器。MDC是时钟信号由MAC产生最高频率一般是2.5MHzMDIO是双向数据线在MDC的上升沿采样数据。STM32F4的MDIO引脚是PA2MDC引脚是PC1。这两个引脚需要接10k上拉电阻到3.3V吗实际上PHY内部已经有上拉但我实测外加上拉能让信号边沿更陡在长走线或环境干扰大的场合更稳定。如果板子空间允许建议加上。MDIO接口的时序在长时间运行后偶尔出现通信失败多半是MDC时钟频率太高或者走线太长引入了噪声。可以把MDC时钟降一降标准要求是2.5MHz但工作在1MHz也能正常读寄存器稳定性反而更好。3. 原理图设计从参考设计到能用的板子的关键改动3.1 25MHz晶振电路与时钟路径LAN8720需要外部提供一个25MHz的参考时钟最常见的方式是接一颗无源晶振配合两个负载电容。晶振的负载电容要根据晶振的规格参数计算常规值在18pF到22pF之间我通常用18pF实测起振可靠。晶振电路的两个负载电容另一端接地这两个电容要尽可能靠近晶振引脚走线要短。晶振下方要铺地铜皮不能有其它信号线穿过这是一个老生常谈但总有人忽视的问题。晶振起振失败的症状是PHY完全无响应MDIO读到的寄存器全是0xFFFF排查方法很简单示波器探一下XI引脚看有没有25MHz波形。另一个时钟方案是直接给XI引脚输入一个外部时钟信号这时候XO引脚悬空。有些设计中会用STM32的MCO引脚输出一个50MHz时钟接到LAN8720的REF_CLK引脚这种方案要求PHY工作在RMII从模式把外部50MHz时钟当作MAC的参考时钟。但大多数项目不会这样走因为LAN8720内部可以把25MHz晶振倍频到50MHz再输出给MAC这样省掉一个50MHz有源晶振。3.2 关键的nINTSEL引脚设置这是LAN8720原理图设计里最容易被搞错的一个引脚。nINTSEL同时配置了三个功能PHY地址bit0、中断输出模式、内部稳压器是否开启。这个引脚通过上拉或下拉电阻到3.3V或GND来设置。如果nINTSEL接下拉电阻到地即低电平PHY地址bit0为0加上固定地址bit[4:1]为00001最终PHY地址是0x01中断引脚nINT输出模式是低电平有效。如果nINTSEL接上拉到3.3V高电平PHY地址bit0为1PHY地址变成0x01不对这里我重新梳理一下。LAN8720的PHY地址由PHYAD0引脚决定而PHYAD0就是nINTSEL/REGOFF引脚。数据手册中PHY地址默认是0x00但bit0由PHYAD0决定接地时PHY地址为0x00接3.3V上拉时PHY地址为0x01。同时nINTSEL高低电平还决定了nINT引脚是推挽输出还是开漏输出而REGOFF功能决定内部1.2V稳压器是否关闭。最常见的配置是nINTSEL接下拉到地PHY地址0x00nINT推挽输出内部稳压器开启。当STM32F4的HAL库默认从地址0x00读取PHY ID时这个配置正好匹配。如果你的板子把PHY地址设成了0x01软件里也要把ETH_PHY_ADDRESS改成1否则读不到PHY。3.3 LED指示灯电路要不要加LAN8720提供了nLED1和nLED2两个LED输出引脚nLED1通常指示link状态nLED2指示收发活动。这两个引脚是开漏输出需要外接上拉电阻加上LED串联限流电阻到3.3V。LED串联电阻常用330欧到1k欧看LED亮度需求。很多人觉得LED指示没用直接悬空不接。但我建议至少把nLED1的link灯接出来调试的时候看灯比看调试器快得多。我这几年调试网络板卡的经验是先看link灯亮不亮灯不亮连PHY层都没通根本不用浪费时间去看协议栈灯亮了再上逻辑分析仪看RMII信号。LED限流电阻大小影响不大反而是LED引脚的上拉电阻要选对建议2.2k到4.7k。上拉电阻太大LED亮度不够太小则可能影响LED引脚的逻辑状态。还有LED要走线远离RX差分对LED驱动的开关噪声会稍微影响接收信号的SNR实测在强干扰环境下有轻微影响。3.4 网络变压器与RJ45座的选型ST公司的参考设计和大多数开发板都在PHY和RJ45之间使用网络变压器网络变压器起到电平耦合、共模抑制和电气隔离的作用。常见的集成RJ45座方案把变压器和RJ45做成一体比如HR911105A这种方案最省事外围只要接好TX/TX-/RX/RX-差分线就行。分立式变压器加独立RJ45座的方案灵活性更高但需要注意每个变压器的抽头接法可能有细微差异。以最常用的HR911105A和分立变压器为例PHY的TX和TX-分别接到变压器初级线圈的两端初级线圈中心抽头通过一个0.1uF电容和50欧电阻网络接到3.3V。这个中心抽头的接法取决于PHY的驱动类型LAN8720内部是电流驱动型抽头要接VDDIO。变压器次级侧中心抽头通过RC网络接地常用的匹配网络是一个50欧电阻串一个0.1uF电容到地这组RC在业内常被称为Bob Smith匹配用来匹配线缆的共模阻抗。如果跳过这组匹配在复杂的电磁环境下可能会增加辐射发射和共模噪声。4. RMII信号连接STM32F4与LAN8720的引脚级对接4.1 完整的引脚映射表把STM32F4的以太网外设映射到引脚之前先列出RMII接口的完整信号清单。RMII模式下STM32F4与LAN8720的物理连接包括以下几组信号名STM32F4引脚LAN8720引脚方向说明ETH_REF_CLKPA1REF_CLKPHY→MAC50MHz参考时钟ETH_MDIOPA2MDIO双向管理数据ETH_MDCPC1MDCMAC→PHY管理时钟ETH_CRS_DVPA7CRS_DVPHY→MAC载波检测/数据有效ETH_RXD0PC4RXD0PHY→MAC接收数据ETH_RXD1PC5RXD1PHY→MAC接收数据ETH_TX_ENPB11TX_ENMAC→PHY发送使能ETH_TXD0PB12TXD0MAC→PHY发送数据ETH_TXD1PB13TXD1MAC→PHY发送数据PHY_nRST任意GPIOnRSTMAC→PHY复位可选PHY_nINT任意GPIOnINTPHY→MAC中断可选这个映射只适用于RMII模式如果用MII模式引脚完全不同。另外需要注意的是STM32F407和STM32F429等不同型号对引脚的定义略有区别在使用CubeMX生成代码时务必要选择正确的封装型号CubeMX会自动分配引脚可以对照上表检查。4.2 为什么REF_CLK必须接PA1STM32F4的ETH_REF_CLK是RMII接口的参考时钟输入它有两个可选引脚PA1和PB1。但在RMII模式下MAC侧的参考时钟只能由外部PHY或外部时钟源提供不能由STM32内部产生。这意味着LAN8720的REF_CLK输出引脚必须接到STM32F4的PA1或PB1。这里有一个非常常见的误区RMII的50MHz参考时钟可以有两个来源。第一种是外部提供比如有源晶振或MCU的MCO输出50MHz接到PHY和MAC第二种是LAN8720内部把25MHz晶振倍频到50MHz通过REF_CLK引脚输出给MAC。第二种方案实际使用更常见因为只需要一颗便宜的25MHz无源晶振。如果你打算用STM32F4的MCO1或MCO2输出50MHz时钟给PHY就需要把PHY配置为外部时钟模式同时RMII的REF_CLK由主板时钟源驱动。Lan8720其实更常见是从XI输入25M晶振再输出50MHz。这个方案也没问题只是软件配置时钟时要把LAN8720的CLKOUT使能位打开。我强烈建议新手直接采用“25MHz晶振LAN8720内部倍频输出”的方案因为它与绝大多数开发板、例程、CubeMX配置一致踩坑概率最小。4.3 信号方向不是所有线都是双向的RMII接口的9根信号线中方向经常被人搞混。发送侧的TX_EN、TXD0、TXD1是MAC输出到PHY接收侧的CRS_DV、RXD0、RXD1是PHY输出到MACMDIO是双向的MDC是MAC输出。画原理图时如果方向画反了虽然板子不一定立刻烧毁但信号会完全不通。我用过一句话总结RMII信号方向MAC管发PHY管收MDIO两边聊。发送方向任何时候都是由MAC发起PHY不能反向驱动TXD信号而CRS_DV和RXD信号是PHY在接收链路建立后持续驱动的MAC只能读不能驱动。需要在原理图网络标签上加方向注释。比如“ETH_TX_EN/M”表示MAC到PHY或者用组命名的方式把发送信号统一命名为ETH_TX_xxx、接收信号命名为ETH_RX_xxx。这个习惯能帮你在画PCB或者回头排查时省大量时间。4.4 变压器中心抽头与Bob Smith匹配在以太网原理图里网络变压器的次级中心抽头需要接一个RC匹配网络这个网络在业界通常叫Bob Smith匹配。标准接法是次级中心抽头经过一个50欧电阻串0.1uF电容到地。电容的作用是隔离直流电阻的作用是匹配线缆的共模特性阻抗。如果你用的RJ45集成变压器自带这组电路原理图上就省了如果是分立变压器一定要加上。缺少Bob Smith匹配时用是能用但网口在雷击浪涌或静电放电环境下的抗扰能力会明显下降长时间工作可能偶发掉线。初级中心抽头则通常接到VDDIO3.3V通过一个0.1uF电容接地。有的PHY手册建议直接用0.1uF电容接到VDDIO有的建议串一个1k电阻具体看LAN8720数据手册的推荐电路。LAN8720推荐的就是初级中心抽头直接通过0.1uF电容接3.3V不需要串电阻。5. RMII信号完整性原理图之外的最大坑5.1 50MHz REF_CLK的走线要求RMII信号完整性的核心就是这颗50MHz的REF_CLK时钟。它的频率不算高但它是所有RMII信号的时序参考基准沿的抖动和过冲直接影响数据采样点。理论上RMII允许的时钟到数据的skew范围约在几纳秒级别晶振源经过PHY倍频输出后如果PCB走线再引入较大延迟就可能露出问题。REF_CLK走线的首要原则是短和直。从LAN8720的REF_CLK引脚到STM32F4的PA1走线尽量控制在25mm以内避免使用过孔避免走线分叉。如果必须换层至少不要走两个以上过孔且过孔附近加地过孔形成回流路径。其次是阻抗控制。50MHz方波信号的能量主要集中在基频和三次谐波特性阻抗稍微偏一点影响不大但如果有严重的阻抗不连续比如走线宽度突变、跨越分割的参考平面反射就会叠加成振铃。对于REF_CLK这种驱动能力很强的时钟输出一个简单的串联匹配电阻能有效吸收反射。我通常会在REF_CLK走线的源端LAN8720侧串一个22欧到33欧的电阻靠近PHY放置再走到MCU。这个电阻就是源端串联匹配作用是降低信号边沿的过冲。加了这颗电阻后用示波器测量MCU引脚的波形会明显干净很多。5.2 数据线分组与等长控制RMII的数据信号包括TX_EN、TXD0、TXD1、CRS_DV、RXD0、RXD1六根线它们的数据变化都相对于REF_CLK的上升沿。在原理图阶段等于变成了PCB Layout阶段最重要的参考因为等长约束要从这里开始做。等长约束的原则是同一方向的数据线与REF_CLK之间的长度差控制在250密耳约6.35毫米以内。这个数值对应的时间差约0.4纳秒远小于RMII要求的建立保持时间余量。实际布局时发送组TX_EN、TXD0、TXD1和接收组CRS_DV、RXD0、RXD1分别做组内等长即可收发之间不需要严格等长。走线间距上数据线与数据线之间保持3倍线宽以上的间距比较稳妥这样能减小串扰。数据线与REF_CLK之间最好拉开距离中间用地线隔离。如果板面实在紧张至少要保证REF_CLK两侧有足够的地铜皮包裹。5.3 网络变压器的初次级隔离RJ45接口的变压器在PCB上构成了初次级隔离边界。次级侧RJ45座一侧的差分走线连接到变压器次级绕组初级侧PHY一侧连接到PHY的TX/RX引脚。两侧之间要保持电气隔离不能共用参考平面。实际Layout时我会在变压器下方把PCB的地平面挖空用一条跨越变压器的净空区把初级地和次级地彻底分开。这个隔离带一般在60到80密耳宽宽度取决于变压器封装。如果不挖空次级侧引入了浪涌或共模噪声就可能直接耦合到初级地隔离就形同虚设。PHY到变压器之间的差分TX/RX走线也建议控制差分阻抗目标100欧。虽然100M以太网对差分阻抗的要求不如千兆那么苛刻但做了总比不做好。差分对之间也要注意等长LAN8720是单路变压器TX/TX-和RX/RX-各是一对组内等长控制在5mm以内就够了。5.4 地平面的完整性优先我在调试很多块STM32F4网络板的过程中发现一个规律网络不稳定的板子十有八九都是地平面被切碎了。以太网信号回流路径缺乏一个连续、低阻抗的地参考面时信号完整性就无从谈起。对于RMII这种单端信号回流电流会沿着信号走线下方最近的地平面返回。如果地平面被过孔、走线分割成几块回流电流就会绕路形成一个大环路这个环路的面积直接决定了天线效应和电磁干扰。所以顶层铺地铜皮、底层铺地铜皮关键信号下方尽量不跨分割这是一条底线要求。如果MCU和PHY在同一层、信号走线在同层我还会在信号束两侧各加一根地线形成包地效果。这个动作在EMI测试时往往会带来几dB的余量成本只是一根地线。6. 实操过程从零搭建一块STM32F4与LAN8720硬件6.1 原理图阶段的自检清单板子还没画PCB之前先对着清单过一遍原理图。这张清单是我至少改版三次后总结出来的每次以为没问题最后又能在清单里找到遗漏。电源引脚是否都接了正确值的去耦电容nINTSEL引脚的上拉/下拉电阻是否已经决定PHY地址25MHz晶振的负载电容是否靠近晶振放置nRST复位电路是否满足上电时序REF_CLK方向是否确定是PHY输出到MAC所有RMII信号方向是否标注正确MDIO/MDC是否加了上拉电阻变压器中心抽头接法是否匹配LAN8720的电流驱动类型LED指示电路是否可省但建议保留是否有独立的3.3V电源层给PHY供电这个清单看起来简单但每一条背后都对应着实际项目里真实的故障案例。比如nINTSEL接反方向导致PHY地址变成0x01我在三块板子上都见过再比如LED引脚上拉电阻选太小导致link灯不亮这个你花一小时查代码都查不出来看原理图一眼就能发现。6.2 PCB Layout阶段的层次规划走完原理图就到了PCB阶段合理的层叠规划能让信号完整性省一半力。大部分STM32F4网络板用双层板就够但层叠也有讲究。双层板的话底层尽量完整铺地顶层走信号。RMII信号束和REF_CLK走顶层底层不用网格地用实心铜皮。关键信号下方底层不能走其它数字信号宁可绕远也不能破坏参考平面。如果板子层数更多比如四层板推荐第二层做完整地平面第三层做电源平面顶层和底层走信号。这种层叠对RMII信号完整性最友好。但无论几层板都别把关键信号走在两个过孔密集的区域内那地方的参考平面早就被过孔打成了筛子。布局顺序上应该先固定LAN8720、网络变压器和RJ45的位置然后再放MCU和去耦电容。LAN8720要尽量靠近RJ45因为差分对走线越短越好MCU要尽量靠近LAN8720因为RMII信号束越短越好。这两个约束是矛盾并非真的矛盾把RJ45放在板边LAN8720放紧挨着RJ45的内侧MCU再紧挨着LAN8720内侧形成一条直线布局。6.3 焊接与首次上电的检查顺序终于焊接完板子了不要急着烧程序。先用万用表量一遍电源对地阻抗确认没有短路再上电。上电后先摸一下LAN8720温度是否异常烫手说明电源或引脚有接错立刻断电排查。确认电源正常后先测晶振是否起振。用示波器探头夹在XI引脚正常应该看到25MHz的正弦或近似方波信号。我把示波器打到50MHz带宽限制能看到约0.4V到0.8V的峰峰值这个幅度其实很低但足以驱动PHY内部振荡器。如果看不到波形查晶振负载电容和焊接质量。晶振正常后再量REF_CLK引脚应该能看到50MHz信号输出。注意REF_CLK的输出电压摆幅可能只有1.8V左右这是PHY的输出电平标准接到STM32F4的PA1上只要满足VIH/VIL阈值就能工作。看到50MHz信号后PHY硬件层面基本就是好的这时候再烧程序做MDIO通信测试。6.4 用MDIO读取PHY ID验证硬件通路软件验证硬件最简单的办法就是通过MDIO读取PHY的标识寄存器。LAN8720的PHY ID分两个寄存器寄存器2保存的是厂商ID高16位值为0x0007寄存器3保存的是产品ID低16位和版本号值为0x0200左右。如果MDIO读出来的是0x0007说明MDC/MDIO通路、PHY供电、晶振、复位全部正常硬件连接基本可以盖章通过。如果读出来0xFFFF或者0x0000就需要按照PHY无法访问的排查流程走一遍。读PHY ID的代码在STM32CubeMX生成的HAL工程里已经封装好在HAL_ETH_Init函数中库会自动调用eth_arch_phy_Init之类的底层函数读取PHY ID如果读不到会返回HAL_ERROR。你也可以用自己的SMI读写函数从寄存器2和寄存器3读取原始值通过串口打印出来。我把这段SMI读寄存器代码放在这里适合自己初始化以太网外设的裸机情景uint32_t PHY_ReadReg(uint8_t phy_addr, uint8_t reg_addr) { uint32_t val 0; /* 写MDIO地址和读命令 */ ETH_WriteMDIO(phy_addr, reg_addr, 0); /* 等待读完成 */ while (ETH_ReadMDIO(phy_addr, reg_addr) 0) { } val ETH_ReadMDIO(phy_addr, reg_addr); return val; }实际项目中ST的HAL库已经帮你把这些封装好了在stm32f4xx_hal_eth.c里搜索ETH_MII_ReadReg就能找到。用起来也很简单传入PHY地址和寄存器号就行。建议把PHY地址定义成宏如果板子是PHY地址1就把宏改成1否则HAL库默认从0读就会失败。7. 常见问题与排查技巧实录7.1 排查问题前先明确故障边界以太网调试最怕没思路症状看着都一样但故障边界完全不同。我常用的排查思路是分四层物理层、链路层、IP层、传输层。硬件连接问题直接体现在物理层和链路层。物理层就看两个信号25MHz晶振有没有起振、50MHz REF_CLK有没有送到MCU。只要这两个信号正常PHY的物理层基本就活了。链路层就看MDIO能不能正常读写PHY寄存器、link状态寄存器bit2是不是1。链路层不通八成是TX/RX信号或变压器接法有问题。我在帮同事调试的时候发现一个规律很多“ping不通”的问题最后都是物理层没过。而且物理层问题有一个很典型的现象——丢包率在50%左右要么完全不通要么通了之后频繁超时。如果你遇到这种症状别急着查TCP/IP协议栈先去量REF_CLK。7.2 常见问题速查表以下整理了我实际调试中遇到过的问题、原因和解决办法覆盖面很广从原理图错误到PCB布局问题都包含了。故障现象可能原因排查与处理MDIO读不到PHY ID0xFFFF晶振未起振复位未释放PHY地址不对电源不正常示波器量XI引脚确认25MHz量NRST电平核对nINTSEL上下拉量各电源引脚电压REF_CLK无输出nINTSEL配置错误PHY未进入RMII模式PHY未正确复位核对nINTSEL上拉/下拉确认XTAL起振手动复位PHY后重新检测link灯不亮网线或对端设备问题变压器次级匹配不良LED限流电阻太大换网线换交换机检查变压器中心抽头和Bob Smith电路减小LED电阻link灯亮但ping不通RMII信号方向接反TXD/RXD接错位REF_CLK抖动过大核对原理图信号方向检查TXD0/TXD1、RXD0/RXD1是否交叉优化REF_CLK走线通信时通时断地平面不完整去耦电容不够PHY供电纹波过大补全去耦电容改善地平面在PHY电源入口加磁珠和钽电容长时间运行后死机PHY过热供电不稳MDIO访问冲突检查PHY表面温度加大电源余量降低MDC频率、增加软件超时保护能ping通但吞吐量很低时钟抖动过大MDIO干扰了数据线变压器中心抽头错误示波器测REF_CLK眼图隔离MDIO走线与数据线核对变压器接法只有发送没有接收对端回环或者自己回环测试而RXD方向上PHY未正常输出量CRS_DV和RXD0/RXD1波形检查PHY是否处于隔离模式这张表不只是给你抄作业的更重要的是让你建立一套排查思路。所有硬件类问题最终都会映射到这四类根因中的一个电源、时钟、信号方向、信号质量。7.3 示波器实测信号的判断标准调试RMII阶段最常用到的调试工具就是示波器。我用的示波器带宽是100MHz对这个场景完全足够。REF_CLK引脚上应该看到频率稳定的50MHz方波上升沿与下降沿时间大约在2到5ns之间。如果沿太缓说明驱动不强或者走线电容太大如果出现明显振铃说明阻抗不匹配。数据线信号不需要每次都测只有当可疑时才测。测试时把探头地线尽量缩短最好用弹簧地针因为用长地线夹子测高频信号会测出夹杂大量噪声的波形容易产生误判。真正判断信号质量好坏要看数据信号相对于REF_CLK的建立保持时间。如果数据变化沿距离时钟沿太近——比如小于5ns而且板子温度一高就不稳定那基本就是时序余量不够需要调整走线长度或者优化时钟路径。7.4 软件初始化顺序中的隐藏坑硬件没问题软件初始化顺序也暗藏几处坑位。STM32F4的以太网模块第一步是使能GPIO时钟和ETH时钟然后配置引脚复用功能然后执行MAC与DMA的复位之后才是PHY通信。如果你提前打开了ETH的中断而PHY还没初始化中断服务函数里访问寄存器就会拿到无效数据。另一个坑是PHY复位后的等待时间。如果软件复位PHY后立即读取寄存器PHY可能还没准备好读到的还是复位前的随机值。标准做法是复位后延时至少1ms再开始SMI通信。我遇到过把延时改成100us也没问题的板子但保留1ms更稳妥。还有RMII时钟源选项必须和硬件一致。CubeMX中以太网配置有“RMII”选项里面的时钟源可以选外部时钟或MCO输出。如果硬件是LAN8720自己从25M倍频输出50M给MCUCubeMX里时钟源就选外部External如果用MCU的MCO输出时钟给PHY则时钟源要选MCO且MCO要正确配置输出50MHz。这两者选错PHY和MAC之间根本无法建立时钟同步。8. 更进一步的信号完整性优化建议8.1 串联电阻的选取与调整在REF_CLK和TXD/RXD信号上串一个电阻能有效抑制信号反射和过冲。这个电阻的具体阻值需要根据实际波形调整但有一个大致的起步值。对于REF_CLK我一般从22欧起步试用示波器看接收端的波形。如果过冲还明显增大到33欧如果波形沿变太缓减小到10欧。对于数据信号源端串阻的阻值可以略小10欧到22欧都能接受。特别提醒这个电阻是为了匹配源端阻抗不是越大越好阻值过大会让信号上升沿变缓反而恶化建立时间。如果条件允许把这些串阻做成0402封装的可调电阻或者预留焊盘位这样调试时方便临时改值。量产时再根据调试结果固定成最优阻值。8.2 磁珠与电源滤波的组合LAN8720的电源滤波建议用磁珠加电容的组合。磁珠选600欧100MHz规格即可放在3.3V输入和PHY电源引脚之间。磁珠后面再加一个10uF钽电容和两个0.1uF陶瓷电容分别覆盖低频和高频噪声。磁珠的作用是隔离噪声但也会引入直流压降。磁珠的直流电阻一般在几十毫欧级别压降可以忽略。选用磁珠时注意额定电流要大于PHY最大工作电流LAN8720的功耗很低额定电流500mA的磁珠完全够用。如果你发现PHY在电磁干扰测试中表现不佳检查PHY电源入口的磁珠是否被省掉了。省掉磁珠直接供电板子也能工作但EMI余量往往会差几个dB这在产品认证时可能是致命失败项。8.3 过孔与走线阻抗不连续的代价对双层板来说RMII信号不可避免要跨层换孔每换一次过孔就会引入一个阻抗不连续点。一个过孔的寄生电容约0.2到0.5pF对于50MHz方波来说影响有限但过孔多了会显著增加信号上升沿的延迟和抖动。信号线换层时旁边一定要配一个地过孔这个地过孔为回流电流提供最短路径。我见过一块异常板子RXD0和RXD1各走了3个过孔其中一个过孔附近没有地过孔结果接收信号比REF_CLK延迟了近2ns链路余量几乎为零温度一高就断流。最后如果信号必须走过孔首选0.3mm或0.2mm的小过孔避免使用0.5mm以上的大过孔。大过孔的寄生电容明显更大对沿的恶化更明显。这个经验在双面板空间紧张时尤其重要。9. 关于网格、量产与后续维护9.1 网格地还是实心铜皮PCB铺地时有人喜欢用网格地觉得好看还能节省腐蚀药水。但对于RMII信号所在的区域我强烈建议用实心铜皮。网格地在地平面完整性上远不如实心铜皮因为网格相当于在地平面上开了大量平均分布的孔洞回流路径会被迫蜿蜒。如果你因为板材厚度或者工艺要求必须用网格那也要保证RMII信号覆盖的下方区域是实心铜皮或者在网格地密度上选择高密度网格。网格越密地平面越接近实心铜的效果但网格密度太高又失去了节省腐蚀药水的意义。量产的板子如果网络性能不稳定优先检查是不是网格地惹的祸。把关键信号区域改成实心地铜皮往往能解决不少“玄学”问题。9.2 PHY地址冲突与多PHY系统如果一个系统里有多颗LAN8720或者其他PHY每颗PHY的地址必须独一无二。LAN8720的PHY地址只有bit0可由外部引脚配置另外4位是固定的。所以一颗LAN8720其实只能分配两个地址之一0x00或0x01。如果系统里需要挂多颗PHY就要考虑用支持更多地址位配置的PHY型号了。STM32F4的以太网MAC只支持一个PHY进行通信所以多PHY系统需要额外的MDC/MDIO选择开关或者用GPIO模拟MDIO来访问多颗PHY芯片。这块展开讲会很长但记住一点多PHY时地址分配要在原理图阶段就规划好别等软件阶段才来想办法。9.3 升级维护时容易隐藏的改动芯片批次不同LAN8720的内部默认值也可能有细小区别尤其是LED极性、稳压器默认开关状态等。换批次后做常规功能测试可能看不出问题但过EMC认证或高低温试验时就有概率翻车。我在量产项目中遇到过同一批板子在-20度环境下面ping不通排查到最后发现是新批次PHY的晶振起振时间变长复位时序余量不够需要把复位延时从1ms改成10ms。硬件设计留足调试余量是量产稳定性的重要保障。比如复位引脚用GPIO控制而不是纯RC复位这样即使PHY批次差异导致复位时序不同软件也能灵活调整再比如REF_CLK串阻预留不同的焊盘位调试时可以快速换阻值。10. 一点不算总结的心里话回到标题说的“避坑指南”我最想传达的一句话其实是STM32F4加LAN8720这套方案能不能稳定跑起来九成取决于原理图阶段对细节的尊重程度。回头看我自己画过的几版板子凡是老老实实把去耦电容补齐、把REF_CLK走线当成宝贝供着、把PHY地址和复位时序规划清楚的基本一版就能跑通凡是图省事、觉得“别人都这么干我也这么干”的地方最后都变成了逼我熬夜查问题的坑。硬件这个东西有一个好处就是它不会骗人——你原理图哪里画错了PCB哪里布局差了它总会在某一个时间点、某一种工况下诚实地暴露给你。希望这篇从头到尾的实操记录能帮你在做以太网项目时少走一些我已经走过的弯路。如果你是第一次画这类板子建议把第6节的自检清单打印出来一次一条对着打勾如果你正在被奇怪的问题折磨建议直接跳到第7节速查表先定位故障边界再动手。祝所有认真对待原理图的人都能一次点亮。
返回列表