野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 104|回复: 0

stm32h743 通过cubmex移植lwip问题

[复制链接]
发表于 2026-1-19 15:26:46 | 显示全部楼层 |阅读模式
用的是野火h743 挑战者v2的板子,野火给的例程调试过了,想自己写一个,开始准备直接头铁移植lwip,结果不行,只能试试用cumbex的lwip先移植试试。结果就是ping不通。想让大家帮忙看看问题在哪里。
野火论坛202601191513536347..png


ent外设配置
野火论坛202601191514579069..png 野火论坛202601191515551727..png

Lwip
野火论坛202601191516269844..png

程序方面,也是参考了官方和野火的教程移植lan8720a驱动。
lan8720.c:

#include "lan8720a.h"
#include "phy_t.h"

#include "main.h"

#define LAN8720A_MAX_DEV_ADDR   ((uint32_t)31U)

int32_t  LAN8720A_RegisterBusIO(PHY_Object_t *pObj, PHY_IOCtx_t *ioctx)
{
        if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick)
                return -1;
       
        pObj->IO.Init = ioctx->Init;
  pObj->IO.DeInit = ioctx->DeInit;
  pObj->IO.ReadReg = ioctx->ReadReg;
  pObj->IO.WriteReg = ioctx->WriteReg;
  pObj->IO.GetTick = ioctx->GetTick;
       
        return 0;
}


int32_t LAN8720A_Init(PHY_Object_t *pObj)
{
        uint32_t regvalue = 0;
        uint32_t id1=0x00;
        uint32_t id2=0x00;
        int32_t status = 0;
        uint32_t time_out=0;
        if(pObj->Is_Initialized == 0)
        {
                if(pObj->IO.Init!=0)
                        pObj->IO.Init();
                pObj->DevAddr=LAN8720A_MAX_DEV_ADDR+1;
               
                for(uint16_t addr=0;addr<LAN8720A_MAX_DEV_ADDR;addr++)
                {
                        pObj->IO.ReadReg(addr,0x02,&id1);
                        pObj->IO.ReadReg(addr,0x03,&id2);
                        status=-1;
                        if(id1==0x0007 && id2==0xC0F1)//遍历地址得到芯片的地址
                        {
                                pObj->DevAddr=addr;
                                status=0;
                                break;
                        }
                }
                if(status==-1)
                        return status;//
               
                if(pObj->IO.WriteReg(pObj->DevAddr,0x00,0x8000)!=0)//复位
                {
                        status=-1;
                        return status;
                }
                HAL_Delay(0xFFF);
                if(pObj->IO.WriteReg(pObj->DevAddr,0x00,0x1000)!=0)//配置自动模式
                {
                        status=-1;
                        return status;
                }
                HAL_Delay(0xFFF);
               
                do
                {
                        pObj->IO.ReadReg(pObj->DevAddr,0x01,&regvalue);//等待自动协商就绪
                        time_out++;
                        if(time_out>0xFFFF)
                        {
                                status=3;
                                return status;
                        }
                }
                while (((regvalue & 0x0020) != 0x0020));
                status=0;
                return status;       
        }
}

int32_t LAN8720A_GetLinkSta(PHY_Object_t *pObj)
{
        uint32_t readval=0;
        if(pObj->IO.ReadReg(pObj->DevAddr,0x1F,&readval)==0)
                return readval;
        else
                return 0;       
}


ethernetif.c

void ethernet_link_check_lan8720a_sta(struct netif *netif)
{
  ETH_MACConfigTypeDef MACConf = {0};
  static int32_t PHYLinkState = 0;
  uint32_t linkchanged = 0U, speed = 0U, duplex = 0U;
  PHYLinkState=LAN8720A_GetLinkSta(&LAN8720A);
  if(netif_is_link_up(netif) && PHYLinkState)
  {
    HAL_ETH_Stop(&heth);
    netif_set_down(netif);
    netif_set_link_down(netif);
  }
  else if(!netif_is_link_up(netif) && (PHYLinkState))
  {
                static uint16_t tmpxdd=0;
                tmpxdd=PHYLinkState & 0x1C;
    switch ((PHYLinkState & 0x1C))
    {
      case 0x18:
      {
        speed = ETH_SPEED_100M;
        duplex = ETH_FULLDUPLEX_MODE;
        linkchanged = 1;   
        break;
      }
      case 0x08:
      {
        speed = ETH_SPEED_100M;
        duplex = ETH_HALFDUPLEX_MODE;
        linkchanged = 1;
        break;
      }
      case 0x14:
      {
        speed = ETH_SPEED_10M;
        duplex = ETH_FULLDUPLEX_MODE;
        linkchanged = 1;
        break;
      }
      case 0x04:
      {
        speed = ETH_SPEED_10M;
        duplex = ETH_HALFDUPLEX_MODE;
        linkchanged = 1;
        break;
      }
      default:
        break;
      }
      if(linkchanged)
      {
        HAL_ETH_GetMACConfig(&heth, &MACConf);
        MACConf.DuplexMode = duplex;
        MACConf.Speed = speed;
        HAL_ETH_SetMACConfig(&heth, &MACConf);
        HAL_ETH_Start(&heth);
                                //HAL_ETH_Start_IT(&heth);
        netif_set_up(netif);
        netif_set_link_up(netif);
      }
  }
}

low_lvel_init部分

  /* Accept broadcast address and ARP traffic */
  /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
  #if LWIP_ARP
    netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
  #else
    netif->flags |= NETIF_FLAG_BROADCAST;
  #endif /* LWIP_ARP */

/* USER CODE BEGIN PHY_PRE_CONFIG */

/* USER CODE END PHY_PRE_CONFIG */
  /* Set PHY IO functions */
  LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx);

  /* Initialize the LAN8742 ETH PHY */
  if(LAN8742_Init(&LAN8742) != LAN8742_STATUS_OK)
  {
    netif_set_link_down(netif);
    netif_set_down(netif);
    return;
  }

  if (hal_eth_init_status == HAL_OK)
  {
  /* Get link state */
  ethernet_link_check_state(netif);
  }
  else
  {
    Error_Handler();
  }
#endif /* LWIP_ARP || LWIP_ETHERNET */

/* USER CODE BEGIN LOW_LEVEL_INIT */

        LAN8720A_RegisterBusIO(&LAN8720A,&LAN8720A_IOCtx);
  if(LAN8720A_Init(&LAN8720A)==0)
        {
                netif_set_link_down(netif);
    netif_set_down(netif);
        }
  if (hal_eth_init_status == HAL_OK)
  {
    ethernet_link_check_lan8720a_sta(netif);
  }

。上传的程序感觉是,cubumex生成的太大了,删了driver里面的东西,需要用cumbex重新生成一次再打开程序,希望有大哥能救一下,已经想到头炸了。


野火论坛202601191516533714..png

stm32h743iitxxxx.zip

3.3 MB, 下载次数: 4

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2026-1-27 04:09 , Processed in 0.128135 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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