F407开发板网线实现热插拔方法

2019-07-20 01:26发布

实现网线热插拔,不必开机前就插上网线。就要把lwip_comm_init()放在while(1)循环里。但是当插上网线发现也不能初始化,打断点发现是申请内存失败ETH_Mem_Malloc(),lwip_comm_mem_malloc();这是因为未插网线时多次进行初始化(LAN8720_Init()初始化失败),多次申请内存且没有释放导致可用内存不足;所以在初始化失败后要释放内存        ETH_Mem_Free();lwip_comm_mem_free();。这样就可以随时插入网线都可以初始化成功连接网络了。插网线连接实现了,那么拔掉网线不断开连接怎么办呢?
这就可以查询lan8720的中断来实现。LAN8720A的寄存器29的第4位中断位为1时掉线中断,可以查询此位来判断网线的连接状态,当中断置1时可以断开网络,重新等待连接。
u8 LAN8720_Get_link(void)
{
u8 link;
link=((ETH_ReadPHYRegister(0x00,29)&0x10)>>4); //从LAN8720的29号寄存器中读取连接状态中断:1为断开
return link;
}       
               
       
               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
wjstaotao
1楼-- · 2019-07-21 06:54
 精彩回答 2  元偷偷看……
weilong1370
2楼-- · 2019-07-21 12:25
 精彩回答 2  元偷偷看……
wjstaotao
3楼-- · 2019-07-21 15:11
weilong1370 发表于 2016-11-1 14:47
最好复位一下不会出现什么问题

按照L8720A参考手册上寄存器的说法来看,读取了那一位,如果网线接上后就应该置零,可是并没有置零,读出来的值仍然为1,即代表断线。还有如果是复位的话,那就没意义了啊
wjstaotao
4楼-- · 2019-07-21 19:48
 精彩回答 2  元偷偷看……
45度斜向上
5楼-- · 2019-07-21 22:16
正好在弄热插拔网线,试下
45度斜向上
6楼-- · 2019-07-21 23:56
wjstaotao 发表于 2016-11-1 15:48
按照L8720A参考手册上寄存器的说法来看,读取了那一位,如果网线接上后就应该置零,可是并没有置零,读出 ...

我也遇到这个问题,读取的那一位在插线网线后也一直是1,请问您解决了嘛?

一周热门 更多>