初中生
最后登录1970-1-1
在线时间 小时
注册时间2021-10-20
|
用的是野火h743 挑战者v2的板子,野火给的例程调试过了,想自己写一个,开始准备直接头铁移植lwip,结果不行,只能试试用cumbex的lwip先移植试试。结果就是ping不通。想让大家帮忙看看问题在哪里。
ent外设配置
Lwip
程序方面,也是参考了官方和野火的教程移植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,®value);//等待自动协商就绪
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重新生成一次再打开程序,希望有大哥能救一下,已经想到头炸了。
|
|