STM32踩坑:LAN8720未接网线,上电后再接网线,网络模块无法正常使用

LAN8720未接网线,上电后再接网线,网络模块无法正常使用

一、问题描述

最近因为做的项目出了BUG,STM32 单片机在未接网线的状态下,上电一段时间后,将网线插入网口后,IP地址ping不通,网络模块无法正常使用,重启一下程序就没问题了。

二、问题查找

这次的问题查找全靠网友,把问题扔给百度,然后就能看见一大群网友的评论,都反馈有 LAN8720 在没有接网线的情况下上电后,插入网线,网络模块无法正常工作,然后就有大佬些评论回复,我看的我觉得比较靠谱的一个回答如下图:

三、问题解决

我觉得讲的蛮有道理的,然后就通过LAN8720芯片的某个寄存器位,做了个热插拔功能,如果检测到不存在网线,则不初始化网络模块,直到检测到网线,再开始初始化网络,刚开始测试的时候,因为程序和板子不匹配,所以ping的时候延迟有点大,然后我也没找到这延迟大的问题,一直以为实现热插拔的逻辑有问题,考虑了好几种可能性,问题一直没得到解决,后面试了下和程序匹配的开发板,我勒个去,没问题,这会儿我才意识到是程序不匹配的问题,这里分享一下热插拔的模块代码。

四、源码分享

c++ 复制代码
//lan8720.c
u8 LAN8720_Get_Link() {
	u8 status;
	
	status = ((ETH_ReadPHYRegister(LAN8720_PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status) >> 2);

	return status;
}
c++ 复制代码
//server.c
void server_init()
{
	int i = 0;
	u8 status;

	if(!last_status) {
		LAN8720_Init();
	}

	status = LAN8720_Get_Link();

	if(status == 1) {
		//网络初始化,这里省略千万行代码
		......

		server_start();
	}
		
	last_status = 0;
}

void server_start()
{
	ETH_MACAddressConfig(ETH_MAC_Address0, mjipdev.mac);        //向STM32F4的MAC地址寄存器中写入MAC地址
	ETH_DMATxDescChainInit(DMATxDscrTab, Tx_Buff, ETH_TXBUFNB);
	ETH_DMARxDescChainInit(DMARxDscrTab, Rx_Buff, ETH_RXBUFNB);

	ETH_Start(); //开启MAC和DMA
}

void server_online_chk() {
	u8 status = LAN8720_Get_Link();

	if(status == 0x01 && last_status == 0x00) {
		server_init();
	}
	else if(status == 0x00 && last_status == 0x01) {
		ETH_Stop();
	}

	last_status = status;
}

最后在 main 函数的 while 循环中调用 server_online_chk() 函数即可!

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

感谢来自于网友的经验分享,小编这里稍微处理了一下,然后分享给大家,下面是参考博文:
《STM32移植LWIP网线热插入网络不通的解决办法》

https://blog.csdn.net/xukao5671927/article/details/77765464

相关推荐
单片机仿真设计7 小时前
基于 51 单片机的数字温度计(DS18B20+LCD1602+Proteus 仿真,支持阈值可调声光报警)
单片机·嵌入式硬件·proteus·课设
芝士爱沙拉7 小时前
原生内置agent智能开发能力的MCU IDE-MounRiver Studio
ide·单片机·嵌入式硬件
路上有只喵7 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇4
单片机·嵌入式硬件
YYRAN_ZZU7 小时前
FlameGraph 火焰图介绍和使用
linux·嵌入式硬件
小向是个Der8 小时前
嵌入式进阶——编译与链接
汇编·单片机·学习·编译原理·交叉编译
【 STM32开发 】8 小时前
【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA (F103版本)
stm32·单片机·嵌入式硬件·1024程序员节
动词ing9 小时前
【51单片机】独立按键控制LED灯亮灭
单片机·嵌入式硬件·51单片机
Industio_触觉智能9 小时前
瑞芯微工业ADC采集实战-上|AD7616&RK3506 FlexBus高速并行采集落地
嵌入式硬件·硬件架构·硬件工程·adc·瑞芯微·rk3506·flexbus
女神下凡9 小时前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范
Zhao136824553919 小时前
AT7456E 中科微电子 OSD图形叠加芯片/发生器芯片 无人机显示开发
嵌入式硬件