ARTICLE DETAIL

资讯详情

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

STM32F407+LAN8720A以太网PHY硬件设计:原理图到PCB布局全解析

STM32F407+LAN8720A以太网PHY硬件设计:原理图到PCB布局全解析 去年给一位客户做STM32F407控制板原理图和PCB改了三轮前两版都卡在同一个地方——以太网PHY电路。第一版打样回来网口灯完全不亮量了一圈才发现LAN8720A的时钟配置方向搞反了第二版Link灯倒是亮了但ping包丢得厉害最后定位到差分对走线和参考平面问题。第三版稳定量产之后我把这过程中反复翻车又反复验证的经验整理成了这篇文章重点讲清楚LAN8720A这颗PHY在F407平台上从原理图设计到布局优化再到上电调试的完整链路。这篇文章适合正在画F407网口电路、或者板子回来网口不通正在排查的硬件工程师看。内容不绕弯子从选型理由、时钟复位电源三个命门、最小系统逐信号拆解、网络变压器端接、PCB布局约束到最后的调试排查链路每一步都按实际项目里会遇到的顺序展开。你可以把这篇文章当成一份“照着画就能少踩坑”的LAN8720A工程笔记。1. 为什么这块板子的网口选了LAN8720ARMII选型与硬件架构1.1 先想清楚一件事F407到底缺什么STM32F407内部集成了以太网MAC控制器但MAC只是“数据链路层”的大脑它不负责把数字信号变成差分模拟信号往网线上送。要让网口真正工作必须外挂一颗PHY芯片MAC通过MII或RMII接口和PHY对接PHY负责编码、收发模拟差分信号、自动协商等脏活累活。所以第一步不是打开EDA工具画图而是选一颗合适的外部PHY。这里最经典的搭配就是F407加LAN8720AST自家的评估板和大量第三方开发板都用这个组合配套的HAL库驱动、LwIP例程也最全出了问题查资料的成本最低。1.2 为什么是RMII而不是MIIF407的MAC接口支持MII和RMII两种方式区别很直接MII需要16根数据/控制信号接口时钟25MHzRMII把数据线从8位砍到2位总共只需7根信号接口时钟固定50MHz。对于10/100M以太网RMII用两倍时钟换来了接口引脚减半这在F407这种IO紧张的芯片上意义很大。尤其是当板子上还要接LCD、SD卡、CAN、串口时省下的9个引脚足够多挂一路外设了。所以只要不是特别在意MII的某些特性F407方案基本都走RMII。RMII模式下F407和PHY之间需要连接如下7根信号TXD0、TXD1发送数据线TX_EN发送使能RXD0、RXD1接收数据线CRS_DV载波侦听/数据有效这是RMII复用的关键信号REF_CLK50MHz参考时钟由PHY或MAC侧提供。1.3 和DP83848、YT8512H放在一起看LAN8720A赢在哪画图前我其实对比过三颗常用PHYTI的DP83848、国产的YT8512H以及Microchip原SMSC的LAN8720A。它们在F407平台都能用但各有脾气对比项LAN8720ADP83848YT8512H封装QFN24小LQFP48大QFN32中等接口模式仅RMIIMII/RMII可选RMII为主时钟方案25MHz晶振内部PLL倍频出50MHz通常需要25MHz或50MHz时钟类似LAN8720A内置LDO有VDDCR 1.2V内部生成部分版本无需外部供电有资料丰富度ST例程多社区量大老牌但封装大国产资料相对少价格便宜且稳定偏贵最便宜DP83848性能没问题但LQFP48封装占了太多面积而且MII模式在F407这种场景下接口信号多到没必要。YT8512H价格低板子上用也行但资料和调试经验明显少一截遇到问题只能自己啃手册。LAN8720A的QFN24封装非常小板上空间省内置1.2V稳压器意味着3.3V单电源就能跑Auto-MDIX自动翻转还能容忍网线做错或接错交叉线。综合算下来LAN8720A是F407平台上“性价比和可靠性平衡得最好”的选择。1.4 硬件分层从MAC到RJ45的完整链路原理图上看起来是F407直接连RJ45实际上中间隔了四层第一层F407的MAC运行LwIP或裸机协议栈第二层RMII接口总线连到PHY第三层LAN8720A完成编解码、跳变、自动协商第四层网络变压器和RJ45实现电平耦合与隔离。LAN8720A虽然是PHY但它的引脚分了三组数字接口RMII、SMI、控制引脚复位、时钟、PHY地址、模拟差分引脚TX_P/TX_N/RX_P/RX_N。原理图画得好不好就看这三组信号是否各归其位、有没有健壮的外部电路配合。2. 时钟、复位、电源三件事很多板子翻车就翻在这2.1 时钟方案50MHz REF_CLK到底从哪来网上关于F407和LAN8720A的讨论里出现频率最高的问题就是REF_CLK怎么接。这里有两个方案很多人混淆画错了板子回来就傻眼。方案A25MHz无源晶振接LAN8720A的XI/XOLAN8720A内部PLL把25MHz倍频到50MHz然后从REF_CLK引脚输出50MHz给F407。这是ST例程和大多数开发板采用的方案也是我推荐的方案。方案B由F407的MCO1输出50MHz时钟接到LAN8720A的REF_CLK/X1引脚PHY工作在从模式不接晶振。区别必须讲清楚方案B看着能省一颗晶振但F407主频168MHz时想从PLLQ分频得到精确50MHz并不容易。MCO1输出的时钟源自PLLQPLLQ还要兼顾USB的48MHz需求两者很难同时满足。LAN8720A虽然允许外部直接注入50MHz但设计者往往卡在时钟源分频配置上板子回来之后PHY反复无法建立Link最后还得回头改晶振方案白白浪费一版PCB。所以我的建议是LAN8720A方案老老实实用25MHz无源晶振把生成50MHz的活交给PHY内部PLL。这颗PLL本质上就是个锁相环25MHz参考输入内部倍频到50MHz作为RMII的基准时钟只要晶振精度够、负载电容匹配50MHz输出很稳。晶振的负载电容一般选18pF到22pF具体看晶体手册的CL值。有些同学为了省事不焊电容结果实测REF_CLK频率漂移网口丢包严重这是典型的省小钱花大钱。2.2 复位电路别只放个上拉电阻就完事LAN8720A的NRST引脚是低有效复位。网上很多参考电路就放一个10k上拉到3.3V看起来能工作但上电时序没保障如果复位释放太快PHY内部寄存器还没初始化完成后续配置就可能失败。我常用的结构是10k上拉电阻加1uF对地电容形成RC延时复位。算一下时间常数τ R × C 10kΩ × 1uF 10ms按5τ计算复位释放大概在50ms左右足够覆盖电源稳定时间。如果板上还有其他芯片需要复位比如交换芯片或传感器可以把这路RC复位后接一个非门或复位IC统一分配保证时序一致。另外要提醒一句有些PHY对复位释放后到MDIO可访问的时间有要求手册里通常会写一个最小值比如“复位释放后至少等待xx毫秒再通过SMI访问”。这个等待要在软件里做不要在硬件上死磕。2.3 电源去耦VDD、VDDIO、VDDCR各管一路LAN8720A电源引脚有讲究不是所有引脚都直接接3.3V就行。VDD主电源3.3VPHY内部数字逻辑用电旁边放10uF和0.1uF电容并联去耦VDDIOIO口电源决定RMII和MDIO引脚的电平F407是3.3V系统所以VDDIO也接3.3V就近配0.1uF电容VDDCR内部1.2V稳压器输出引脚这个不是输入电源而是内部LDO的输出需要外部接低ESR电容典型值2.2uF而且电容必须尽可能靠近VDDCR引脚放置。很多人第一次画LAN8720A会把VDDCR当成需要外接1.2V的电源引脚直接给个固定电平板子一上电PHY就发烫量VDDCR发现不是内部正常输出的1.2V而是被外部电源顶住了。这就是没看手册“VDDCR is an output”的代价。电源设计我给一份可以直接抄的清单电源网络电压推荐电容组合备注VDD3.3V10uF 0.1uF就近PHY电源脚VDDIO3.3V0.1uF靠近VDDIO引脚VDDCR1.2V输出2.2uF低ESR贴VDDCR引脚附近钽电容或X5R陶瓷均可如果板子上模拟、数字电源敏感可以在3.3V进入PHY电源区前加一颗磁珠600欧姆/100MHz规格就够。但注意VDDCR输出电容不要加磁珠它是内部LDO的补偿电容串了磁珠可能导致LDO不稳定实测会频繁复位。3. 逐信号走一遍LAN8720A最小系统原理图该拉高拉高该就近接地3.1 RMII数据接口TXD0/TXD1/TX_EN/RXD0/RXD1/CRS_DV先看发送侧。F407的ETH_TXD0、ETH_TXD1连接到PHY的TXD0、TXD1ETH_TX_EN连到PHY的TX_EN。这三根信号都是F407输出、PHY输入直接用10k上拉或下拉的都不对正常工作时由MAC驱动。接收侧反过来PHY的RXD0、RXD1、CRS_DV输出给F407的ETH_RXD0、ETH_RXD1、ETH_CRS_DV。这组信号在F407侧是输入不需要上拉。有个容易忽略的细节CRS_DV在RMII模式下把载波侦听和数据有效合并到一根线上没有CRS和RX_DV分离的信号所以原理图库选封装时一定要确认用的PHY是RMII版本引脚排列别把MII/RMII版本信号名搞混。3.2 管理接口MDIO、MDC、PHY地址和中断MDIO是SMI管理接口的数据线双向开漏外部必须接上拉电阻典型值4.7k到3.3V。MDC是管理时钟由MAC侧输出不需要上拉。这两根线是调试时最重要的窗口所有PHY寄存器的读写都靠它一旦MDIO上拉漏画或贴错阻值F407读不到PHY ID以太网驱动就永远初始化失败。PHY地址配置是另一大坑。LAN8720A的SMI地址由PHYAD0引脚电平决定低位的0/1前缀固定。把PHYAD0接到GNDPHY地址就是0x00如果上拉到3.3V地址就是0x01。ST官方驱动里默认PHY地址常写成0所以大多数开发板都把PHYAD0下拉到地。如果板子上SMI总线上挂了多个PHY那就要给不同PHY分配不同地址PHYAD0是其中之一设计多个PHY共存时先规划好地址分配表。nINT中断引脚可以接F407的一个EXTI输入用来快速感知PHY链路变化但不是必须的。如果省掉这脚软件也可以通过轮询寄存器状态来获得Link变化代价是增加一点CPU开销。3.3 LED指示nLED0和nLED1不是摆设LAN8720A有nLED0和nLED1两个指示引脚默认映射是nLED0链接/活动指示Link/ActivitynLED1速率指示Speed。设计原理图时建议各串一个限流电阻接LED到3.3V电阻选1k到2.2k根据LED亮度微调。这两个LED在上电调试阶段价值极大nLED0不亮说明物理链路没建立优先查变压器、差分线、对端设备nLED0亮但nLED1状态不对比如协商到100M时速率灯不亮PHY寄存器配置可能有误插拔网线时nLED0闪烁说明PHY正在重新协商。所以不要为了省两个LED而把这组引脚悬空它比串口打印更快反映物理层状态。3.4 差分接口TXP/TXN/RXP/RXN连接网络变压器时TXP/TXN是PHY发送差分对RXP/RXN是接收差分对。这里注意原理图封装里的TXP/TXN和RXP/RXN在PCB上必须严格按差分对布线不能为了绕线随意交叉交换。虽然LAN8720A有Auto-MDIX能自动适应直连线和交叉线但那是针对“网线两端插错”的情况不是让你在PCB上随便把差分对调换。3.5 最小系统逐脚配置总表下面这份表格是我每次画LAN8720A原理图都会对着核对一遍的清单直接参考引脚分组引脚名方向接法发送数据TXD0/TXD1输入接F407 ETH_TXD0/TXD1发送使能TX_EN输入接F407 ETH_TX_EN接收数据RXD0/RXD1输出接F407 ETH_RXD0/RXD1载波/数据有效CRS_DV输出接F407 ETH_CRS_DV参考时钟REF_CLK输出/输入晶振方案时输出50MHz给F407管理数据MDIO双向4.7k上拉到3.3V接F407管理时钟MDC输入接F407不上拉PHY地址PHYAD0输入下拉到GND地址0或上拉地址1中断nINT输出可接F407 EXTI也可悬空LEDnLED0/nLED1输出串1k~2.2k电阻接LED到3.3V晶振XI/XO—25MHz晶振18pF~22pF负载电容复位nRST输入10k上拉 1uF对地电容到GND电源VDD/VDDIO—3.3V就近电容去耦LDO输出VDDCR输出2.2uF低ESR电容到GND4. 网络变压器和RJ45差分对、中心抽头与Bob Smith端接4.1 集成变压器RJ45还是分立变压器加网口LAN8720A本身没有内置网络变压器PHY出来的差分信号不能直接推给RJ45必须经过隔离变压器。工程上有两条路用带集成变压器的RJ45座比如HR911105A这类型号座子内部已经集成了变压器和共模电感外围电路只需少量端接电阻电容省地方也省事用分立网络变压器比如HX1188NL加普通RJ45座灵活性高方便更换变压器型号但占用PCB面积更大。F407板子如果空间够我倾向于分立方案如果是小尺寸核心板直接用集成变压器RJ45更省心。集成变压器有好有差尽量选品牌货杂牌变压器绕线工艺不到位差分共模抑制不好Link灯能亮但EMC测试过不了的情况我见过不止一次。4.2 中心抽头接法最容易画错的地方网络变压器的初级和次级都有中心抽头接法不能想当然。LAN8720A这类电压型驱动的PHY变压器PHY侧中心抽头通常接VDDIO 3.3V并就近放一个0.1uF高频电容到地给共模电流提供返回路径。线路侧中心抽头则要接Bob Smith端接网络不能直接空着或直接接地。很多参考电路把线路侧中心抽头直接接地插上网线Link灯也可能亮但绕线电缆带来的共模噪声没有泄放路径长期工作或过雷击浪涌时容易损坏PHYEMC测试也会冒出莫名其妙的超标项。4.3 Bob Smith端接为什么需要那组电阻和电容Bob Smith端接是标准的线路侧端接方案一般用四个75欧姆电阻组成星形网络接在RJ45的差分线对和中心抽头之间然后再通过一个高压电容1nF/2kV左右接地。原理不复杂RJ45差分线在空闲或共模激励时75欧姆电阻提供一个阻抗匹配路径把共模信号引到“虚拟地”再通过高压电容泄放到大地。这个电容还要承担隔离作用所以耐压值必须够2kV是常规选择。具体参数以你选的RJ45座或变压器规格书推荐值为主但结构基本就是75Ω网络加高压电容到地。这一小堆元件别省略也别把它们放得离RJ45座太远否则端接效果打折。4.4 静电和浪涌防护TVS选型要小心寄生电容网口会暴露在机壳外面热插拔网线时容易引入静电放电所以原理图上最好在变压器线路侧加TVS保护。常用型号有SRV05、LC03CI这类低电容TVS阵列。这里有个矛盾点TVS的寄生电容会影响差分信号质量。普通TVS电容可达几百皮法放在百兆差分对上会导致信号边沿变差、误码率上升。选型时优先看“电容小于5pF”的型号才适合以太网高速信号。如果板子防护等级要求不高甚至可以不加TVS纯靠网络变压器隔离。4.5 共模电感是否需要部分参考电路会在PHY和变压器之间串共模电感。LAN8720A应用笔记里并没有强制要求但在有较强电磁干扰的工业环境中加一对共模电感能明显改善EMI。占用一点空间和成本效果值得。普通消费类板子可以不加我自己的经验是有过EMC整改需求的板子就加上没把握的场合也加上成本就几毛钱。5. 原理图之外的布局约束差分线、参考面与晶振位置5.1 差分对才是真正的“原理图”原理图画得再完美PCB布局布线时把差分对走成两根平行直线然后被过孔、撕裂、跨分割打断网口照样工作不稳定。原理图只能表达电气连接关系而高速信号的物理实现全在PCB上所以我把布局布线称为“第二张原理图”。LAN8720A在百兆速率下严格说差分对的等长要求没有千兆那么苛刻但至少要做到TX差分对和RX差分对内等长长度差最好控制在5mm以内差分对之间拉开间距避免串扰全程优先走表层不要频繁换层差分对下方必须有连续参考平面严禁跨地分割。阻抗控制方面四层板时把差分对设置为100欧姆差分阻抗常规工艺下线宽和间距大概在0.15mm/0.15mm附近但具体数值要结合叠层计算别直接照抄网上的参数。5.2 晶振位置靠近XI/XO其他信号绕道25MHz晶振和两个负载电容是PHY时钟的来源它们在PCB上的摆放位置直接影响REF_CLK的稳定度。我见过晶振放在板子另一侧走线绕了大半个板子到PHY的情况结果是PHY能Link但速率协商不稳定10M能通100M就丢包。正确的布局是晶振和负载电容紧贴LAN8720A的XI/XO引脚走线尽量短晶振区域下方铺地并在周围打一圈过孔形成“地围栏”高速信号线、电源开关节点远离晶振区域避免干扰REF_CLK到F407的走线保持短直可加一小段地包边。5.3 去耦电容的位置比容值更重要原理图里电源电容画了一大堆PCB上如果不能靠近对应引脚效果等于没有。VDD、VDDIO、VDDCR三组电容都要放在各自引脚的正下方或紧邻位置走线先到电容再到引脚而不是从电源平面引出来绕一圈。这里有个实操技巧做封装时把去耦电容放在IC引脚附近而不是库里的默认位置强制自己在布局阶段就照顾到电源回流路径。5.4 变压器区域的地平面处理网络变压器底下要不要铺地、怎么铺是个被反复讨论的问题。我的做法是变压器下方的PCB内层地平面挖空一部分避免变压器初级侧的噪声通过平面耦合到次级PHY侧和RJ45侧各自的地尽量保持单点连接或通过电容桥接如果是集成变压器RJ45座子下方地平面也建议局部挖空同时注意外壳接地引脚单独处理不要直接和数字地大面积粘连。这个细节不影响“点亮”但对EMC和静电测试影响很大。做认证的板子尤其要注意原理图上看不出来的差别最后都会在测试报告里暴露。6. 打样回来之后的调试链路从Link灯到SMI寄存器6.1 先按顺序量不要上来就跑PING板子焊好之后第一步不是烧LwIP例程而是按下面的链路逐步确认量电源3.3V在不在VDDCR是不是1.2VPHY芯片是否异常发热量复位nRST是否已经释放为高电平量时钟用示波器或频率计量REF_CLK确认有50MHz输出插网线看nLED0和nLED1状态确认PHY自身能否建链读寄存器通过MDIO读PHY ID寄存器确认MCU和PHY之间的SMI通信正常跑PING最后才做协议层测试。这套顺序的逻辑很简单每一层都是下一层的前提。电源都不正常后面全白费时钟不对Link灯根本不会亮SMI不通软件连PHY在哪都不知道还谈什么配置。6.2 通过MDIO读PHY ID验证SMI链路SMI读写是排查LAN8720A问题的利器。F407的HAL库有现成的HAL_ETH_ReadPHYRegister函数初始化时回读LAN8720A的PHY ID寄存器期望值是寄存器2读到0x0007寄存器3读到0xC0F1PHY ID整体为0x0007C0F1。如果读不到或者读出来是全F先查MDC/MDIO接线有没有焊错、虚焊再查MDIO上拉电阻是否贴错然后查PHY地址配置是否和代码一致最后检查PHY是否处于复位状态。以实际经验读ID失败80%以上都是PHY地址没对上。6.3 常见问题现象、根因和处理对照表现象可能根因排查/处理上电PHY发烫VDDCR被外部供电或短路断开VDDCR外部电路确认它是1.2V输出REF_CLK无信号晶振没起振、负载电容错、晶振引脚虚焊示波器量XI/XO和REF_CLK换晶振排查nLED0不亮变压器中心抽头接错、差分线断、对端设备未上电检查端接网络换网线直连交换机LED正常但PING不通SMI配置失败、PHY地址错、软件初始化时序不对读PHY ID查看RMII信号是否全部正确连接PING丢包严重差分线不等长、跨分割、晶振干扰、共地不良检查PCB布局测试差分阻抗优化参考平面协商速率不稳REF_CLK频率不准量频率检查晶振和负载电容6.4 STM32CubeMX配置里需要注意的两个位置CubeMX中主要涉及两处配置。第一处是以太网外设选择RMII接口外部PHY地址填你在硬件上的设置PHYAD0拉低填0、拉高填1。第二处是时钟如果走LAN8720A晶振方案RMII的50MHz来自PHYCubeMX里不需要额外配置MCO输出如果用了MCO送时钟方案才需要单独把MCO1引脚配置成对应频率输出。另外HAL库的以太网驱动里一般需要把PHY地址宏改成实际值比如LAN8720A地址为0时把ETH_PHY_ADDRESS或类似宏定义改成0。很多“灯亮但初始化失败”的问题就出在这里代码里默认的PHY地址是其他值和硬件对不上。6.5 两块板子做背靠背测试时的经验如果需要调试两块F407板子之间的以太网通信可以直接把两套PHY加网络变压器背靠背连接中间用短网线或RJ45座对接。注意至少一端要插到交换机/PC上确认协商结果否则两边如果配置不对都会陷入反复协商。PHY芯片背靠背测试是验证硬件和驱动的好方法但别用它替代真实网络环境的稳定性测试。最后再说一句实话这块板子的第三版其实只改了两处把REF_CLK相关时钟方案彻底固定为25MHz晶振输出以及重排了网络变压器区域的布线和地平面。改动量不大但网口从“偶尔能通”变成了“怎么插都稳”。回过头看LAN8720A原理图并没有多复杂复杂的是那些容易被当成“参考而已”的细节——时钟方向、中心抽头、地址电平、电容位置、差分参考面。把这些细节当回事这块板子你就能一次点亮不当回事多半就在调试台上多熬几个通宵。
返回列表