STM32F407 + LAN8720A + LWIP 实现TCP客户端
环境说明:
- 开发板:某宝买的,STM32F407IG
- STM32CUBEMX5.6
- HAL Lib Version 1.25
(一)配置时钟
(二)配置调试串口
(三)配置以太网ETH
(1)基础配置
顺序依次说明:
- LAN8720A使用的是RMII接口进行配置寄存器
- 自动重连使能
- MAC地址
- LAN8720A的物理地址(类似IIC的从设备地址),0或者1,LAN8720A上电后会读取
RXER/PHYAD0 引脚状态以此来确定设备地址,这里需要根据你自己实际的原理图进行配置,我的原理图是该引脚是悬空的,所以默认就是0。
- 接收模式:可选轮询和中断,我选择了轮询模式
- 校验:可选软件和硬件,我选择了由硬件去校验
除此之外还有一个复位引脚
(2)高级配置
LAN8720A数据手册pdf下载:https://www.alldatasheet.com/datasheet-pdf/pdf/516623/SMSC/LAN8720A.html
看下图,此处的配置就是根据实际的PHY芯片寄存器进行配置了,默认的是LAN8742A,而我们使用的是LAN8720A,所以需要更改为 user PHY,配置项默认即可。
对于默认配置,我们将默认配置与LAN8720A的数据手册进行对比然后检查是否正确,以
由上图的基本控制寄存器表可知该寄存器偏移地址为0,大小是16位,第15位是软件复位控制,=1是复位,默认为0,那么如果想要复位LAN8720A就需要将该寄存器的第15位置一,也就是0x8000,对比STM32CUBE的默认配置发现一致,其他配置项同理也是这么检查,检查完毕后发现默认配置是OK的。
配置LWIP协议栈
如上图,需要开启状态改变回调函数和连接状态改变回调函数,否则无法实现网线的热拔插。
工程代码修改
- 文件
ethernetif.c 中找到函数low_level_init 函数,添加复位LAN8720A代码:
- 在main函数的主循环中调用函数
MX_LWIP_Process 。 - 修改
MX_LWIP_Process 函数,在其中加入:
这个函数的作用是检测当前网线的连接状态,如果状态发生改变(例如网线被拔插了一下),那么就会调用回调函数ethernetif_update_config ,看函数名就知道这是更新配置,而这个函数尾部又调用了函数ethernetif_notify_conn_changed ,看函数名可知道函数作用是通知连接状态改变,所以我们就更改此函数来达到热拔插自动重连的目的。
到此,连接上网线ping测试一下即可。
待续。。。