做STM32F407的以太网项目时,基本上每个硬件工程师都会遇到一块叫LAN8720A的小芯片。这颗PHY芯片出货量极大,参考设计满天飞,但很多人照着画完板子回来却踩了一堆坑:Link灯亮但Ping不通、收发不稳定、MDIO读不到ID等等。这篇文章就围绕LAN8720A的原理图设计从头拆一遍,把每一个引脚、每一条走线、每一颗电阻电容背后的设计逻辑讲明白,结合我这些年实际打板和调试的经验,给出完整可抄作业的方案。
先说一下这篇文章适合谁看:正在用STM32F407做带网口产品的硬件工程师,或者刚入门想自己画一块带以太网核心板的学生。软件基础有没有不重要,硬件部分看懂原理图和PCB布局就够用。我默认你已经清楚以太网大体分MAC层和PHY层,接下来直接进入方案选型。
1. 以太网硬件方案选型:为什么大家都用LAN8720A
1.1 先理清MAC和PHY的分工
很多新手第一次看以太网电路会懵,因为STM32F407芯片本身带有以太网MAC控制器,但它不能直接接RJ45网口,中间必须放一个PHY芯片。打个不太严谨的比方:MAC是处理数据的“大脑”,PHY就是负责把数据变成电信号发出去的“嘴巴和耳朵”。
STM32F407内部集成的以太网MAC支持10M/100M速率,支持MII和RMII两种接口方式。它负责IP包封装、CRC校验、MAC地址过滤这些事,但最终要往网线上发送的是差分模拟信号,必须靠PHY来完成编码、并串转换、电平驱动等工作。LAN8720A就是这颗负责物理层收发的芯片。
所以硬件设计的核心任务就两部分:一是把STM32F407的MAC接口信号和LAN8720A的PHY接口信号正确接起来,二是把LAN8720A另一侧的差分信号通过网络变压器和RJ45连到外部网线。这两部分搞通了,硬件就成功了一大半。
1.2 LAN8720A和同类PHY的横向对比
市面上主流的10M/100M单端口PHY芯片无非那几颗:LAN8720A、YT8512H、IP101GRI、DP83848I。我这几颗都画过板子,说说选择倾向。
LAN8720A好在三点:一是体积非常小,QFN-24封装,4mm见方,在寸土寸金的PCB上很友好;二是功耗低,官方标称功耗在0.5W以内,基本不发热;三是内置了1.2V稳压器,外部只需要一路3.3V供电,BOM简单。这对STM32F407的核心板设计尤其方便,因为整板电源轨少。
IP101GRI和DP83848I性能上都不差,但封装大、外围要求多,一般用在工业级产品里。YT8512H是目前国内性价比很高的替代方案,基本兼容LAN8720A的RMII接口,不过它的参考电路和寄存器映射有些差异,不能直接无脑替换。如果你是新设计,后续想省成本可以评估YT8512H,如果求稳、参考资料多,LP建8720A仍然是首选。
1.3 RMII与MII接口选型:决定画板难度
STM32F407的ETH外设同时支持MII和RMII。MII接口信号多,需要16根线,而且TX_CLK和RX_CLK分别独立,对MCU引脚占用大,布线也折腾。RMII(Reduced MII)把数据线压缩到2根发送、2根接收,加一个50MHz的REF_CLK时钟,总共10根左右的信号线,PCB布线压力小很多。
代价是RMII要求50MHz时钟信号,而且TX和RX都共用这同一个50MHz基准时钟,对时钟质量要求更高。LAN8720A支持从外部输入50MHz晶振信号,也支持自己从25MHz无源晶振经过内部PLL产生50MHz时钟再输出给MAC。我后面会详细讲两种方案的取舍,这里先记住结论:用RMII接口,信号线少,适合STM32F407这种引脚资源紧张的场景,绝大多数开源项目也都是这样做的。
2. 原理图设计拆解:一张图讲透每个引脚
2.1 电源系统:多路电源引脚与去耦电容放置
LAN8720A有VDDA、VDDIO、VDDCR三组电源引脚,很多人看不懂这三个有什么区别,我就用通俗的方式解释。
VDDA是模拟电源,给PHY内部的模拟前端电路供电,噪声敏感度最高。VDDIO是I/O电源,给RMII接口的输入输出缓冲供电,它决定了和MCU通信的电平范围。VDDCR是内部数字核心电源引脚,但注意这颗芯片内置了1.2V稳压器,所以外部不需要再单独提供1.2V,只需在VDDCR引脚上接一个1uF左右的滤波电容,稳压器会自动在内部产生1.2V供给核心逻辑。
我的习惯是在原理图阶段就规定清楚去耦电容的容量和位置:VDDA和VDDIO每个引脚旁边放一个0.1uF的陶瓷电容,就近打孔到地平面,然后再在芯片供电端的总入口放一个10uF的钽电容或陶瓷电容做低频储能。VDDCR的1uF电容必须离引脚尽可能近,因为这个1.2V内核电流变化很快,远了电感效应会很严重。
注意:LAN8720A的所有电源引脚都不能悬空,也不能直接全绑在一起就完事,模拟地和数字地在芯片底部焊盘处要单点连接,否则地弹噪声会直接耦合进模拟电路,表现为丢包率升高。
2.2 时钟方案:50MHz有源晶振还是25MHz无源晶振
这是我在论坛里看到问得最多的一个问题:STM32F407的RMII接口需要一个50MHz参考时钟,这个时钟从哪里来?
网上常见的做法有两种。第一种是给LAN8720A配一个50MHz有源晶振,把CLKOUT引脚(或者叫REF_CLK)配置成输出模式,让PHY把50MHz时钟送给STM32F407的ETH_REF_CLK引脚。第二种是给LAN8720A接25MHz无源晶振,PHY内部通过PLL倍频到50MHz,然后从CLKOUT引脚输出给MCU,或者直接由外部MCU提供50MHz基准时钟、PHY工作在从模式。
我个人的建议是用25MHz无源晶振方案,因为LAN8720A内部的PLL电路完全有能力承担倍频工作,而且25MHz无源晶振成本低、体积小,也不需要额外的电源滤波。关键是要把晶振放在LAN8720A晶振输入引脚旁边,两个负载电容(一般18pF或22pF,看晶振规格书)也要尽量靠近,走线不要过长,晶振正下方不要走其他信号线。
也有人直接把STM32F407的MCO引脚输出50MHz时钟给PHY用。这种设计不是不行,但我评估下来不如PHY自带晶振可靠,因为MCO的输出驱动能力有限,而且MCU内部时钟树的噪声会串到以太网时钟上,影响信号眼图。
2.3 RMII信号连接映射:与STM32F407的引脚对应
RMII接口的信号数量不多,但每一根都不能接错。我对照数据手册重新整理过一张接线表,这里直接给大家参考:
| 信号名 | LAN8720A引脚 | STM32F407引脚 | 说明 |
|---|---|---|---|
| TXD0 | TXD0 | PB12 | 发送数据位0 |
| TXD1 | TXD1 | PB13 | 发送数据位1 |
| TX_EN | TX_EN | PB11 | 发送使能 |
| RXD0 | RXD0 | PC4 | 接收数据位0 |
| RXD1 | RXD1 | PC5 | 接收数据位1 |
| CRS_DV | CRS_DV | PA7 | 载波侦听/数据有效 |
| REF_CLK | CLKOUT | PA1 | 50MHz参考时钟 |
| MDC | MDC | PC1 | 管理接口时钟 |
| MDIO | MDIO | PA2 | 管理接口数据 |
这组对应关系是STM32F407在RMII模式下的默认复用映射,也是STM32CubeMX里最常见的选择。强烈建议原理图阶段就把每一根信号命名成ETH_RMII_TXD0这种格式,别用芯片原始引脚名TXD0就完事。我踩过这种坑:PCB Layout时回读网络表,发现MDC接错了引脚,因为原理图里两个不同网络都叫了类似的名称,排查起来非常痛苦。
还有一点,REF_CLK的50MHz信号方向必须确认清楚。在RMII标准定义里,这个50MHz时钟可以由MAC提供,也可以由PHY提供。LAN8720A默认配置下CLKOUT引脚会输出50MHz给MCU,所以STM32F407侧的PA1要配置为输入模式。如果你用的是外部有源晶振直接供给两边,那就把PHY的REF_CLK模式配置成输入方向,别搞反。
2.4 网络变压器与RJ45设计:中心抽头和Bob Smith端接
LAN8720A一侧的TX±和RX±差分对不能直接接到RJ45,中间必须过网络变压器。网络变压器在这里的作用有几个:隔离共模电压、抑制共模干扰、提供浪涌保护路径。很多新手偷懒直接用带变压器的RJ45插座(比如HR911105A),这是最省事的方案,也完全可以,但设计原理还是要懂。
变压器次级(线路侧)的两个中心抽头要通过Bob Smith电路端接到保护地。标准做法是:每个差分对的中心抽头分别通过75Ω电阻连到一起,再串联一个高压电容(常见1000pF/2kV)接到机壳地。这组阻容的作用是给共模噪声提供泄放通道,同时隔离直流,防止外部浪涌直接打穿PHY芯片。
变压器初级(PHY侧)的中心抽头接法要看PHY的输出结构。LAN8720A的TX驱动是电流型输出,所以初级中心抽头通常直接接VDDIO电源(3.3V),为输出级提供直流偏置电流。RX侧的初级中心抽头一般通过0.1uF电容接地,给接收端提供一个交流参考点,注意不是直接接地,否则会影响接收共模电压范围。
提示:LAN8720A数据手册的参考电路中,TX中心抽头接3.3V,RX中心抽头通过电容接地。如果用了带变压器的RJ45一体式连接器,务必核对连接器内部的变压器中心抽头是否已经处理,有些一体式连接器内部已经集成好了端接电阻,外部再接反而画蛇添足。
2.5 PHY地址与模式引脚配置:上拉电阻不容马虎
LAN8720A有几个引脚是复用功能的,其中最关键的是PHY地址配置。STM32F407的以太网驱动初始化时需要向MDIO总线上的某个地址去读PHY的寄存器,如果地址对不上,直接读不到芯片ID。
LAN8720A的PHY地址由PHYAD0引脚在复位时的电平决定,常见接法是接10kΩ电阻上拉到3.3V,得到地址1,再配合一个外部下拉/上拉电阻将地址改成0或2等其他值。如果你设计里有多个PHY挂在同一条MDIO总线上,就必须给每颗PHY分配不同地址。我建议在PHYAD0引脚上加一个0Ω电阻或2kV ESD保护器件方便的调试点,万一需要改地址,飞线也容易。
另外还有nINT中断引脚、REGOFF低功耗关断引脚。REGOFF必须接GND,否则芯片直接进入低功耗状态,RMII接口完全不工作。这个引脚我见过有人悬空,结果上电后PHY像没通电一样,实测电流只有几毫安,查了好久才发现是REGOFF没拉低。
nINT可以接MCU的GPIO,也可以不接。软件轮询MDIO读状态其实更简单,但如果你要做WOL网络唤醒或者想用中断方式快速感知Link状态变化,那就接上,注意它是开漏输出,需要外部上拉电阻。
3. PCB Layout实操:决定稳定性的是高速走线
3.1 差分对与100Ω阻抗控制
原理图对了只算一半,PCB Layout才是真正决定LAN8720A能不能稳定跑满100M的地方。TX±和RX±两对差分线必须做100Ω差分阻抗控制。
很多两层板爱好者问:两层板能不能跑以太网?能,但你必须控制走线宽度和间距。常用FR4板材、1.6mm板厚、表层微带线结构下,如果板厂默认铜厚1oz,差分对走线宽度大概在8mil左右、线间距5~8mil时阻抗接近100Ω。不过这个数值会随叠层变化,最靠谱的做法是在制板前把叠层参数发给板厂,让板厂帮你算阻抗,或者直接用“5mil线宽、5mil间距”这种常见组合再配合板厂阻抗测试报告调整。
差分对走线的核心要求是等长、紧耦合、避免跨分割。等长不是说两线相差必须0,而是尽量控制在5mil以内,因为100M以太网的上升沿大约几纳秒,5mil长度差引起的时延大约0.3ps,完全可接受。更重要的事情是两线之间不能有大面积铜皮掏空,不能让差分对跨过地平面的裂缝。
3.2 时钟线、MDIO/MDC走线处理
50MHz的REF_CLK信号是整个RMII接口里最关键的单端信号。它虽然频率只有50MHz,但上升沿非常陡,谐波分量很高,处理不好会辐射出去干扰其他电路,也可能被其他信号干扰导致时钟抖动。
我的规则是:REF_CLK走线控制在1000mil以内,越短越好,远离DC-DC电感、晶振、开关节点这类噪声源。最好在CLK信号两侧包地,地过孔沿着走线两侧均匀放置,把信号屏蔽起来。MDC和MDIO这两根管理信号速度不高,通常几MHz,但对布线的要求也不能太随意,避免和高速数据线平行走长距离,防止串扰。
LAN8720A到STM32F407的RMII数据线,组内等长最好控制在200mil以内,虽然RMII标准对建立保持时间要求不算苛刻,但信号质量好一点,调试时候的怪问题就少一点。TXD0/TXD1/TX_EN这三根发送信号分组走在一起,RXD0/RXD1/CRS_DV这三根接收信号分组走在一起,组间独立,先走完整再修等长。
3.3 电源平面与去耦电容的摆放位置
LAN8720A的中文资料上一般会标注:“所有去耦电容应紧靠相应的电源引脚,走线要短而粗,过孔要尽量靠近焊盘。”但真正做Layout的时候,很多人会因为布局拥挤把电容放得远远的,效果大打折扣。
我建议在原理图阶段就给PHY芯片区留出足够的“呼吸空间”。芯片周围至少预留150mil的净空区,用来放置电源去耦电容、晶振电路、RBIAS偏置电阻。RBIAS引脚需要接一颗12.4kΩ、精度1%的电阻到地,这颗电阻的精度直接决定PHY内部电流偏置精度,进而影响发送信号幅值,尽量别用5%的普通电阻替代。
去耦电容的放置顺序是:先放VDDCR的1uF,再放VDDA的0.1uF,再放VDDIO的0.1uF,每个电容的地端过孔单独打,不要串到一个过孔上。顶层铺一小块完整的3.3V铜皮把芯片电源引脚和电容一端连起来,比拉着细走线强太多了。
3.4 变压器区域处理:隔离与跨分割
网络变压器和RJ45区域要按“隔离”的思路来设计。RJ45的金属外壳、变压器次级侧线路、保护地是一套系统,和PHY、MCU的数字地不能混在一起。
我通常的做法是:把RJ45和变压器放在板边,RJ45金属外壳通过一个高压电容(2kV/1000pF)和一个1MΩ电阻连接到数字地,形成单点连接。变压器下方的地平面要彻底掏空,留出隔离带,避免次级侧的浪涌电流直接耦合到初级侧的地系统。掏空宽度大约80~120mil就够了,太宽会切断两侧的差分信号回流路径,太窄又起不到隔离作用。
有工程师为了省钱直接把RJ45插座放在板子中央,然后走长线穿过一堆数字逻辑电路,结果产品过不了快速脉冲群测试,这就是典型的Layout问题,不是芯片问题。
4. 调试踩坑实录:Link灯亮却Ping不通怎么办
4.1 PHY ID读不到:先别怀疑芯片
拿到新板子,上电后发现STM32的以太网驱动初始化失败,打印信息显示读不到PHY ID,不要急着怀疑芯片坏了。按这个顺序排查:第一查REGOFF引脚是不是被正确拉低,第二查PHYAD0设置的地址和驱动里填的PHY地址是否一致,第三查MDC/MDIO两根线是否接反或短路,第四查网络变压器的中心抽头接法。
我调试过一块板子,现象是驱动读ID时永远返回0xFFFF。用示波器抓MDIO波形,发现只有MDC有时钟,MDIO数据线一直高电平。最后发现是PHY地址配置问题:PHYAD0通过10k电阻接到了3.3V,而驱动初始化代码里读的地址是0,地址完全不匹配。把代码里的PHY地址改成1之后,立即读到0x0007,正常识别LAN8720A。
另外提一句,MDIO上一般要加一个1kΩ到4.7kΩ的上拉电阻,具体值取决于总线上挂的设备数量。如果你发现MDIO信号上升沿很缓,波形像在爬斜坡,多半是总线电容太大上拉太弱,把上拉电阻调小一点即可。
4.2 指示灯状态分析:快速定位故障
LAN8720A有nLED0和nLED1两个LED驱动引脚,配置好后能指示Link状态和收发活动。我习惯把LED0接Link/Activity指示,LED1接Speed指示。如果上电后LED0常亮,说明PHY已经通过自协商和交换机建立了链接,物理层基本没问题;如果LED0完全不亮,优先检查变压器次级接线和RJ45的差分线有没有接反。
有一次调试,LED0亮得正常,但Ping不通。网络抓包软件显示ARP请求发不出来。最后定位到是TX和RX差分对在网络变压器次级侧交叉接错了,外部看到的Link是对端交换机通过自协商的“假Link”,实际数据通路不通。所以Link灯亮只代表物理层协商成功,不代表数据链路没问题。
4.3 丢包与断流:时钟和电源是重灾区
如果Ping大包或者长时间跑吞吐会偶发失败,最常见的原因有两个:时钟抖动过大和电源纹波过高。用示波器看PHY输出给MCU的REF_CLK信号,要求上升沿干净、无回勾、抖动尽可能小。我遇到过因晶振负载电容配错导致时钟幅度偏低、边沿变缓的情况,表现为高负载下丢包率直线上升。
电源方面,如果3.3V由DC-DC提供,注意开关频率噪声是否直接耦合到了VDDA。解决办法是在VDDA引脚处增加一个磁珠或小电感做滤波,把模拟电源和数字电源分开。注意磁珠的额定电流要高于芯片实际电流,否则压降过大反而更糟糕。
4.4 常见问题速查表
我把这几年被问得最多的几个硬件问题整理成一张表,方便你现场排查:
| 现象 | 优先检查项 | 原因方向 |
|---|---|---|
| 读不到PHY ID | REGOFF电平、PHY地址、MDIO上拉 | 芯片未工作或地址不匹配 |
| LED常亮但Ping不通 | TX/RX差分线是否交叉、变压器中心抽头 | 数据通路问题 |
| 10M正常100M丢包 | REF_CLK信号质量、差分走线阻抗 | 高速信号质量差 |
| 偶尔掉线重连 | 电源纹波、虚焊、RJ45座接触不良 | 供电或焊接问题 |
| 芯片异常发烫 | VDDCR是否短路、RBIAS电阻是否贴错 | 电源故障 |
还有个小细节:有些板子在GD32或国产替代MCU上跑以太网时,硬件其实没问题,但代码里PHY的寄存器地址偏移和LAN8720A不一致,导致读不到ID。这不属于原理图问题,但排查时要留个心眼,别把软件问题当成硬件改一版板子。
5. 设计优化与扩展方向:从能用做到好用
5.1 增强ESD防护与浪涌抑制
消费级产品可以不加额外防护,但如果你想做工业级或者过认证,以太网口的防护设计必须重视。PHY芯片的差分引脚耐压很有限,直接暴露在网线一端很容易被静电打坏。
最基本的做法是在变压器次级侧(线路侧)的差分线上加TVS管,选型时注意结电容要小于5pF,否则会影响信号完整性。如果是做电力行业或户外设备,还要考虑雷击浪涌,这时候需要加气体放电管或者更高级别的浪涌保护方案,变压器也要选带屏蔽的型号。
PCB Layout上,RJ45金属外壳的接地焊盘要直接连接到保护地,不要和数字地大面积直接相连,而是通过高压电容桥接。这样静电泄放路径短,不易串进系统电源地。
5.2 低功耗与复位时序优化
如果你的产品需要做低功耗模式,LAN8720A的REGOFF引脚就派上用场了。将REGOFF拉高可以关断PHY内部大部分电路,电流降到微安级。但注意从REGOFF拉低恢复到正常工作,需要重新初始化PHY寄存器,软件上要处理这个流程。
复位时序也值得专门提一下。LAN8720A的复位信号低电平持续时间建议大于2ms,如果你用MCU的GPIO控制复位引脚,上电后要确保在初始化代码里延时等待复位完成。有些朋友用简单的RC复位电路,结果复位时间不够,芯片偶尔起不来,现象就是第一次上电能通,断电重启后不通了,非常诡异。
5.3 方案复用与进阶:换PHY芯片和扩展多网口
LAN8720A不是万能的,如果你的产品后续要升级到千兆以太网,那应该选择RTL8211F或YT8531这类千兆PHY,它们工作在RGMII接口模式,和现在的手工完全不一样。但在100M这个段位,LAN8720A的生态和资料优势在很长时间内还是很难被替代的。
如果你自己做核心板,可以考虑在LAN8720A基础上把RJ45做成独立小板,通过排针引出RMII信号、电源和复位、中断信号。这样在做不同项目时,可以直接复用这个小板,也可以在一块主板上挂多个PHY芯片来实现多网口。要注意的是,多个PHY挂在同一条MDIO总线上时,每颗PHY的PHYAD必须不同,这是绕不开的前提。
6. 从原理图到量产:一些没写在数据手册里的习惯
最后分享几个我自己的设计习惯。画原理图时,所有LAN8720A相关信号都加网络标签,并且统一带ETH_前缀,比如ETH_RMII_TXD0、ETH_MDC、ETH_MDIO。PCB布线阶段用颜色区分网络类型:信号线一种颜色、电源一种、地一种,这样检查时比对着密密麻麻的飞线高效得多。
还有,制板回来后不要急着上电,先用万用表量一遍3.3V和GND之间的阻抗,确认没有短路。我第一次画以太网板子时,就是没量直接上电,结果发现VDDCR电容焊反,芯片烧了,一块板子就这么报废了。成本不是最大的问题,问题是耽误了整整一周的开发时间。
给板子设计一个好的PHY复位电路也特别值。我后来都在复位引脚加了一个0.1uF的电容到地,同时串联一个1kΩ电阻到MCU的GPIO,这样既能提供上电自动复位,又允许软件随时单独复位PHY,调试时可方便了。
如果条件允许,在出板前打样一版小板验证一下网络变压器和RJ45的接法是否OK,这个成本很低但能避免很多量产后的返工。我在实际项目中就通过这种方式提前发现了某个一体式RJ45的连接器内部引脚顺序和预期不一致的问题,量产后才改的话代价就大了去了。