去年给一位客户做STM32F407控制板,原理图和PCB改了三轮,前两版都卡在同一个地方——以太网PHY电路。第一版打样回来,网口灯完全不亮,量了一圈才发现LAN8720A的时钟配置方向搞反了;第二版Link灯倒是亮了,但ping包丢得厉害,最后定位到差分对走线和参考平面问题。第三版稳定量产之后,我把这过程中反复翻车又反复验证的经验整理成了这篇文章,重点讲清楚LAN8720A这颗PHY在F407平台上从原理图设计到布局优化再到上电调试的完整链路。
这篇文章适合正在画F407网口电路、或者板子回来网口不通正在排查的硬件工程师看。内容不绕弯子,从选型理由、时钟复位电源三个命门、最小系统逐信号拆解、网络变压器端接、PCB布局约束,到最后的调试排查链路,每一步都按实际项目里会遇到的顺序展开。你可以把这篇文章当成一份“照着画就能少踩坑”的LAN8720A工程笔记。
1. 为什么这块板子的网口选了LAN8720A:RMII选型与硬件架构
1.1 先想清楚一件事:F407到底缺什么
STM32F407内部集成了以太网MAC控制器,但MAC只是“数据链路层”的大脑,它不负责把数字信号变成差分模拟信号往网线上送。要让网口真正工作,必须外挂一颗PHY芯片,MAC通过MII或RMII接口和PHY对接,PHY负责编码、收发模拟差分信号、自动协商等脏活累活。
所以第一步不是打开EDA工具画图,而是选一颗合适的外部PHY。这里最经典的搭配就是F407加LAN8720A,ST自家的评估板和大量第三方开发板都用这个组合,配套的HAL库驱动、LwIP例程也最全,出了问题查资料的成本最低。
1.2 为什么是RMII而不是MII
F407的MAC接口支持MII和RMII两种方式,区别很直接:
- MII需要16根数据/控制信号,接口时钟25MHz;
- RMII把数据线从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_CLK:50MHz参考时钟,由PHY或MAC侧提供。
1.3 和DP83848、YT8512H放在一起看,LAN8720A赢在哪
画图前我其实对比过三颗常用PHY:TI的DP83848、国产的YT8512H,以及Microchip(原SMSC)的LAN8720A。它们在F407平台都能用,但各有脾气:
| 对比项 | LAN8720A | DP83848 | YT8512H |
|---|---|---|---|
| 封装 | QFN24,小 | LQFP48,大 | QFN32,中等 |
| 接口模式 | 仅RMII | MII/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怎么接。这里有两个方案,很多人混淆,画错了板子回来就傻眼。
方案A:25MHz无源晶振接LAN8720A的XI/XO,LAN8720A内部PLL把25MHz倍频到50MHz,然后从REF_CLK引脚输出50MHz给F407。这是ST例程和大多数开发板采用的方案,也是我推荐的方案。
方案B:由F407的MCO1输出50MHz时钟,接到LAN8720A的REF_CLK/X1引脚,PHY工作在从模式,不接晶振。
区别必须讲清楚:方案B看着能省一颗晶振,但F407主频168MHz时,想从PLLQ分频得到精确50MHz并不容易。MCO1输出的时钟源自PLLQ,PLLQ还要兼顾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.3V,PHY内部数字逻辑用电,旁边放10uF和0.1uF电容并联去耦;
- VDDIO:IO口电源,决定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”的代价。
电源设计我给一份可以直接抄的清单:
| 电源网络 | 电压 | 推荐电容组合 | 备注 |
|---|---|---|---|
| VDD | 3.3V | 10uF + 0.1uF | 就近PHY电源脚 |
| VDDIO | 3.3V | 0.1uF | 靠近VDDIO引脚 |
| VDDCR | 1.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、TXD1,ETH_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接到GND,PHY地址就是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/Activity);
- nLED1:速率指示(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,也可悬空 |
| LED | nLED0/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电容到GND |
4. 网络变压器和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灯也可能亮,但绕线电缆带来的共模噪声没有泄放路径,长期工作或过雷击浪涌时容易损坏PHY,EMC测试也会冒出莫名其妙的超标项。
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.2V,PHY芯片是否异常发热;
- 量复位: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读到0xC0F1(PHY 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来自PHY,CubeMX里不需要额外配置MCO输出;如果用了MCO送时钟方案,才需要单独把MCO1引脚配置成对应频率输出。
另外,HAL库的以太网驱动里一般需要把PHY地址宏改成实际值,比如LAN8720A地址为0时,把ETH_PHY_ADDRESS或类似宏定义改成0。很多“灯亮但初始化失败”的问题就出在这里,代码里默认的PHY地址是其他值,和硬件对不上。
6.5 两块板子做背靠背测试时的经验
如果需要调试两块F407板子之间的以太网通信,可以直接把两套PHY加网络变压器背靠背连接,中间用短网线或RJ45座对接。注意至少一端要插到交换机/PC上确认协商结果,否则两边如果配置不对,都会陷入反复协商。PHY芯片背靠背测试是验证硬件和驱动的好方法,但别用它替代真实网络环境的稳定性测试。
最后再说一句实话
这块板子的第三版其实只改了两处:把REF_CLK相关时钟方案彻底固定为25MHz晶振输出,以及重排了网络变压器区域的布线和地平面。改动量不大,但网口从“偶尔能通”变成了“怎么插都稳”。回过头看,LAN8720A原理图并没有多复杂,复杂的是那些容易被当成“参考而已”的细节——时钟方向、中心抽头、地址电平、电容位置、差分参考面。把这些细节当回事,这块板子你就能一次点亮;不当回事,多半就在调试台上多熬几个通宵。