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

这篇具有很好参考价值的文章主要介绍了STM32踩坑:LAN8720未接网线,上电后再接网线,网络模块无法正常使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、问题描述

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

二、问题查找

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

三、问题解决

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

四、源码分享

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

	return status;
}
//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文章来源地址https://www.toymoban.com/news/detail-777244.html

到了这里,关于STM32踩坑:LAN8720未接网线,上电后再接网线,网络模块无法正常使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的以太网外设+PHY(LAN8720)使用详解(5):MAC及DMA配置

    stm32的ETH外设挂载在AHB1总线上,位于RCC_AHB1ENR的bit25-bit27: 相关语句如下: 直接调用ETH_DeInit函数来复位ETH外设 上述语句操作的寄存器如下: 首先设置位25为1复位以太网MAC(复位MAC寄存器到默认值),然后设置为0取消复位。 首先调用ETH_SoftwareReset函数复位MAC的DMA 上述语句操

    2024年02月03日
    浏览(45)
  • STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

    前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也就是说PHY地址共有5位。 应用程序可以从32个PHY中选择一个PHY,然后从任意PHY包含的32个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给

    2024年02月03日
    浏览(50)
  • STM32的以太网外设+PHY(LAN8720)使用详解(1):ETH和PHY介绍

    STM32F4系列MCU内部集成了一个以太网外设(ETH),可以通过介质独立接口(MII)或简化介质独立接口(RMII)和外部PHY(如LAN8720)相连实现MCU的联网功能。 STM32F4系列的以太网外设(ETH)框图如下: 以太网外设框图中包含了MII、RMII、SMI三种接口,它们的详细介绍如下: 1.2.1 介

    2024年01月23日
    浏览(52)
  • STM32的以太网外设+PHY(LAN8720)使用详解(6):以太网数据接收及发送

    1.1.1 检查是否接收到一帧完整报文 使用轮询的方式接收以太网数据是一种简单但是效率低下的方法,为了保证及时处理以太网数据我们需要在主循环内高频轮询是否接收到了以太网数据。轮询的函数为ETH_CheckFrameReceived,内容如下: 当以太网帧大于我们设置的DMA描述符buffer大

    2024年01月23日
    浏览(51)
  • 【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    KEIL:MDK_ARM_5.27 MCU:STM32F429IGT6 PHY_IC:LAN8720A LWIP:LWIP2.1.2 STM32CUBEMX:6.6.1 HAL:V1.27.1 LAN8720A使用RMII接口与STM32的ETH外设进行数据通信 STM32使用SMI接口读/写LAN8720A的寄存器 LAN8720A由外部25MHz晶振提供时钟,LED2/NINTSEL引脚配置为下拉,故PHY(LAN8720A)提供50MHz时钟给RMII的NINT/REFCLKO(此时引脚

    2024年02月08日
    浏览(52)
  • 关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp

    关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus 这里使用了大佬 小灰灰搞电子 的代码,文章看 STM32F407+LAN8720移植Lwip和freeModbus实现MODBUS TCP 代码看 STM32F407+LAN8720+LWIP移植freemodbus TCP.zip 他的代码是基于正点原子F407的板子开发的,如果是别的板子,需要修改引脚 小灰灰的代码里,没

    2024年02月14日
    浏览(39)
  • GD32F470之网络lwip+UDP配置+lan8720芯片

    先申明,本栏目用的都是GD32F470芯片240M,软件用的是keil,编写用的是C++(其实和C没有区别). 和STM32的lwip配置大致一样,主要不一样的地方在于 PHY的配置顺序问题,下面会讲到. 我用的是lan8720,所以头文件要修改一下,在gd32f4xx_enet.h中。 把PHY_TYPE改为LAN8700, PHY_ADDRESS改为0, 这是

    2023年04月09日
    浏览(49)
  • ESP32以太网(ETH)环境和参数配置,基于内部mac和外部PHY(LAN8720A)

    ESP32在网上的资料很多,但问题也各式各样。由于ESP32主要做wifi功能,因此对于以太网的资料也很少。相对应的开发板也很少。 本人使用的是淘宝上购买的雨甄机电的带网口的开发板(如下图) 安信可ESP-32S 参考资料主要以热心博主《兴趣使然_ 》的 (5条消息) ESP32 单片机学习

    2024年02月15日
    浏览(46)
  • GD32F450+LAN8720A,#FreeRTOS_Plus_TCP 网络协议栈移植教程

    (此博文在2023年10月写完后,在2023年11月有更新,更新内容包括博文内容与代码文件,代码效果不变,但更新后的逻辑更合理) FreeRTOS-Plus-TCP 是一种适用于 FreeRTOS 的可扩展的开源和线程安全 TCP/IP 堆栈。 FreeRTOS-Plus-TCP 提供了一个熟悉的 基于标准 Berkeley 套接字的接口, 简单易用

    2024年01月16日
    浏览(52)
  • Linux 网络驱动实验(PHY芯片LAN8720)

    和自己工作的IOT项目类似。项目里使用AWS的框架,分为linux系统和freertos系统。Freetros里需使用AT指令驱动4g,不同的模组驱动有差异,需自己实现模组AT驱动然后注册到AWS框架里面。 网络驱动是linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式linux 中也常常用到网

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包