news 2026/10/3 9:58:42

LAN8720硬件设计避坑指南:晶振、PHY地址、复位时序等关键细节

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LAN8720硬件设计避坑指南:晶振、PHY地址、复位时序等关键细节

前阵子帮朋友调一块带网口的板子,主控是STM32F407,PHY用的就是LAN8720。板子第一版流片回来,现象很典型:上电后Link指示灯偶尔亮,MDIO读PHY寄存器时好时坏,ping包有一定概率丢,甚至有时候干脆协商不上100M。对着原理图查了大半天,最后发现三个问题叠加——晶振负载电容配错了导致频率偏差偏大,PHY地址上下拉电阻用了默认值但固件里写的是另一个地址,网络变压器次级中心抽头的Bob Smith端接还被抄错了一个器件。这类问题我在过去几个项目里都碰到过,所以这次索性把LAN8720硬件设计里最容易翻车的几个点系统梳理一遍,从晶振方案、PHY地址配置、供电去耦、复位时序到网络变压器与差分布线,一次说清楚。

LAN8720这芯片用的人极多,但资料越是满地都是,越要小心——网上很多原理图都是互相抄的,抄来抄去把原版里的坑也一起抄过去了。这篇文章只讲硬件设计时能落地的东西,软件部分只提必要的那几句。

1. 先从整体方案理解LAN8720,再谈五处细节

1.1 LAN8720到底是个什么角色

LAN8720是Microchip(原SMSC)出品的一颗低功耗10/100M以太网PHY芯片。它本身不跑什么协议栈,干的全是物理层的活:把MAC送过来的RMII接口数字信号,转换成能在网线上传输的模拟差分信号,同时负责载波侦听、链路状态检测、自动协商这些脏活累活。你的MCU只需要支持RMII接口,外围挂一颗LAN8720,再加个带隔离变压器的RJ45座,一个标准网口就这么出来了。

很多人一上来就纠结“为什么不能用W5500那种带TCP/IP协议栈的芯片”,这其实是两类东西。W5500是MAC+PHY+协议栈全集成的方案,CPU几乎不参与网络协议处理,适合单片机裸机开发;LAN8720则只是PHY,MAC和协议栈都在你的主控里(比如STM32的内置以太网MAC,或者ESP32的EMAC外设)。后者更灵活、吞吐量上限更高,也更容易和RTOS/Linux这类系统配合,代价是你的主控必须自带或者用外部MAC,驱动也得自己写一部分。

1.2 三种最典型的硬件架构

不同主控接LAN8720,电路形态差不多,但时钟方案和复位策略会有差异。

STM32 + RMII:STM32F4/F7/H7系列带MAC,RMII接口需要的50MHz参考时钟可以由STM32的MCO引脚输出,也可以由LAN8720从25MHz晶振内部倍频后输出给MAC。两种方式我都用过,前者需要对MCO引脚做配置,后者要注意REF_CLKO的信号质量。

ESP32 + LAN8720:ESP32内置EMAC,官方很多开发板就是拿LAN8720做网口。这里有个特殊点,ESP32的RMII时钟推荐用外部50MHz有源时钟直接给MAC和PHY,以减少内部PLL带来的抖动,所以你会看到一些ESP32的参考设计里LAN8720旁摆了一颗50MHz有源晶振而不是25MHz无源晶振。

其他MCU/DSP + RMII:GD32、AT32、NXP的LPC系列,甚至一些FPGA,只要支持RMII就可以照搬LAN8720的典型电路,重点仍然是时钟源、PHY地址和复位时序这三件事。

我画过不少带网口的板卡,第一版最容易出问题的永远不是原理图逻辑,而是细节:晶振起没起振、PHY地址上下拉和固件对不对得上、复位上电时序是否满足、变压器中心抽头接法是否符合PHY手册。下面五个细节,就是我把踩过的坑按频率排序后的结果。

2. 细节一:晶振与时钟方案,25MHz还是50MHz不是拍脑袋定的

2.1 25MHz无源晶振方案与负载电容计算

LAN8720的XI/XO引脚可以直接接一颗25MHz无源晶振,这是最常规的做法,也是绝大多数STM32参考设计采用的方式。

