实现网线热插拔,不必开机前就插上网线。就要把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;
} |