网站建设怎么更改图片,东阳网站建设价格,一个网站服务器一年大概多少钱,黄页88官网LAN8720未接网线#xff0c;上电后再接网线#xff0c;网络模块无法正常使用
一、问题描述
最近因为做的项目出了BUG#xff0c;STM32 单片机在未接网线的状态下#xff0c;上电一段时间后#xff0c;将网线插入网口后#xff0c;IP地址ping不通#xff0c;网络模块无…LAN8720未接网线上电后再接网线网络模块无法正常使用
一、问题描述
最近因为做的项目出了BUGSTM32 单片机在未接网线的状态下上电一段时间后将网线插入网口后IP地址ping不通网络模块无法正常使用重启一下程序就没问题了。
二、问题查找
这次的问题查找全靠网友把问题扔给百度然后就能看见一大群网友的评论都反馈有 LAN8720 在没有接网线的情况下上电后插入网线网络模块无法正常工作然后就有大佬些评论回复我看的我觉得比较靠谱的一个回答如下图
三、问题解决
我觉得讲的蛮有道理的然后就通过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