搜索
bottom↓
回复: 1

STM32F407ZG+DM9162E 使用cubemx创建LWIP ping不通问题解决解决方法

[复制链接]

出50入135汤圆

发表于 2024-1-4 10:20:22 | 显示全部楼层 |阅读模式
之前做了一个板子,使用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, &regvalue) < 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, &regvalue) >= 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, &regvalue) < 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复位前插入网线的问题;

出110入8汤圆

发表于 2024-1-4 16:10:54 | 显示全部楼层
可以看看硬汉的例程
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 16:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表