|
之前做了一个板子,使用STM32F407ZG+DM9162E,DM9162E地址为1,之前使用cubemx创建工程,手动增加PHY硬件复位函数后,就可以ping通,前几天升级cubemx到最新版本,同一个板子生成LWIP工程时,死活无法ping通,调试发现新版本cubemx LWIP属性里面增加了一个platform settings的页面,里面须要选择PHY型号,没有DM9162E,选了一个LAN8742.调试发现LAN8742多了一个SMR的寄存器,可以读取PHY的地址,查看旧工程的代码,发现没有读这个寄存器,修改 int32_t LAN8742_Init(lan8742_Object_t *pObj)如下:
int32_t LAN8742_Init(lan8742_Object_t *pObj)
{
uint32_t tickstart = 0, regvalue = 0, addr = 0;
int32_t status = LAN8742_STATUS_OK;
if(pObj->Is_Initialized == 0)
{
if(pObj->IO.Init != 0)
{
/* GPIO and Clocks initialization */
pObj->IO.Init();
}
/* for later check */
pObj->DevAddr = LAN8742_MAX_DEV_ADDR + 1;
/* Get the device address from special mode register */
// 以下为屏蔽PHY地址匹配代码
// for(addr = 0; addr <= LAN8742_MAX_DEV_ADDR; addr ++)
// {
// if(pObj->IO.ReadReg(addr, LAN8742_SMR, ®value) < 0)
// {
// status = LAN8742_STATUS_READ_ERROR;
// /* Can't read from this device address
// continue with next address */
// continue;
// }
//
// if((regvalue & LAN8742_SMR_PHY_ADDR) == addr)
// {
// pObj->DevAddr = addr;
// status = LAN8742_STATUS_OK;
// break;
// }
// }
//以下两行为新增加代码,PHY地址写你的板子的PHY地址
pObj->DevAddr=0x01;
status = LAN8742_STATUS_OK;
if(pObj->DevAddr > LAN8742_MAX_DEV_ADDR)
{
status = LAN8742_STATUS_ADDRESS_ERROR;
}
/* if device address is matched */
if(status == LAN8742_STATUS_OK)
{
/* set a software reset */
if(pObj->IO.WriteReg(pObj->DevAddr, LAN8742_BCR, LAN8742_BCR_SOFT_RESET) >= 0)
{
/* get software reset status */
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, ®value) >= 0)
{
tickstart = pObj->IO.GetTick();
/* wait until software reset is done or timeout occured */
while(regvalue & LAN8742_BCR_SOFT_RESET)
{
if((pObj->IO.GetTick() - tickstart) <= LAN8742_SW_RESET_TO)
{
if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, ®value) < 0)
{
status = LAN8742_STATUS_READ_ERROR;
break;
}
}
else
{
status = LAN8742_STATUS_RESET_TIMEOUT;
break;
}
}
}
else
{
status = LAN8742_STATUS_READ_ERROR;
}
}
else
{
status = LAN8742_STATUS_WRITE_ERROR;
}
}
}
if(status == LAN8742_STATUS_OK)
{
tickstart = pObj->IO.GetTick();
/* Wait for 2s to perform initialization */
while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)
{
}
pObj->Is_Initialized = 1;
}
return status;
}
然后再修改static void low_level_init(struct netif *netif)函数,在最下面增加下面一句:
LAN8742_SetLinkState(&LAN8742, LAN8742_STATUS_100MBITS_FULLDUPLEX);;
就可以ping通了,这句不写就不行,不知道什么原因。新版本解决了之前旧版本须要在CPU复位前插入网线的问题;
|
|