电路很简单:晶振接在XI和XO之间,两端分别对地接一颗负载电容,同时晶振两端还要并联一个1MΩ左右的偏置电阻。很多芯片内部已经集成了这个反馈电阻,但外挂一个也不会有副作用,方便调试时断开验证。

真正容易翻车的是负载电容选值。晶振规格书里会标一个负载电容CL(常见18pF、20pF),你外接的两颗电容C1、C2要和引脚杂散电容一起算,满足:

CL = (C1 × C2) / (C1 + C2) + Cstray

其中Cstray是芯片引脚、PCB走线、焊盘带来的杂散电容,一般在3~5pF之间。举个例子,如果晶振CL=18pF,杂散按3pF算,那(C1×C2)/(C1+C2)应该等于15pF,对称设计下C1=C2=30pF。所以我经常看到有人用10pF甚至4.7pF的电容配18pF的晶振,算出来等效负载只有7~8pF,频率偏差自然就偏大了。

晶振规格CL推荐C1/C2(含约3~5pF杂散)备注
18pF27~33pF上电后用示波器或频率计微调
20pF30~36pF若板子走线短,取偏大值
12pF18~22pF低频低功耗场景少见

选晶振时还要注意ESR和谐振模式。LAN8720这种以太网PHY对频率精度比较敏感,建议选择频率容差±30ppm以内的产品,太便宜的晶振低温漂和老化带来的频偏会在长时间运行后暴露成丢包问题。ESR尽量控制在40Ω以内,起振更干脆。

2.2 50MHz外部时钟方案,什么情况下才值得用

为什么会有50MHz外部时钟的需求?因为RMII接口本来就要求50MHz参考时钟。LAN8720用25MHz晶振时,内部会自己倍频出50MHz给RMII所用,这是最省事的方案。但如果你的板子上本来就有稳定干净的50MHz时钟源,或者主控(尤其是ESP32这种自带EMAC的芯片)对参考时钟抖动要求较高,那直接用外部50MHz时钟进入XI引脚、XO悬空,也是一种很常见的做法。

网上很多ESP32 + LAN8720的硬件设计里,你会看到一颗50MHz有源晶振给两处供时钟:一路给ESP32的RMII REF_CLK,一路给LAN8720的XI。这样做的好处是MAC和PHY共用一个时钟源,不存在PLL倍频后的相位差问题,丢包率在重负载下可能更低。

需要注意的有三点:第一,50MHz时钟信号质量要求比25MHz晶振更高,上升沿要陡、抖动要小,如果用MCU的GPIO引脚下来的50MHz时钟,中间最好串一颗22~33Ω电阻做阻抗匹配,走线尽量短;第二,XO引脚要悬空,不要接任何东西;第三,有源晶振的电源要去耦好,给晶振单独加一个100nF电容是基本操作。

2.3 晶振PCB布局:包地不是万能的,走线短才是王道

关于晶振布局,网络上问得最多的就是“晶振需要包地吗”。我的经验是:晶振周围铺一圈地并打几个过孔连接到主地,对抑制谐波辐射有好处,但不要为了包地把晶振四面围得密不透风。过度包地会让晶振区域的杂散电容变大且不可控,反而影响起振余量,甚至让频率偏移超出预期。

比包地更重要的是:晶振要尽量靠近XI/XO引脚,走线越短越好;晶振下方所有层都不要走其他信号线,尤其是SDIO、SPI、I2C这类并行总线,以及电源开关节点;负载电容要放在晶振和芯片引脚之间,而不是放在晶振外侧。简单说,让晶振、电容、引脚三者形成一个尽量小的环路。

还有一个常被忽略的点:晶振底下不要铺完整的大面积地铜。表层铺地连接主地没什么问题,但你如果把内层一整片地都摆在晶振正下方,等效杂散电容会变大,频率容易偏低。稳妥做法是晶振正下方的内层挖空,或者至少保证没有连续参考平面。

3. 细节二:PHY地址配置,RXER/PHYAD0那个引脚不是普通IO

3.1 SMI管理总线里的寻址原理

