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条回答
yangkefeng
1楼-- · 2019-07-22 02:03
 精彩回答 2  元偷偷看……
feelingtaking
2楼-- · 2019-07-22 03:22
wjstaotao 发表于 2016-11-1 10:34
我按照你的方法试了下,成功读取了寄存器状态,可是有个问题是当我把网线插上后,并且重新链接网络成功(不 ...

regval = (LAN8720_ReadPHY(1)>>2)&0x01;                //从LAN8720的1号寄存器中读取连接状态中断: 0为断开 Link Status: 0 = link is down   1= link is up
jiangyy
3楼-- · 2019-07-22 09:15
我试了一下,还是不管用。能不能再细化一点呢?一直不成功
huanghuang
4楼-- · 2019-07-22 11:42
 精彩回答 2  元偷偷看……
lsmvc
5楼-- · 2019-07-22 16:12
定时读取LAN8720状态寄存器,监视网线的连接状态,初始化LWIP的时候注册关于网线连接的回调函数,这样网线连接有变化的时候就会自动调用相应的函数对网络重新进行配置
codywon
6楼-- · 2019-07-22 19:53
 精彩回答 2  元偷偷看……

一周热门 更多>