天线|RF射频
直播中

陈墨

7年用户 318经验值
私信 关注
[问答]

为什么STM32F429+LWIP(DP83848)连接上网络之后就是ping不通?

1.使用的芯片是STM32F429、PHY是dp83848.
软件工程使用的是原子大概的F429+UCOSii+LWIP的工程,修改了PhyAddress为0x01,
同时修改了/* Section 4: Extended PHY Registers */
#define PHY_SR                                ((uint16_t)16)                 //DP83848的PHY状态寄存器地址
#define PHY_SPEED_STATUS    ((uint16_t)0x0002)         //DP83848 PHY速度值掩码
#define PHY_DUPLEX_STATUS   ((uint16_t)0x0004) //DP83848 PHY连接状态值掩码
但是连接上网络之后就是ping不通。望各位给点调试思路。
软件运行之后现象:
1.RJ45黄灯常亮,绿灯一直在闪烁;
2.仿真查看lwip_comm_init初始化都是正常的。
3.程序一直在进中断服务函数,UCOSII任务运行都是正常的。
void ETH_IRQHandler(void)
{
    OSIntEnter();
    while(ETH_GetRxPktSize(ETH_Handler.RxDesc))   
    {
        lwip_pkt_handle();//处理以太网数据,即将数据提交给LWIP
    }
    //清除中断标志位
    __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_R);
    __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_NIS);
    OSIntExit();  
}

回帖(14)

秦玫