MDIO/MDC是MAC管理PHY的标准总线,一个MAC可以通过这组总线管理多个PHY,靠的就是PHY地址。SMI协议里MDIO传输帧包含5位PHY地址位,所以理论上一条总线上最多挂32个PHY。实际硬件上,每个PHY用一组引脚在复位时采样出地址。

LAN8720对外只引出了两位可配置的PHY地址引脚:RXER/PHYAD0和LED1/PHYAD1。这两个引脚在芯片复位释放瞬间被采样,作为PHYAD0和PHYAD1的值,采样完成后就恢复成RX_ER和LED1功能。所以不能把它们当成纯粹的地址配置引脚去理解,它们是复用脚。

这里有个取舍:因为只有2位可配,LAN8720在一条MDIO总线上最多只能挂4个,剩下的高位PHY地址是芯片内部固定的。好在绝大多数单网口产品根本用不到那么多,记住这一点就够。

3.2 上下拉配置怎么接,和固件怎么保持一致

PHY地址的配置方式就是在RXER/PHYAD0和LED1/PHYAD1上外接上拉或下拉电阻。设计时要留意芯片内部有默认的上下拉状态,所以外部电阻的选值要足够强,通常用10kΩ,太大会被内部拉不动,太小会影响复位后的复用功能。

我见过的量产设计里最常见的是把地址配成1,也就是PHYAD0拉高、PHYAD1拉低。这种配置和很多驱动库默认的PHY地址一致,比如STM32 HAL库例程里LAN8720的PHY_ADDRESS常写0x01,省得每次都要改。如果你的板子上下拉组合不一样,像PHYAD0=0、PHYAD1=1得到地址2,那固件里的地址宏记得同步改掉,否则芯片明明活着,MDIO就是读不到数据。

配好之后建议在硬件流程里做一次验证:上电后用示波器或者逻辑分析仪抓MDIO帧,看首帧里的PHY地址是不是你配置的值。我踩过最深的坑就是原理图里PHYAD0画了下拉,但BOM贴的电阻位置反了,软硬件工程师各查了半天,最后发现是料贴错位。

3.3 多PHY共享MDIO总线的注意事项

如果你做的是双网口或者四网口产品,多个LAN8720挂在同一条MDIO上,每个PHY的地址必须唯一。要注意LAN8720只有2个地址引脚,最多4个地址可用,再往上就得换带更多地址引脚的PHY,比如DP83848的PHYAD[4:0]引脚就比较全。

MDIO总线上有多个PHY时,MDIO数据线本身是开漏结构,需要加一个4.7kΩ到10kΩ的上拉电阻到VDDIO。MDC一般由MAC推挽驱动,不需要上拉。如果板子上MDIO/MDC走线比较长,或者跨了连接器,建议在远端再加一个终端电阻,并适当降低MDC频率,从默认的2.5MHz降到1MHz左右,能解决很多莫名其妙的读写出错。

4. 细节三:供电与去耦,3.3V单电源也要认真对待

4.1 别小看VDD、VDDIO、VDDCR三个电源域

LAN8720正常工作时主要是3.3V单电源供电,数据手册里也强调支持单3.3V供电操作。但芯片内部有不止一个电源域:VDD是主3.3V电源,VDDIO是I/O接口电源(一般也接3.3V),VDDCR是内部1.2V核心电源域。

很多人第一次看到VDDCR就不知道怎么接,害怕要额外加一个LDO。实际上LAN8720内部有稳压结构,正常使用单3.3V供电即可,外部只需要给VDDCR接好足够容量的去耦电容,不需要再单独供1.2V。我不建议为了“看起来更干净”去外挂一个1.2V LDO,多一路电源就多一路噪声和布局复杂度,单3.3V方案成熟得多。

不过VDDCR的去耦电容别省。我习惯在VDDCR引脚旁边放一颗10μF陶瓷电容,再加一颗100nF高频去耦,两组电容尽可能靠近引脚;VDD和VDDIO的各电源引脚也要就近放100nF。这里的关键是电容到引脚的走线要短,回去的过孔要就近打,不要让电容和芯片之间隔着一长段走线再串过孔,那样高频噪声滤不干净,PHY长期运行会偶发丢包。

