尧图精选

STM32+LAN8720A以太网模块设计:从原理图到LWIP移植实战

🕒 发布时间:2026/10/2 1:25:12 📁 来源:尧图网络
嵌入式项目里一旦需要联网很多人第一反应就是上W5500或者ESP8266。但如果你手里已经有STM32F407、F429这类带MAC控制器的芯片那用LAN8720A搭以太网通信模块其实是性价比最高、性能也最稳的一条路这也是很多工业产品、物联网网关、边缘计算设备里最常见的硬件组合之一。这篇内容我就结合自己开发过程中的实际经验完整梳理一遍STM32LAN8720A从原理图设计到LWIP协议栈通信的整个流程。核心思路是先用通俗的方式讲清楚MAC和PHY是什么、为什么这么搭再一步步画出RMII接口的原理图最后把软件配置、LWIP移植、调试踩坑全部过一遍。不管你是刚接触以太网的新手还是准备给现有项目加一个有线网口的开发者这篇内容都可以直接当作“抄作业”的参考。1. 方案选型与整体设计思路1.1 为什么是STM32LAN8720A先从MAC和PHY说起先解决一个很多人一开始会搞混的问题网络通信到底需要什么硬件以太网通信接口从逻辑上分两层一是MAC层媒体访问控制层负责数据帧的封装、错误检测、流量控制二是PHY层物理层负责把MAC层处理好的数字信号转换成能在网线上传输的模拟差分信号。打个比方MAC层相当于你写好了一封信PHY层就是邮递员负责把信按特定方式塞进邮筒、走邮路送出去。有些芯片把这两层做在一起比如W5500它内部有硬件TCP/IP协议栈单片机通过SPI跟它通信省心但灵活性一般。而STM32F407、STM32F429、F767这些芯片内部已经集成了符合IEEE 802.3标准的MAC控制器只是没有物理层电路。所以只需要外接一颗PHY芯片比如LAN8720A用RMII接口把两边连起来就行。为什么要选LAN8720A因为它在同类PHY芯片里实在太常见了。ST官方的不少评估板、正点原子、野火这些主流开发板都是用这颗芯片资料多、例程全、价格便宜还支持10M/100M自适应。相比DP83848、KSZ8081这些同类芯片LAN8720A在功耗和外围电路复杂度上更有优势一颗25MHz晶振加几个电容电阻就能跑起来对新手非常友好。1.2 接口选择MII、RMII还是SPIRMII为什么最适合PHY和MAC之间的数据接口有几种常见的MII、RMII、GMII、RGMII。对我们用的100M以太网来说MII和RMII是主要选择。MII接口需要16根数据线发送8根、接收8根加上控制信号大约二十几根引脚对MCU引脚压力很大。而RMIIReduced Media Independent Interface精简媒体独立接口把数据线砍到了4根发送2根、接收2根加上时钟和控制信号总共也就七八根线大大解放了PCB布局空间和GPIO资源。代价是什么呢RMII模式下数据位宽变窄所以时钟频率必须从25MHz提高到50MHz也就是每一位数据只占用一个时钟周期。这就引入了RMII一个关键要求MAC和PHY必须使用同一个50MHz参考时钟源否则接收端采样会发生漂移导致数据错乱。在实际项目里我强烈建议直接用RMII原因很简单引脚少、原理图好画、STM32CubeMX配置快、性能完全够100Mbps跑满。至于MII除非你有特殊需求否则没必要碰。2. 原理图拆解与关键设计细节2.1 模块结构总览和器件清单整个以太网通信模块的原理图可以分成几个板块STM32的ETH外设、LAN8720A PHY芯片、25MHz晶振或外部时钟、网络变压器、RJ45连接器、供电与复位电路。下面是一份典型的器件清单按这个准备物料基本不会出错模块器件型号/参数数量说明主控STM32STM32F407VET61带MAC控制器100脚PHYLAN8720ALAN8720A-CP110/100M以太网PHY晶振25MHz无源晶振±10ppm以内1接XTAL1/XTAL2连接器带变压器RJ45HR911105A1集成网络隔离变压器供电3.3V LDOAMS1117-3.3或同类1给PHY和电路供电退耦电容0.1uF/10uF若干PHY电源引脚滤波复位电容电阻10K0.1uF1产生PHY上电复位脉冲这个清单里最值得留意的是RJ45连接器选型。市面上RJ45分为两类一类是自带网络变压器的比如HR911105A另一类是纯机械连接器需要外接单独的变压器比如H1102。新手画原理图建议选集成变压器的一体式座子外围电路简单画完板子焊接也方便不容易因为变压器绕线方向搞错而翻车。2.2 时钟方案设计25MHz晶振方案与外置50MHz方案怎么选这是LAN8720A设计里最容易出错的地方我单独拿出来讲。LAN8720A有三种时钟输入模式对应三种硬件接法方案A25MHz无源晶振接XTAL1/XTAL2最推荐这是最经典的方案。25MHz晶振接在LAN8720A的XTAL1和XTAL2引脚之间PHY内部自带的PLL会把25MHz倍频到50MHz然后通过REF_CLK引脚输出给STM32的ETH_REF_CLK。也就是说STM32这边只需要把PA1引脚配置成输入模式等着接收PHY送来的50MHz时钟即可。为什么这套方案最省心首先25MHz无源晶振是最常见的规格采购容易、价格便宜其次PHY内部PLL产生的时钟经过整形信号质量有保障最后STM32的时钟树不会受任何牵连主频随便配不用操心MCO输出的联动关系。方案BSTM32的MCO引脚输出50MHz给PHY这种方案的思路是省掉PHY侧单独的一颗晶振由STM32的MCO1引脚PA8输出50MHz时钟直接接到LAN8720A的REF_CLK/CLKIN引脚。此时LAN8720A工作在外部时钟输入模式XTAL1不再接晶振。这个方案在ST官方一些示例代码里确实出现过CubeMX的ETH配置里也有MCO选项但实际踩下来有几个坑一是MCO的输出频率和主频PLL配置强相关一旦你想调整主频得重新算PLL分频系数非常容易配错二是MCO是CMOS方波输出驱动能力有限如果PCB走线过长时序余量会变差三是如果MCO和PHY的时钟线没有做等长、阻抗控制丢包概率会上升。方案C外部50MHz有源晶振单独供给PHY这个方案可以理解为方案B的变体用一颗50MHz有源晶振提供高品质时钟LAN8720A再把时钟从REF_CLK回送给STM32的ETH_REF_CLK。信号质量比MCO好但多花钱、多占PCB面积一般在要求特别高的场合才会用。我的结论是如果没有特殊原因直接用方案A。这也是目前绝大多数开发板的做法原因就是稳定、成熟、不折腾。2.3 电源电路3.3V与1.2V核心电压的处理LAN8720A的供电相对简单因为芯片内部集成了一个1.2V稳压器型号叫REG_OUT外部不需要额外设计1.2V电源电路。你需要做的是给VDD引脚3.3V各放一个0.1uF去耦电容紧靠引脚放置给模拟电源引脚和数字电源引脚分开走线最后在电源入口处汇合REG_OUT引脚接0.1uF和10uF电容到地这就是内部1.2V的输出去耦变压器中心抽头的供电也就是PLL和模拟前端用的AVDD同样加去耦电容。还有一个时容易忽略的点LAN8720A的电源有个上电时序要求即VDD必须先于或同时于其他IO电源建立。如果PCB上用LDO统一供电通常自然满足但如果你用DC-DC要关注一下启动时电源爬升情况防止PHY莫名其妙进入异常状态。2.4 PHY地址、复位电路与RMII信号线连接原理图电气连接是整个模块的核心。RMII接口的信号线不多我直接列一张表方便对照着接信号STM32引脚LAN8720A引脚功能说明REF_CLKPA1REF_CLK50MHz参考时钟由PHY输出给MACMDIOPA2MDIO管理数据输入输出MDCPC1MDC管理时钟由MAC输出CRS_DVPA7CRS_DV载波侦听/数据有效RXD0PC4RXD0接收数据位0RXD1PC5RXD1接收数据位1TX_ENPB11TX_EN发送使能TXD0PG13TXD0发送数据位0TXD1PG14TXD1发送数据位1nRST任意GPIO如PD3nRST硬件复位低有效这里特别注意三个点第一PHY地址。LAN8720A的PHY地址由REF_CLKIN/PHYAD0引脚和nINTSEL/PHYAD1引脚在上电复位时的电平决定。我的原理图中把PHYAD0通过10K下拉接地PHYAD1通过10K上拉到3.3V这样PHY地址就是二进制的01也就是0x01。不同开发板设计可能不一样有的是0x00所以软件里配置的PHY地址必须和你的原理图一致这是很多新手上电后读写MDIO全都失败的原因之一。第二复位电路。LAN8720A的nRST引脚需要拉低至少1ms才能可靠复位。我一般不用纯粹的RC复位而是用STM32的普通GPIO来控制PHY复位这样可以在软件里灵活地做复位时序上电后拉低nRST、延时、拉高、再延时等PHY稳定。PD3作为复位控制引脚初始化时默认输出高电平。第三网络变压器连接。以HR911105A为例RJ45这一侧差分发送对接到PHY的TX/TX-引脚差分接收对接到RX/RX-引脚。PHY侧的中心抽头按照LAN8720A数据手册要求接3.3V同时并联一个0.1uF电容到地RJ45侧中心抽头通过RC并联网络接地用于EMI滤波。连接器的金属屏蔽壳也要可靠接地这能明显改善网口的抗静电能力。3. 硬件焊接与初始化验证3.1 焊接要点与上电检查原理图画完、PCB打样回来之后第一步不是烧代码而是先检查硬件焊接质量。LAN8720A是QFN封装底部有散热焊盘手工焊接建议先用热风枪把焊盘吹平再用拖焊法处理引脚最后用万用表逐个测量引脚间有没有连锡短路。特别注意REF_CLK引脚这个引脚如果虚焊现象非常隐蔽晶振起振、PHY其它寄存器也能读但MAC收不到数据因为时钟根本没有到达STM32。上电后的静态检查按这个顺序来用万用表测LAN8720A的3.3V电源是否正常用万用表测REG_OUT引脚是否输出1.2V左右电压如果这个电压异常说明芯片内部稳压器工作不正常用示波器看25MHz晶振是否有波形幅度一般在0.8V到3.3V之间检查RJ45的Link指示灯有没有动作。插上网线后Link灯应该会亮起来Speed灯会指示协商速率是100M还是10M。这一步看起来很基础但能帮你把“硬件问题”和“软件问题”在第一时间隔离开避免后面调试时两头抓瞎。3.2 用STM32CubeMX快速配置ETH外设硬件没问题后进入软件配置阶段。我用STM32CubeMX为例演示因为它生成的初始化代码非常省事。在CubeMX里选好MCU型号比如STM32F407VET6然后做以下几步第一步开启ETH外设。在Pinout页面找到ETH设置为RMII模式。打开后CubeMX会自动把PA1、PA2、PA7、PC1、PC4、PC5、PB11、PG13、PG14这些引脚复用为ETH功能。第二步配置时钟树。ETH外设本身需要50MHz的参考时钟输入如果是25MHz晶振方案这个50MHz是PHY送过来的所以CubeMX里ETH时钟来源选择External即可。同时打开ETH的DMA接收中断或全局中断方便后续LWIP及时处理数据包。第三步设置PHY地址。在ETH参数配置里找到PHY Address填写和原理图一致的地址。我的板子设的是0x01如果你的PHYAD0是下拉那就是0x00。这一步错误会让你后面读取PHY ID全部失败。第四步生成工程代码。生成的代码里已经包含ETH初始化、GPIO复用配置、DMA描述符初始化不需要自己再写底层的寄存器操作非常省时间。3.3 先做物理层环回测试验证PHY芯片工作在移植LWIP之前我强烈建议先做一次PHY物理层的环回测试。这个测试的目的很简单验证MCU的MAC和LAN8720A之间的数据路径是否通畅。方法是往PHY的控制寄存器寄存器0也就是BMCR写入0x4000开启Digital Loopback模式。这样数据从MAC发出来经过PHY之后不往网线上走而是直接原路返回到MAC的接收通道。配套的测试代码思路是这样的MCU通过内部DMA发一个自定义的以太网帧然后等待接收中断如果收回来的帧内容和发出去的一致说明MAC到PHY这一段通路完全正常。CubeMX生成的以太网驱动里通常有现成的检查PHY ID函数比如HAL_ETH_ReadPHYRegister可以先读寄存器2和3确认读到的PHY ID是0x0007C0F1这一步过了就说明MDIO通信没问题。这个测试可以过滤掉大量后期疑难杂症。如果环回测试能过物理层基本稳了后面LWIP跑不通大概率就是协议栈配置问题。如果环回测试都过不了趁早回到硬件去查别急着调协议栈。4. LWIP协议栈移植与网络测试4.1 LWIP选择NO_SYS还是RTOS物理层验证通过后接下来就是让以太网真正跑起来核心工作是移植LWIP协议栈。LWIP是一个开源的轻量级TCP/IP协议栈专门为嵌入式系统设计也是STM32生态里最常用的选择。用CubeMX生成代码时可以直接在Middleware里勾选LWIP它会自动把协议栈源码和适配层代码集成好。LWIP有两种运行模式一种是无操作系统的NO_SYS模式另一种是配合RTOS的多线程模式。如果你的项目里没有跑RTOS或者只是做简单测试直接用NO_SYS模式就够了。这种模式下整个协议栈在主循环里通过MX_LWIP_Process()函数周期性地轮询处理网络数据包代码简单、内存占用小适合CPU资源不紧张的场景。如果你的项目用了FreeRTOS或者RT-Thread那建议开RTOS模式。LWIP在RTOS模式下会为协议栈创建专用的tcpip线程使用邮箱和信号量跟应用线程通信网络收发的实时性更好不容易因为某个应用层函数的阻塞而影响协议栈处理。4.2 关键配置项IP地址、MAC地址与内存池在CubeMX的LWIP配置页面有几个参数看起来不起眼实际对稳定性影响巨大。第一个是IP地址、子网掩码、网关。我测试阶段直接用静态IP比如IP设为192.168.1.10掩码255.255.255.0网关192.168.1.1。如果要用DHCP动态获取需要确保LWIP的DHCP选项开启并且你的网络上确实有DHCP服务器否则设备会一直处于获取不到地址的状态。第二个是MAC地址。每个以太网设备的MAC地址必须是全球唯一的不能和同一局域网内的其它设备重复。在测试阶段建议设置成类似02:00:11:22:33:44这种本地管理地址避免和某些设备的厂商前缀冲突。第三个是内存池的大小。LWIP需要为数据包分配内存核心参数是MEM_SIZE、PBUF_POOL_SIZE。如果设置太小高负载下会出现丢包设置太大又会浪费RAM。以STM32F407VET6的192KB RAM来说MEM_SIZE设为1600字节左右、PBUF_POOL_SIZE设成10到16个足够跑一个轻量级TCP服务器。第四个是PHY地址。在LWIP的eth.c或类似适配文件里会有一个PHY地址的宏定义比如STM32_PHY_ADDRESS。这个必须和你在CubeMX ETH配置里填的保持一致。我调试时踩过一次坑CubeMX里填0x00但LWIP适配层写死0x01结果就是两个模块各读各的PHY始终处于异常状态。4.3 Ping通、TCP通信与简单HTTP服务器的实现配置生成代码之后第一步当然是验证最基本的网络连通性Ping。烧录程序后把开发板的网口用网线直连电脑把电脑的有线网卡IP设置成同一个网段比如192.168.1.2然后打开命令行执行ping 192.168.1.10如果一切正常你应该能看到来自192.168.1.10的回复。这里有一个判断技巧如果Ping请求超时不要急着去查TCP/IP先确认Link灯是否亮、速率是否协商到100M再用逻辑分析仪抓一下RMII信号看有没有数据一步一步缩小范围。Ping通之后网络底层的收发通道已经没问题了接下来就可以加应用层。最常用的测试是TCP服务器。用LWIP的RAW API实现一个简单的TCP Server监听8080端口当有客户端连接进来时把收到的数据原样回传也就是回环服务器。用电脑端的网络调试助手就可以直接测试。如果想把演示效果做得更直观可以接着实现一个HTTP服务器。原理也不复杂用LWIP的HTTPD模块把网页内容做成数组或者放在文件系统里当浏览器访问设备IP时MCU返回一个HTML页面页面上可以实时显示CPU温度、ADC采样值或者某个GPIO的状态。这个功能在毕业设计和项目演示里非常加分。5. 踩坑实录与排查技巧5.1 常见问题速查表做以太网通信模块最耗时间的往往不是原理设计和代码编写而是出问题之后的排查过程。我把这些年踩过的坑整理成一个速查表方便你按图索骥现象可能原因检查项与解决办法Link灯不亮网线/RJ45焊接问题、变压器中心抽头接错、PHY供电异常换网线、用万用表查PHY电压、核对变压器接线MDIO读不到PHY IDPHY地址配置错误、MDIO引脚虚焊、PHY未复位核对PHYAD0/PHYAD1上下拉、确认nRST时序、检查MDC/MDIO波形晶振不振晶振负载电容不匹配、芯片虚焊换晶振、改负载电容值、用示波器直接测XTAL1/XTAL2只有本机Ping通设备外部不通PHY开启了Digital Loopback检查PHY寄存器0确保没有写入0x4000PING丢包严重时钟质量差、RMII走线太长、电源纹波大检查50MHz信号质量、缩短走线、加强电源滤波协商速率只有10MTX/RX差分线极性接反、变压器抽头接错检查PHY到RJ45的1/2、3/6线序初始化挂死PHY地址错误、软件复位循环等待超时核对PHY地址、看HAL_ETH_Init返回值这张表不能覆盖所有情况但覆盖了绝大多数初级项目中会出现的问题。5.2 时序问题的排查时钟不准导致丢包在所有以太网问题里最隐蔽、最让人崩溃的就是“Ping能通但丢包”这类时序问题。因为这不是完全不通而是间歇性丢包很容易让人误以为是软件问题反复调LWIP配置却毫无进展。实际排查下来根因往往出在50MHz参考时钟上。RMII标准对时钟精度要求很严格通常要求50MHz的误差在正负50ppm以内而且占空比不能太差。如果你用的是MCO输出方案主频PLL配置稍微偏一点MCO频率就不是精确的50MHz丢包率就会明显上升。另一个隐蔽问题就是时钟相位。RMII模式不要求MAC和PHY的参考时钟严格同相但要求它们的时钟是同一个来源。如果你的设计用了两个独立晶振分别给MAC和PHY供时钟即使频率都是50MHz只要有微小频偏长时间运行后采样点就会漂移表现为丢包率随时间缓慢增长。所以务必保证MAC和PHY参考时钟同源这是我反复强调的一点。排查方法用示波器或频率计测REF_CLK引脚的频率和占空比确认是50MHz、占空比尽量接近50%。如果频率偏差超过0.01%就要回头改时钟配置。5.3 关于性能与稳定性的几点补充最后再说几个和长期稳定性相关的细节。第一DMA描述符数量。CubeMX默认生成的ETH DMA描述符数量是4个RX和4个TX在高吞吐量场景下不太够。我一般把RX描述符增加到8个可以在一定程度上缓冲数据风暴时的压力。修改后注意LWIP的PBUF_POOL也要相应匹配避免内存不足。第二中断优先级。ETH的中断优先级如果设得过高可能频繁打断其它关键任务设得太低又可能导致网络数据包处理延迟。一般建议把ETH中断优先级设在中等偏高的水平同时确认LWIP的tcpip线程优先级合适。实际项目中我习惯把ETH中断设置为比系统心跳略高的优先级既能及时收包又不会把低优先级任务饿死。第三发热问题。LAN8720A本身功耗不高但如果长时间高负载跑100Mbps全双工芯片会轻微发热这属于正常现象。如果你的产品有散热要求可以在PCB上给PHY芯片的散热焊盘预留过孔连接到地平面帮助导热。第四静电防护。如果你的板子要接到工业环境RJ45的金属壳必须可靠接地最好在差分线对上并联TVS管比如PESD1ETH或同类器件。否则雷击浪涌或者静电脉冲很可能直接打坏PHY芯片这种损坏是不可逆的返修成本很高。结尾关于STM32LAN8720A我最后想分享的一点个人体会是这个方案的本质并不复杂真正难的在于把每一个细节都抠到位。原理图阶段把时钟方案定清楚、把PHY地址固化下来硬件阶段把电源和信号质量弄扎实软件阶段老老实实按物理层环回、Ping、TCP这样的节奏一步步验证绝大部分问题都能在早期被拦截住。如果你按照这篇内容从头到尾操作一遍大概率能在半天之内跑通网络通信。后续想扩展的话还可以在这个基础上加MQTT上云、TFTP固件升级、SNMP设备管理这些功能底层通信架构完全不需要改动。希望这篇文章能帮你少走一些弯路祝你一次点亮。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →