在使用lwip时,关于以太网热插拔问题可以归类为一下几种问题:
(1):单片机启动前未插网线,启动后死活连不上。
(2):在使用过程中拔掉网线后,不复位或者重启的话,ping不通并且调试软件连不上。
原因:由于未检测到网络,导致自动协商、连接状态等超时后,执行语句return ETH_ERROR;从而导致程序后半部分的初始化程序未执行,例如MAC的配置语句未执行。
简而言之就是初始化未完成。
有一个简单粗暴,比较快的,一劳永逸的办法(虽然感觉不是特别好,但是真的很粗暴很快乐!):
将stm324x7_eth.c文件的ETH_Init()函数中的return ETH_ERROR;给屏蔽掉。
例如
// do
{
timeout++;
} while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));
/* Return ERROR in case of timeout */
if(timeout == PHY_READ_TO)
{
//return ETH_ERROR;/*****自动协商超时**************/
}
将return ETH_ERROR()屏蔽即可,屏蔽掉并不会影响程序的执行和初始化。
同时也不要把main()函数中的lwip_comm_init(和tcp_server_init()放在while 中,会导致因为有返回值一直初始化。
因为修改的是底层文件,所以无论有无操作系统,都是比较方便的方法,虽然不是特别好的方法。