OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4745|回复: 5

用原子的HAL库将lan8720部分修改为dp83848,有大神调通过吗

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-12-7
在线时间
45 小时
发表于 2019-1-30 16:03:29 | 显示全部楼层 |阅读模式
10金钱
H743开发板,HAL库的例程中用的是LAN8720,
由于我们硬件要使用DP83848,
所以对原子例程做了修改,对应DP83848的管脚定义和寄存器配置,
可是修改后,寄存器读出来的值始终是0XFFFF,这可能会是什么情况。

以下均是在原子例程上做的修改,

#define DP83848_PHY_ADDRESS       0x01 /* Relative to STM322xG-EVAL Board */

void HAL_ETH_MspInit_dp83848(ETH_HandleTypeDef *heth)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOA_CLK_ENABLE();   //开启GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE();   //开启GPIOB时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();   //开启GPIOC时钟
    __HAL_RCC_GPIOG_CLK_ENABLE();   //开启GPIOG时钟
    __HAL_RCC_ETH1MAC_CLK_ENABLE();         //使能ETH1 MAC时钟
    __HAL_RCC_ETH1TX_CLK_ENABLE();          //使能ETH1发送时钟
    __HAL_RCC_ETH1RX_CLK_ENABLE();          //使能ETH1接收时钟
   
GPIO_Initure.Pin = GPIO_PIN_8;
    GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;
    GPIO_Initure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
//PA1,2,7
GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;
  GPIO_Initure.Pull = GPIO_NOPULL;
GPIO_Initure.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);   
  
    //PC1,4,5
    GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;
GPIO_Initure.Pull = GPIO_NOPULL;
GPIO_Initure.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     
//PB11,12,13
    GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;   
GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;
GPIO_Initure.Pull = GPIO_NOPULL;
GPIO_Initure.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);        
    HAL_NVIC_SetPriority(ETH_IRQn,1,0);         //网络中断优先级应该高一点
    HAL_NVIC_EnableIRQ(ETH_IRQn);
}

int32_t DP83848_Init(void)
{     
    u8 macaddress[6];
    u32 timeout=0;
    u32 regval=0;
    u32 phylink=0;
    int32_t status=DP83848_STATUS_OK;
   
    //硬件复位
    INTX_DISABLE();                         //关闭所有中断,复位过程不能被打断!
    DP83848_Phy_Rest();
    INTX_ENABLE();                          //开启所有中断
   
    NETMPU_Config();                        //MPU保护设置
    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];
   
    DP83848_ETHHandle.Instance=ETH;                             //ETH
    DP83848_ETHHandle.Init.MACAddr=macaddress;                  //mac地址
    DP83848_ETHHandle.Init.MediaInterface=HAL_ETH_RMII_MODE;    //RMII接口
    DP83848_ETHHandle.Init.RxDesc=DMARxDscrTab;                 //发送描述符
    DP83848_ETHHandle.Init.TxDesc=DMATxDscrTab;                 //接收描述如
    DP83848_ETHHandle.Init.RxBuffLen=ETH_MAX_PACKET_SIZE;       //接收长度
    HAL_ETH_Init(&DP83848_ETHHandle);                           //初始化ETH
    HAL_ETH_SetMDIOClockRange(&DP83848_ETHHandle);

    if(DP83848_WritePHY(DP83848_PHY_BCR,DP83848_PHY_Reset)>=0) //DP83848软件复位
    {
        //等待软件复位完成
        if(DP83848_ReadPHY(DP83848_PHY_BCR,®val)>=0)
        {
            while(regval & DP83848_PHY_Reset)
            {
                if(DP83848_ReadPHY(DP83848_PHY_BCR,&reg;val)<0)
                {
                    status=DP83848_STATUS_READ_ERROR;
                    break;
                }
                delay_ms(10);
                timeout++;
                if(timeout>=DP83848_TIMEOUT) break; //超时跳出,5S
            }
   
        }
        else
        {
            status=DP83848_STATUS_READ_ERROR;
        }
    }
    else
    {
        status=DP83848_STATUS_WRITE_ERROR;
    }
    DP83848_StartAutoNego();                //开启自动协商功能
   
    if(status== DP83848_STATUS_OK)           //如果前面运行正常就延时1s
        delay_ms(1000);                     //等待1s
      
    //等待网络连接成功
    timeout=0;
    while(DP83848_GetLinkState()<= DP83848_STATUS_LINK_DOWN)  
    {
        delay_ms(10);
        timeout++;
        if(timeout>= DP83848_TIMEOUT)
        {
            status= DP83848_STATUS_LINK_DOWN;
            break; //超时跳出,5S
        }
    }
    phylink=LAN8720_GetLinkState();
    if(phylink==DP83848_STATUS_100MBITS_FULLDUPLEX)
        printf("DP83848:100Mb/s FullDuplex\r\n");
    else if(phylink==DP83848_STATUS_100MBITS_HALFDUPLEX)
        printf("DP83848:100Mb/s HalfDuplex\r\n");
    else if(phylink==DP83848_STATUS_10MBITS_FULLDUPLEX)
        printf("DP83848:10Mb/s FullDuplex\r\n");
    else if(phylink==DP83848_STATUS_10MBITS_HALFDUPLEX)
        printf("DP83848:10Mb/s HalfDuplex\r\n");
    return status;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-1-30 21:47:50 | 显示全部楼层
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-5-29
在线时间
5 小时
发表于 2019-2-21 20:55:16 | 显示全部楼层
您好,您程序调通了吗?
回复

使用道具 举报

头像被屏蔽

0

主题

207

帖子

0

精华

禁止发言

积分
276
金钱
276
注册时间
2019-3-4
在线时间
4 小时
发表于 2019-4-2 08:12:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-5-23
在线时间
2 小时
发表于 2019-5-23 14:37:51 | 显示全部楼层
同问。。。。调的怎么样了啊?我这边卡在TCP任务里建立连接处了,总是进去之后就出不来了,那位大神帮帮忙吧
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2022-9-5
在线时间
8 小时
发表于 2022-9-15 14:05:15 | 显示全部楼层
您好!请问您调通了么,我最近也在调DP83848的希望向您·请教一下。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 14:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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