4.2 磁珠和电源平面怎么处理

如果3.3V是从板上的DCDC开关电源来的,纹波往往在30~100mV之间,直接给PHY供电风险不小。比较稳妥的做法是给LAN8720的3.3V增加一级LC滤波,磁珠选100MHz阻抗600Ω左右、额定电流够用的型号,后级再放一颗10μF钽电容或陶瓷电容。

模拟和数字电源到底要不要分开,我的看法是:LAN8720的引脚不算复杂,VDD和VDDIO分开走线到滤波电容后再汇合回公共3.3V即可,不必像ADC那样搞模拟电源分割。但要注意布局上别让PHY的I/O信号(TXD、RXD、MDIO这些)从电源滤波电容上方跨过,减少数字开关噪声耦合进电源回路。

4.3 上电时序与电源稳定时间

LAN8720对电源上电顺序没有特别苛刻的要求,但至少要保证3.3V稳定后再释放复位。很多主控板上有多个电压轨,如果3.3V起来得晚,而复位被主控提前拉高,PHY会在一段供电不稳的状态下初始化,后面出现什么奇怪现象都别太意外。

我在原理图里习惯把PHY的复位引脚交给主控GPIO控制,目的就是可以在软件里等电源稳定后再释放复位。上电流程一般是:主控供电完成、PHY的3.3V到达、保持nRST低电平至少10μs、拉高释放复位、等待一段时间(我习惯等10ms以上)再去访问MDIO寄存器。顺序对了,后面很多“偶发连不上网”的问题根本不会出现。

5. 细节四:复位电路与上电时序,一乱全乱

5.1 nRST引脚要求与RC复位计算

LAN8720的复位脚是低电平有效,复位释放时芯片会采样各种strap引脚(包括PHY地址、时钟源选择等),所以复位沿的干净程度会影响整颗芯片的初始状态。

最简单的复位电路就是一颗10kΩ上拉电阻到3.3V,加一颗0.1μF电容到地,组成RC延时复位。上电瞬间电容电压为0,nRST被拉低,随着电容充电,电压慢慢上升,最终到达高电平释放复位。RC时间常数约等于1ms。如果主控没有多余GPIO控制复位,这种RC电路够用,但要留意复位释放沿偏缓,如果板子所处环境电磁干扰大,偶尔会出现复位不彻底的情况。真要在严苛环境用RC复位,我建议把C加大到1μF,R保持10kΩ,同时让3.3V电源稳定后再上电。

5.2 用GPIO控制复位,给软硬件留条后路

条件允许的话,我强烈建议用主控GPIO直接控制PHY的nRST,而不是简单RC上电复位。好处很明显:软件可以在初始化流程里自主控制复位时机;PHY万一进入异常状态,驱动里可以拉低复位脚让PHY彻底重启,比只写PHY寄存器软复位可靠得多。

GPIO控制时要注意电平匹配。如果主控GPIO是3.3V推挽输出,直接接nRST没问题;如果是开漏输出,记得外部加上拉电阻。复位引脚不要悬空,悬空等于让PHY的复位状态完全不可控。

5.3 常见复位相关坑:复位时序不对导致的PHY假死

有一种很典型的故障:PHY的Link灯亮着,但MDIO读寄存器全是0xFFFF或者超时,ping也完全不通,复位一下又好了。这种多半是上电时序问题——主控先跑起来了,PHY还没完成初始化,或者复位释放时电源和时钟还没稳定,导致strap脚采到的电平不对。

解决方法是把“复位释放”放在最晚。比如主控代码里先把nRST拉低,延时100ms等电源稳定,再拉高释放复位,然后等待PHY内部自检完成。LAN8720数据手册里会有复位释放到可以访问寄存器的典型时间,工程上往大了取就行,几百毫秒甚至1秒都不会影响体验。宁可慢一点,不要赌时序。

6. 细节五:网络变压器与RJ45接口,中心抽头别乱接,差分线别乱走

6.1 集成RJ45还是分离式变压器

带网口的硬件设计都要过网络变压器这一关。变压器的作用是隔离共模电压、抑制EMI,并把PHY侧的差分信号耦合到网线上。选型上有两种常见路线:集成变压器的RJ45插座(比如HR911105A这类)和分离式网络变压器+RJ45座。

