资讯动态

STM32F407+LAN8720A以太网硬件设计实战:从原理图到PCB调试

发布时间:2026/10/6 11:13:44 来源:尧图企业网站定制
做嵌入式联网项目STM32F407配LAN8720A几乎是绕不开的组合。F407自带MAC控制器外部PHY选LAN8720ARMII接口下只占7根信号线单3.3V供电成本也压得下来这几年工业采集网关、串口服务器、测试板卡上到处都能看到这套搭配。但恰恰是这种“参考手册照抄就能用”的方案实际画板时坑不少X1/X2时钟走有源还是无源、TXD和TX_EN之间要不要做等长、变压器中心抽头接到哪、PHY地址到底是0还是1……这些细节一旦翻车轻则网口插上不识别重则PHY发烫、整板功耗异常。这个项目本身不是多复杂的大板子但正好踩遍了以太网PHY硬件设计的主要雷区。如果你正要画F407的板子或者已经在调试LAN8720A死活不通这篇内容值得花几分钟看完。我会从选型逻辑、原理图每个引脚、外围变压器、PCB布局到联调验证一条龙讲清楚重点放“为什么这么做”而不是只给你一份能抄的图纸。1. 方案选型为什么F407工程师多数选了LAN8720A1.1 F407以太网外设与PHY的基本分工STM32F407内部集成了以太网MAC控制器但物理层信号收发做不了需要一颗外部PHY芯片来干活。MAC和PHY之间的接口有MII和RMII两种模式MII需要16根信号线数据总线是4位的TXD[3:0]和RXD[3:0]还要单独引出TX_CLK、RX_CLK、RX_DV、RX_ER、CRS、COL等控制信号引脚占用非常大对F407这种QFP100/144封装的芯片来说佈线压力不小。RMII模式把数据线砍到2位收发一共只需要TXD[1:0]、RXD[1:0]、TX_EN、CRS_DV和REF_CLK这7根信号线100Mbps带宽下用50MHz时钟就能跑满。说白了RMII就是用“提高PHY侧时钟频率”来换“减少MCU引脚占用”。F407的ETH外设这两种模式都支持我在实际项目里基本都选RMII因为省下的引脚能留给人机交互、传感器采集、RS485扩展这些更有价值的功能。LAN8720A是SMSC现在是Microchip旗下主打低功耗的百兆以太网PHY内置1.2V稳压器单3.3V供电就能工作不需要额外的1.2V电源平面。官方标称正常工作电流大概六七十毫安实际跑起来也就几十mA量级配合F407做低功耗网关非常合适。它支持Auto-MDIX自动翻转、自协商、节能以太网这些常规功能封装是QFN24体积很小适合对板面积敏感的产品。1.2 与DP83848、KSZ8081、YT8512H的横向对比有人会问为什么不用Ti的DP83848或者Microchip自家的KSZ8081还有国产的YT8512H这里我把几个常见方案放在一起对比一下PHY芯片接口供电功耗典型值封装参考设计复杂度LAN8720ARMII3.3V单电源约70mAQFN24低内置稳压器DP83848IMII/RMII3.3V需额外注意模拟/数字电源隔离约110mALQFP48中等引脚多KSZ8081MII/RMII3.3V单电源约70mAQFN32低和LAN8720A接近YT8512HMII/RMII3.3V单电源约70mAQFN32低兼容类设计从参数看LAN8720A并不是性能最强的那颗但它的优势在于应用时间久、参考电路验证充分、价格便宜、QFN24封装小而且F407官方评估板以及网上大量开源项目都默认用这颗芯片遇到问题很容易找到对照资料。DP83848虽然是经典老将稳定性和温度范围不错但封装大、外围去耦要求高对多数中小项目来说“没必要”。KSZ8081和LAN8720A基本是同级别替代引脚不直接兼容需要改原理图。YT8512H这几年在一些国产方案里也不少晶振电路和寄存器初始化略有差异新手不建议拿来做首板。另外注意这些PHY基本都是电压型PHY差分线可以直接和变压器对接不需要额外加偏置电阻而部分老款电流型PHY需要外部电阻提供直流偏置接法完全不同。选型时如果看到别人设计里差分线上串了一堆电阻先确认是阻抗匹配还是电流型PHY的偏置需求别盲目照抄。2. LAN8720A原理图核心每个引脚都在干什么2.1 RMII接口信号与引脚规划RMII模式下LAN8720A与F407相连的关键信号主要有以下几组TXD[1:0]发送数据MCU侧输出到PHY由F407的ETH_TXD0/ETH_TXD1驱动传输速率100Mbps时有效数据位2位10Mbps时仍按2位传输只是时钟频率降低。TX_EN发送使能高电平表示TXD上的数据有效必须和TXD[1:0]同步变化。RXD[1:0]接收数据PHY输出给F407不需要额外时钟线数据随REF_CLK同步。CRS_DV载波侦听/数据有效复用线在RMII模式下同时承载CRS和RX_DV两个信息PHY内部处理后由这根线输出给MCU的ETH_CRS_DV引脚。新手最容易在这里踩坑把CRS_DV接到F407的RX_DV专用引脚上导致接收路径完全不通。MDC/MDIO管理接口用于读写PHY内部寄存器MCU通过MDC时钟线和MDIO双向数据线完成配置。原理图阶段我建议在每个RMII信号线上预留串联电阻位阻值22到33Ω位置放在靠近MCU一侧。这么做有两个好处一是高速信号的振铃能被适当抑制二是调试时可以直接断开某一路信号方便用示波器单个排查。除了串阻还要在F407侧给这些信号预留测试点特别是TXD[0]、TXD[1]、TX_EN、CRS_DV四根线。后面联调时如果ping不通首先要确认的就是这四个信号在PHY引脚上有没有正确的电平翻转。2.2 时钟方案50MHz外部时钟和无源晶振怎么选LAN8720A的X1/X2引脚支持两种时钟输入方式这也是原理图设计中最容易纠结的地方。第一种是外部50MHz时钟直接接到X1X2悬空。这里的时钟必须是有源时钟或者MCU输出的时钟信号不能是无源晶振。STM32F407的MCO1引脚PA8可以配置输出PLL时钟当系统时钟为168MHz、PLL分频配置合适时MCO1正好可以输出50MHz。把这个时钟接到LAN8720A的X1就实现了MCU和PHY共用一个时钟源省掉一颗晶振还避免两个独立晶振之间的频率偏差。第二种是25MHz无源晶振接X1/X2由LAN8720A内部PLL倍频产生50MHz的REF_CLK。这种方案下如果F407侧需要REF_CLK可以让PHY的REF_CLK输出给MCU也可以再单独用一颗50MHz有源晶振给MCU但这样就有两个时钟源设计冗余且可能存在相位抖动问题。我个人的选择是优先用F407的MCO1输出50MHz给LAN8720A原理图简单、时钟同源调试时也只要量一个点。注意MCO1输出要和GPIO复用功能配置正确CubeMX里选ETH外设时如果勾选了RMII会提示MCO1引脚冲突直接按工具分配即可。如果PA8被其他功能占用就老实使用25MHz无源晶振加PHY内部PLL方案不再用双时钟源。无源晶振方案需要注意负载电容匹配LAN8720A数据手册推荐值一般是18pF或22pF具体以晶振厂家规格为准。晶振两端建议各对地接一个电容晶振本体尽量靠近X1/X2引脚PCB上不要打过孔晶振下方不要走其他信号线。2.3 电源、去耦与PHY地址配置LAN8720A的电源引脚分几类VDD和VDDIO通常统一接3.3V负责芯片数字和I/O供电VDDCR是内部1.2V核心电压的输出引脚不是输入这个特别容易被搞反。VDDCR外部只需要加去耦电容绝对不能把3.3V直接灌进去否则芯片大概率直接烧坏或者严重发烫。去耦电容的摆放原则是每个电源引脚就近放一个0.1uF陶瓷电容电容到电源引脚走线尽量短最好直接打过孔扇出芯片背面或电源入口处再加一个4.7uF到10uF的钽电容做低频储能。很多人在原理图上画了电容但Layout时放得离引脚很远结果等于没放。PHY地址通过PHYAD0引脚配置把PHYAD0拉低MDIO地址为0拉高地址为1。绝大多数STM32以太网驱动和CubeMX配置默认PHY地址为0如果你的板子为了布线方便把PHYAD0拉高了后续软件初始化就一定会卡在PHY复位或读取ID超时。所以原理图阶段就要把PHYAD0的接法固定下来并在工程文档里记清楚。LAN8720A还有几个复合功能引脚比如nINT/REGOFF这类它们同时承担中断输出、内部LDO关断控制等作用必须严格按参考设计接不能想当然当普通GPIO随便拉高拉低。我见过有人把REGOFF误接高电平导致内部稳压器被关断整个PHY根本没有核心供电网口自然完全没反应。3. 外围关键电路网络变压器、RJ45与ESD防护3.1 网络变压器的作用PHY芯片的差分信号线不能直接接到RJ45插座上中间一般要经过网络变压器。变压器在这里起了多重作用电气隔离把PHY侧的地和外部网线地彻底隔开防止共地环路带来的干扰和安全隐患共模抑制网线在长距离传输中会感应各种共模噪声变压器通过共模扼流圈结构把这些噪声滤掉阻抗匹配保证差分信号在PHY、变压器、网线之间保持100Ω特征阻抗减小反射。以太网差分信号本质上是带直流偏置的高速信号变压器通过磁耦合把直流分量隔掉只让交流信号通过。所以不要因为“板子上空间不够”或者“只是调试用”就省掉变压器那基本上是在给自己挖坑。之前有个朋友为了省那几块钱成本直接把PHY差分线接到RJ45针脚结果只有自己和自己测试没问题跟交换机一接就疯狂丢包最后老老实实改板。RJ45可以选择集成变压器的型号比如HR911105A、RJ45带网络变压器的模组都是常见选择电气上把变压器和座子合二为一布局更省空间外围也更简洁。如果选分离方案就是一颗独立网络变压器模块如HX1188NL1:1隔离普通RJ45灵活性更高但PCB上要分开放布局要求也高。3.2 中心抽头接法不要闭眼抄参考设计网络变压器内部有两组绕组分别对应TX和RX差分对每组绕组都有中心抽头这个中心抽头的接法直接决定PHY能否正常工作。LAN8720A参考设计中中心抽头的处理方式有其默认推荐但不同变压器厂商的绕线结构可能不同最稳妥的做法是查你所选变压器型号的手册看它推荐的抽头接法。HR911105A这类集成变压器RJ45内部一般已经把中心抽头和匹配电容都处理好了外部只管连接差分对即可方便但也要确认内部结构是否与PHY匹配。分离式变压器方案则常在RJ45内侧做Bob Smith端接四对线对与地之间通过51Ω或75Ω电阻再串1000pF/2kV高压电容连到外壳地用来泄放共模干扰和静电。注意外壳地要和数字地用高压电容和大电阻跨接不能直接大面积短接防止机壳静电直接灌进板子。调试时如果出现link灯闪烁不稳定或者只有10M能通100M不通先用示波器量差分对再用万用表量中心抽头电压。很多这类问题都是中心抽头焊错位置或者焊接虚焊导致直流偏置不对PHY的接收端工作点异常信号质量很差。3.3 ESD与防浪涌设计要点以太网接口是板卡最容易遭受静电和浪涌冲击的位置因为网线常年暴露在外部插拔瞬间、雷雨天气的感应浪涌都可能从RJ45侵入。在靠近RJ45内侧放置TVS阵列是标配比如SLVU2.8-4、USBLC6-2SC6这类专为以太网设计的TVS钳位电压选5V以内的结电容尽量小几pF级别接在差分线和外壳地之间。关键点在于TVS要放在变压器的线缆侧也就是靠近RJ45那一端不能放在PHY这边。变压器隔离的是PHY和网线如果TVS放在PHY侧外部浪涌要先穿过变压器此时变压器已经出现高压击穿风险TVS就帮不上忙。另外RJ45金属外壳的固定脚要连接外壳地不要悬空。这些细节在原理图上看起来都一样但Layout和接地方式不同抗干扰能力差距非常大。4. 原理图优化与PCB布局经验4.1 从参考设计出发可以做的3处优化官方参考设计只能保证“能工作”离“好生产、好调试”还有一段距离。我在画F407LAN8720A这块板时做了几处针对性优化。第一所有RMII信号串联电阻预留测试点位。串阻选33Ω靠近MCU引脚侧放置旁边留过孔做测试点。这样调试时如果怀疑某根信号线有问题可以直接断开串阻从MCU侧和PHY侧分别测量快速定位问题。第二LAN8720A的复位电路不要只用一个简单的RC。nRST低电平有效上电后要保证复位时间足够长确保内部稳压器稳定输出。我习惯用10kΩ电阻上拉加上1uF电容到地这样上电复位时间约10毫秒足够稳妥。如果F407的复位引脚资源足够也可以用GPIO控制PHY复位CubeMX里配置一个输出引脚软件上电后延时几十毫秒再释放复位这样调试时可以随时软复位PHY。第三LED指示电路必须加限流电阻。LAN8720A的LED引脚内部驱动能力有限直接外接高亮LED不加电阻轻则亮度刺眼、影响寿命重则超过引脚最大电流。串470Ω到1kΩ电阻根据LED压降计算即可。另外LED引脚默认的极性是低电平点亮还是高电平点亮不同型号和引脚配置不一样原理图阶段就要确认。4.2 差分对、时钟信号与整板布局PCB布局上高速信号最核心的原则是信号路径要短回流路径要完整阻抗要匹配。以太网PHY到变压器这一段是真正的差分信号必须按100Ω差分阻抗布线宽和线距由叠层结构决定一般表层差分线线宽5到7mil、间距8到10mil具体用阻抗计算工具算清楚。RMII信号虽然都是单端信号但TXD[0]、TXD[1]、TX_EN这三根线建议做等长处理长度差控制在1mm以内。原因是这三个信号要同步发送如果时序偏差过大PHY侧采样时数据已经发生变化就会出现偶发丢帧、网络时延抖动。实测中如果等长差太多轻则100M不通重则自协商都不成功。地平面处理上变压器下方要掏空整个内层铜皮避免变压器线圈通过寄生电容耦合到数字地平面形成共模干扰。变压器区域的地单独划出来做EGNDEGND和主GND之间通过0Ω电阻或磁珠跨接再并联一颗高压电容增强高频隔离。PHY芯片底部散热焊盘必须接地通过多个过孔打到主地平面既散热又降低地阻抗。4.3 晶振和50MHz时钟的布局禁忌如果采用MCO1输出50MHz给PHY这路时钟线要当作高速信号对待。它不能和TXD、RXD差分线长距离并行间隔至少3倍线宽以上最好在两路信号之间加一条地线隔离。时钟线自己也要尽量短、直、少打过孔不能绕来绕去。这块板第一次Layout时MCO1走线从PHY的RXD差分对附近绕了一圈结果实测以太网丢包率很高。后来把时钟线改短、避开差分区问题才解决。凡是这类高速数字信号时钟路径的每一寸都值得认真对待。无源晶振方案更要注意晶振必须贴着X1/X2引脚放晶振下方不能走任何信号线晶振两端电容的地过孔要直接到主地平面。5. CubeMX配置与硬件联调全流程5.1 CubeMX端3个关键配置硬件画完只是开始F407的以太网外设初始化也要配合好。STM32CubeMX里打开ETH外设后选择RMII模式PHY Address这里填0要和PHYAD0引脚实际接法对应。PHY Clock选择MCO1输出50MHz工具会自动把PA8切换到复用功能并提示相关引脚冲突按提示确认即可。复位脚配置成GPIO输出比如用PA1接LAN8720A的nRSTCubeMX里把它配成GPIO Output初始电平设高或低都可以后面代码里先拉低再拉高完成复位。DMA配置建议打开收发各分配一个DMA通道减少CPU中断负担。MAC地址可以先用固定的静态地址后期再考虑从外部存储读取。这里容易忽略的是MDIO必须配置为开漏输出带上拉PHY的管理接口是双向工作机制开漏加外部上拉才能正常读写寄存器。CubeMX里MDIO对应的GPIO要选开漏模式内部上拉默认打开一般够用如果板子上MDIO走线较长建议在原理图上再外接一个2.2kΩ上拉电阻。5.2 上电后按顺序做的5分钟验证拿到新板子不要急着跑网络协议栈按下面的顺序做验证能省大量排查时间。第一步测电源。用万用表量3.3V是否正常量LAN8720A的VDDCR引脚电压应该在1.2V左右。如果VDDCR是0V先检查3.3V有没有到芯片再怀疑焊接问题如果VDDCR接近3.3V马上断电查是不是把外部电源错接到了VDDCR引脚。第二步示波器看50MHz时钟。找到PHY的X1引脚或REF_CLK引脚用示波器量有没有稳定的50MHz方波或正弦波叠加上直流。没有时钟说明MCO1配置不对或晶振没起振此时后面所有验证都不用继续。第三步量RMII信号。用示波器或逻辑分析仪看TXD、TX_EN、CRS_DV在MCU初始化后是否有信号翻转。特别注意CRS_DV在空闲时是低还是高它应该和PHY状态一致。第四步插网线看link状态。接上交换机或电脑网口看LAN8720A的link LED是否常亮或闪烁注意锁定LED极性和工作模式。第五步读PHY寄存器。通过MDIO接口读取PHY IDLAN8720A应该能读到OUI和Model ID组合出来的固定值。能读回ID说明MDIO管理通道正常链路物理层已经工作。// 以F407的LwIP驱动为例读取PHY ID寄存器 uint32_t phy_id 0; // LAN8720A的寄存器2是PHYIDR1寄存器3是PHYIDR2 uint32_t idr1 ETH_ReadPHYRegister(0, 2); // PHY地址0寄存器2 uint32_t idr2 ETH_ReadPHYRegister(0, 3); // PHY地址0寄存器3 phy_id (idr1 16) | idr2; // LAN8720A的IDR1/IDR2组合结果应能识别为LAN8720A家族5.3 软件调试中容易踩的三个坑第一个坑是PHY地址不一致硬件PHYAD0引脚拉低了软件里却填地址1MDIO读写全部超时。CubeMX里的PHY Address要和硬件一一对应如果改了硬件跳线软件也要跟着改。第二个坑是MDIO没有上拉。MDIO是双向开漏信号必须有上拉电阻才能正常拉高。F407内部上拉通常能用但自己在原理图上加一颗2.2kΩ到3.3V最稳妥。之前调一块板子时MDIO走线穿过了一个排针区域寄生电容比较大内部上拉不够导致读寄存器随机失败补了外部上拉后正常。第三个坑是复位后没有延时。PHY上电后内部需要时间完成自校准和稳压器启动上电或复位释放后至少要延时10毫秒再访问寄存器。很多驱动代码里复位后紧接着就访问PHY导致初始化失败。我习惯在PHY复位释放后直接延时20毫秒稳一点没坏处。6. 常见问题与排查技巧实录6.1 问题速查表现象可能原因排查顺序插网线link灯完全不亮PHY供电、时钟、复位不正常或变压器中心抽头接错量3.3V和VDDCR电压示波器看50MHz时钟检查复位电平最后量变压器引脚link灯亮但ping不通RMII信号线接错、MDIO配置错误、软件PHY地址不对确认CRS_DV接的是ETH_CRS_DV而非RX_DV检查CubeMX里PHY地址和MDIO引脚只有10M能通100M不通差分对阻抗不匹配或变压器中心抽头偏置不对或TX信号等长差太多检查差分线阻抗量中心抽头电压核对TXD[1:0]和TX_EN布线长度偶尔丢包、ping时延抖动时钟质量问题、地平面分割、相邻信号串扰示波器看MCO1时钟抖动检查变压器区是否掏空铺铜检查时钟线是否靠近差分线PHY芯片发烫VDDCR外接错电源、电源去耦不足、引脚焊接短路断电万用表量各电源引脚对地阻值排查焊接连锡核对VDDCR接法只有自己的板子不通换别人板子正常PHY复位时序不够、软件配置问题在PHY复位后加长延时确认软件PHY地址、时钟配置匹配6.2 一次“玄学”问题的排查实录这块板子调试时也遇到了一个非常典型的疑难杂症网线插上link灯正常亮自协商能过但ping包偶发超时重试几次又能通。一开始怀疑软件问题把LwIP参数来回调没解决。后来用示波器抓PHY的RXD信号发现接收数据在个别字节上有毛刺正好发生在差分线经过变压器到RJ45的那一段。用万用表逐个点量RJ45母座引脚对地阻值发现其中一个差分对引脚对地阻值比理论值低了接近一倍拆下来看是RJ45座子焊接时锡膏桥接把中心抽头和其中一个差分脚之间拉了一条毛刺。这类问题最难的地方在于它不稳定时好时坏。经验是先分层——物理层、数据链路层、网络层一步步隔离再结合示波器看信号质量不要一上来就怀疑协议栈。后面我把RJ45封装改成底部开大窗的手工焊盘彻底杜绝了焊接桥接隐患再也没出现过类似丢包。这个板子的经验也是我在后续所有以太网项目里一定会执行的一条原则LAN8720A外围电路尽量照官方参考设计走但每处接法的“原因”必须自己搞清楚。中心抽头为什么接这里、时钟为什么从MCO出、串阻为什么要预留全弄明白了以后再换PHY芯片、再画新板子都不会被同一批问题绊住。如果你现在正在调F407LAN8720A把上面这些点挨个核对一遍大概率能少熬好几个通宵。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