2019-10-15 06:24:53
DP83848.c的代码
[C] 纯文本查看 复制代码
#include "DP83848IVV.h"#include "lwip_comm.h"#include "delay.h"#include "malloc.h"#include "includes.h"ETH_HandleTypeDef ETH_Handler;      //以太网句柄ETH_DMADescTypeDef *DMARxDscrTab;//以太网DMA接收描述符数据结构体指针ETH_DMADescTypeDef *DMATxDscrTab;//以太网DMA发送描述符数据结构体指针 uint8_t *Rx_Buff; //以太网底层驱动接收buffers指针 uint8_t *Tx_Buff; //以太网底层驱动发送buffers指针  //DP83848初始化//返回值:0,成功;//    其他,失败u8 DP83848_Init(void){          u8 macaddress[6];    macaddress[0]=lwipdev.mac[0]; macaddress[1]=lwipdev.mac[1]; macaddress[2]=lwipdev.mac[2];macaddress[3]=lwipdev.mac[3];   macaddress[4]=lwipdev.mac[4];macaddress[5]=lwipdev.mac[5];        ETH_Handler.Instance=ETH;    ETH_Handler.Init.AutoNegotiation=ETH_AUTONEGOTIATION_ENABLE;//使能自协商模式     ETH_Handler.Init.Speed=ETH_SPEED_100M;//速度100M,如果开启了自协商模式,此配置就无效    ETH_Handler.Init.DuplexMode=ETH_MODE_FULLDUPLEX;//全双工模式,如果开启了自协商模式,此配置就无效    ETH_Handler.Init.PhyAddress=DP83848_PHY_ADDRESS;//DP83848地址      ETH_Handler.Init.MACAddr=macaddress;            //MAC地址      ETH_Handler.Init.RxMode=ETH_RXINTERRUPT_MODE;   //轮训接收模式     ETH_Handler.Init.ChecksumMode=ETH_CHECKSUM_BY_HARDWARE;//硬件帧校验      ETH_Handler.Init.MediaInterface=ETH_MEDIA_INTERFACE_RMII;//RMII接口      if(HAL_ETH_Init(Ð_Handler)==HAL_OK)    {        return 0;   //成功    }    else return 1;  //失败}//ETH底层驱动,时钟使能,引脚配置//此函数会被HAL_ETH_Init()调用//heth:以太网句柄void HAL_ETH_MspInit(ETH_HandleTypeDef *heth){    GPIO_InitTypeDef GPIO_Initure;        __HAL_RCC_ETH_CLK_ENABLE();             //开启ETH时钟    __HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE();//开启GPIOB时钟    __HAL_RCC_GPIOC_CLK_ENABLE();//开启GPIOC时钟    __HAL_RCC_GPIOG_CLK_ENABLE();//开启GPIOG时钟        /*网络引脚设置 RMII接口     ETH_MDIO -------------------------> PA2    ETH_MDC --------------------------> PC1    ETH_RMII_REF_CLK------------------> PA1    ETH_RMII_CRS_DV ------------------> PA7    ETH_RMII_RXD0 --------------------> PC4    ETH_RMII_RXD1 --------------------> PC5    ETH_RMII_TX_EN -------------------> PG11 //DP83848 此引脚使用的PG11    ETH_RMII_TXD0 --------------------> PG13    ETH_RMII_TXD1 --------------------> PG14*/        //PA1,2,7    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;     GPIO_Initure.Mode=GPIO_MODE_AF_PP;          //推挽复用    GPIO_Initure.Pull=GPIO_NOPULL;              //不带上下拉    GPIO_Initure.Speed=GPIO_SPEED_HIGH;         //高速    GPIO_Initure.Alternate=GPIO_AF11_ETH;        //复用为ETH功能    HAL_GPIO_Init(GPIOA,&GPIO_Initure);          //初始化        //修改为PG11    GPIO_Initure.Pin=GPIO_PIN_11;               //PG11    HAL_GPIO_Init(GPIOG,&GPIO_Initure);         //始化        //PC1,4,5    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; //PC1,4,5    HAL_GPIO_Init(GPIOC,&GPIO_Initure);         //初始化    //PG13,14    GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14;   //PG13,14    HAL_GPIO_Init(GPIOG,&GPIO_Initure);         //初始化        HAL_NVIC_SetPriority(ETH_IRQn,0,0);         //网络中断优先级应该高一点    HAL_NVIC_EnableIRQ(ETH_IRQn);}//读取PHY寄存器值u32 DP83848_ReadPHY(u16 reg){    u32 regval;    HAL_ETH_ReadPHYRegister(Ð_Handler,reg,®val);    return regval;}//向DP83848指定寄存器写入值//reg:要写入的寄存器//value:要写入的值void DP83848_WritePHY(u16 reg,u16 value){    u32 temp=value;    HAL_ETH_ReadPHYRegister(Ð_Handler,reg,&temp);}//得到DP83848的速度模式//返回值://001:10M半双工//101:10M全双工//010:100M半双工//110:100M全双工//其他:错误.u8 DP83848_Get_Speed(void){u8 speed;speed=((DP83848_ReadPHY(16)&0x06)>>1); //从DP83848的16号寄存器中读取网络速度和双工模式return speed;}extern void lwip_pkt_handle(void);//在lwip_comm.c里面定义//中断服务函数void ETH_IRQHandler(void){    OSIntEnter();     while(ETH_GetRxPktSize(ETH_Handler.RxDesc))       {        lwip_pkt_handle();//处理以太网数据,即将数据提交给LWIP    }    //清除中断标志位    __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_R);     __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_NIS);     OSIntExit();  }//获取接收到的帧长度//DMARxDesc:接收DMA描述符//返回值:接收到的帧长度u32  ETH_GetRxPktSize(ETH_DMADescTypeDef *DMARxDesc){    u32 frameLength = 0;    if(((DMARxDesc->StatusÐ_DMARXDESC_OWN)==(uint32_t)RESET) &&     ((DMARxDesc->StatusÐ_DMARXDESC_ES)==(uint32_t)RESET) &&     ((DMARxDesc->StatusÐ_DMARXDESC_LS)!=(uint32_t)RESET))     {        frameLength=((DMARxDesc->StatusÐ_DMARXDESC_FL)>>ETH_DMARXDESC_FRAME_LENGTHSHIFT);    }    return frameLength;}//为ETH底层驱动申请内存//返回值:0,正常//    其他,失败u8 ETH_Mem_Malloc(void){ DMARxDscrTab=mymalloc(SRAMIN,ETH_RXBUFNB*sizeof(ETH_DMADescTypeDef));//申请内存DMATxDscrTab=mymalloc(SRAMIN,ETH_TXBUFNB*sizeof(ETH_DMADescTypeDef));//申请内存  Rx_Buff=mymalloc(SRAMIN,ETH_RX_BUF_SIZE*ETH_RXBUFNB);//申请内存Tx_Buff=mymalloc(SRAMIN,ETH_TX_BUF_SIZE*ETH_TXBUFNB);//申请内存if(!(u32)&DMARxDscrTab||!(u32)&DMATxDscrTab||!(u32)&Rx_Buff||!(u32)&Tx_Buff){ETH_Mem_Free();return 1;//申请失败}return 0;//申请成功}//释放ETH 底层驱动申请的内存void ETH_Mem_Free(void){ myfree(SRAMIN,DMARxDscrTab);//释放内存myfree(SRAMIN,DMATxDscrTab);//释放内存myfree(SRAMIN,Rx_Buff);//释放内存myfree(SRAMIN,Tx_Buff);//释放内存  }
举报

洪欣意

2019-10-15 06:41:04
各位给点调试的思路,目前不知道怎么继续调试下去了
举报

张蕾

2019-10-15 06:59:37
期待回复啊!!!
举报

蒋美燕

2019-10-15 07:14:16
不懂,帮顶
举报

更多回帖

发帖
×
20
完善资料,
赚取积分