集成式方案省面积、器件少,画板子也简单,适合产品定型后走量;分离式方案调试方便,变压器、RJ45座、电阻电容可以分别换,适合前期验证和双网口多网口设计。我个人的习惯是:第一版验证板用分离式,出了问题好换件测试;稳定后如果空间紧张再换成集成式,电路基本不用大改。

变压器型号本身要注意隔离电压等级、插损、回损这些参数。普通商用交换机环境,隔离电压1.5kV的够用;如果是工业现场或有雷击浪涌要求,选更高耐压的型号,并在RJ45侧加TVS管。

6.2 中心抽头接法,最容易抄错的地方

网络变压器内部有中心抽头,分PHY侧(初级)和RJ45侧(次级)。RJ45侧的中心抽头通常要做Bob Smith端接:两个75Ω电阻串联,中间点通过一颗高压电容(0.1μF/2kV)接地。这套端接网络的作用是给网线上的共模噪声提供泄放路径,不接的话EMI会明显变差,长网线时误码率也会升高。

PHY侧中心抽头怎么接,就要看PHY芯片数据手册了。这也是很多抄原理图翻车的地方——不同厂商PHY的驱动器类型不一样,有的要求中心抽头接AVDD(提供一个共模工作点),有的要求通过电容到地,还有的干脆悬空。我遇到过一版设计把LAN8720的变压器初级中心抽头直接照着另一款PHY的接法怼到了3.3V,结果上电Link正常,一跑流量就断,Debug了很久才发现是中心抽头给错了偏置。

所以这里给一个最稳妥的操作思路:拿到PHY手册和变压器/模块的手册,先找到各自的典型应用电路,把中心抽头、电阻、电容对照着一一复制,不要凭记忆跨型号套用。如果两块板子PHY不同,即使网口长一样,变压器周围电路也可能不同。

6.3 差分走线与阻抗匹配要点

RJ45和PHY之间的差分对(TX+/TX-、RX+/RX-)布线需要按100Ω差模阻抗控制。层叠确定后,用阻抗计算工具(Saturn PCB、Polar Si9000都可以)算一下线宽和间距。通常4层板上,表层微带线参考内层地平面,线宽5~6mil、间距8~10mil就能大概落在100Ω附近,但具体以你的层叠参数为准。

布差分对时,同组两根线要成对走,间距保持一致,尽量少打孔;如果必须换层,过孔旁边加地孔回流;两组差分对之间拉开间距,至少留2~3倍线宽的距离,防止串扰。还有一个容易被忽略的点:差分走线不能跨过电源/地平面的分割线,否则回流路径断裂,共模辐射和误码率都会上来。

另外,网络变压器周围的地线要处理好。RJ45外壳的地和PHY的GND之间虽然通常有隔离电容连接,但不要搞成一大片铜皮直接把两边糊在一起。隔离带处理得好不好,直接决定了这板子EMI测试好不好过。

7. 实战问题排查与速查表

7.1 典型症状与排查思路

硬件设计的问题,现象往往就那么几类。我把平时帮人查板子的经验整理成一个速查表,按出现频率排好,遇到问题先对照这张表,能省很多时间。

症状可能原因检查手段
上电后Link灯完全不亮晶振没起振、PHY地址配置不对、复位时序不对、变压器接反/虚焊示波器测XI波形;确认上下拉;读PHY ID寄存器
能Link但ping丢包严重差分走线阻抗不连续、晶振频偏大、3.3V纹波大、REF_CLK抖动看眼图/示波器测时钟抖动;量电源纹波;检查差分对等长
协商不到100M,只有10M100M差分对质量太差、变压器型号不支持、RMII参考时钟源配置不对读PHY协商结果寄存器;检查参考时钟路径
MDIO读寄存器时好时坏MDIO上拉缺失、走线过长、PHY地址和代码不一致、MDC频率太高示波器抓MDIO波形;降MDC频率;核对地址
能跑但运行几个小时后断网电源稳定性差、PHY过热、晶振接触不良、复位被干扰持续监控电源和PHY温度;重新加热/补焊晶振

7.2 调试工具与实测经验

硬件调试时最常用的工具是示波器和逻辑分析仪。100MHz带宽的示波器能看晶振起振和时钟毛刺,但看RMII这种50MHz数字信号有点勉强,有200MHz以上带宽更好。逻辑分析仪抓MDIO/MDC特别方便,便宜的二三十块钱的8通道24MHz逻辑分析仪就够用,能直接看到地址帧,判断PHY地址和读写操作是否正常。

另外一个很实用的方法是上电后先不要跑协议栈,单纯用寄存器读写工具(STM32可以写一个小函数)读LAN8720的PHY ID寄存器(地址2和3),能读到0x0007、0x0200这类值,基本可以确认晶振、复位、供电、MDC/MDIO通路都是通的。读不到就按前面那张表逐项查。

7.3 一点实操习惯,供你参考

我个人在画带LAN8720的板子时,有几个固定习惯:原理图阶段会把strap引脚、复位时序、变压器中心抽头三块单独标红,评审时重点过这三个地方;PCB阶段先布差分对,再布晶振区域,最后才走其他控制信号;打样回来不上电前,先拿万用表量所有电源对地阻抗是否正常,再量晶振两个引脚对地的电容值,和设计值对比一下。这些动作看着笨,但真能拦下不少低级错误。

LAN8720不是新芯片,网上资料和参考设计多得看不完,但正因为多,抄错的风险也大。希望这篇能帮你把最关键的五个细节一次理清,少走几步弯路。等你的板子一次点亮,欢迎回来说一声。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 9:58:37

STEPQuant:面向循环神经网络的状态感知量化方法

1. 这不是普通量化:STEPQuant直击循环状态量化的“时间敏感性”痛点 你有没有遇到过这样的情况:模型在训练时一切正常,精度达标,但一旦做后训练量化(Post-Training Quantization, PTQ),尤其是对…

作者头像 李华
网站建设 2026/10/3 9:58:06

零基础15分钟搞定Claude桌面版:安装配置与避坑指南

1. 为什么我劝你先搞清楚Claude桌面版到底是个什么东西 很多人第一次听到“Claude桌面版”,脑子里冒出来的画面是又一个套壳聊天窗口,跟网页版没什么区别。我一开始也这么想,直到连续几天在浏览器里来回切标签页、复制粘贴长文档、被会话超时…

作者头像 李华
网站建设 2026/10/3 9:57:52

C++构造函数初始化列表:底层原理、必用场景与性能优化

1. 先从一次代码评审说起 前阵子做代码评审,看到同事新写的类里有个成员是 const int ,构造函数里直接 m_value 100; 这样赋值,编译死活过不去。他一脸困惑:"构造函数里不就能初始化成员吗,为啥 const 的不行…

作者头像 李华
网站建设 2026/10/3 9:57:31

基于Matlab的凸轮设计与仿真:绘制多款凸轮轮廓曲线

做机械设计、参加工训赛或者搞自动化产线的人,应该都有过被凸轮支配的恐惧。基圆半径、压力角、滚子半径、偏距,再加上推程、回程、远休止、近休止,手工画轮廓又慢又容易错,改一个参数就得全部重来。我最近把整套流程搬到 Matlab …

作者头像 李华
网站建设 2026/10/3 9:57:30

OpenShell:多项目多机器终端环境管理实战指南

先交代一下背景。我日常要同时面对三台机器:办公室的 Windows 工作站、家里那台常年跑着 Ubuntu 的笔记本,以及几台远程 Linux 服务器。听起来不算极端,但真正折腾人的不是设备数量,而是"终端环境"这件事——每台机器上…

作者头像 李华
网站建设 2026/10/3 9:56:34

Kolmogorov-Arnold分类器:轻量可解释AI的工程落地指南

1. 这不是又一个“万能函数拟合器”:Kolmogorov-Arnold分类器到底在解决什么真问题?你可能已经听过太多次“神经网络是万能函数逼近器”——这句话本身没错,但它的代价是什么?是动辄上百万参数、需要GPU集群训练数天、模型像黑箱一…

作者头像 李华