OpenEdv-开源电子网

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

stm32f407 + lan8720 通信失败

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-3-16
在线时间
2 小时
发表于 2022-6-20 12:05:24 | 显示全部楼层 |阅读模式
1金钱
stm32f407 + lan8720 通信失败,提示网线灯不亮,烧写程序时是亮的。
code如下:


#ifdef  __cplusplus
extern "C" {
#endif

    /* please include system public header files here */

    /* please include moudle private header files here */
#include "lan8720.h"
#include "lwip_comm.h"
#include "SysTick.h"
#include "malloc.h"
    /* please define all global variables here */

    ETH_HandleTypeDef ETH_Handler;      //òÔì«íø¾ä±ú

    __align(4) ETH_DMADescTypeDef *DMARxDscrTab;        //òÔì«íøDMA½óêÕÃèêö·ûêy¾Y½á11ìåÖ¸Õë
    __align(4) ETH_DMADescTypeDef *DMATxDscrTab;        //òÔì«íøDMA·¢ËíÃèêö·ûêy¾Y½á11ìåÖ¸Õë
    __align(4) uint8_t *Rx_Buff;                                         //òÔì«íøμ×2ãÇy¶ˉ½óêÕbuffersÖ¸Õë
    __align(4) uint8_t *Tx_Buff;                                         //òÔì«íøμ×2ãÇy¶ˉ·¢ËíbuffersÖ¸Õë

    u8 LAN8720_Init(void)
    {
        u8 macaddress[6];

        LAN8720_RST = 0;                                        //ó2¼t¸′λLAN8720
        //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
                delay_ms(50);
        //delay_ms(100);
        LAN8720_RST = 1;                                         //¸′λ½áêø
                //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
               
        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;//ê1Äü×ÔD-éìÄ£ê½
        ETH_Handler.Init.Speed = ETH_SPEED_100M;                                          
        ETH_Handler.Init.DuplexMode = ETH_MODE_FULLDUPLEX;                          
        ETH_Handler.Init.PhyAddress = LAN8720_PHY_ADDRESS;                          //LAN8720μØÖ·
        ETH_Handler.Init.MACAddr = macaddress;                                      //MACμØÖ·
        ETH_Handler.Init.RxMode = ETH_RXINTERRUPT_MODE;                             //ÖD¶Ï½óêÕÄ£ê½
        ETH_Handler.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;          //ó2¼tÖ¡D£Ñé
        ETH_Handler.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;          //RMII½ó¿ú
        if(HAL_OK == HAL_ETH_Init(&ETH_Handler))
        {
            return 0;   //3é1|
        }
        else
        {
            return 1;  //꧰ü
        }
    }

    void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
    {
        GPIO_InitTypeDef GPIO_Initure = {0};

        __HAL_RCC_ETH_CLK_ENABLE();             //¿aÆôETHê±Öó
        __HAL_RCC_GPIOA_CLK_ENABLE();                        //¿aÆôGPIOAê±Öó
        __HAL_RCC_GPIOC_CLK_ENABLE();                        //¿aÆôGPIOCê±Öó
        __HAL_RCC_GPIOG_CLK_ENABLE();                        //¿aÆôGPIOGê±Öó

        /*íøÂçòy½ÅéèÖà RMII½ó¿ú
        ETH_MDIO -------------------------> PA2->A2
        ETH_MDC --------------------------> PC1->C1
        ETH_RMII_REF_CLK------------------> PA1->A1
        ETH_RMII_CRS_DV ------------------> PA7->A7
        ETH_RMII_RXD0 --------------------> PC4->C4
        ETH_RMII_RXD1 --------------------> PC5->C5
        ETH_RMII_TX_EN -------------------> PG11->B11->G11
        ETH_RMII_TXD0 --------------------> PG13->B12->G13
        ETH_RMII_TXD1 --------------------> PG14->PB13->PG14
        ETH_RESET-------------------------> PD3->PA6->PA4*/

        //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;              //2»′øéÏÏÂà-
        GPIO_Initure.Speed = GPIO_SPEED_HIGH;         //¸ßËù
        GPIO_Initure.Alternate = GPIO_AF11_ETH;       //¸′óÃÎaETH1|Äü
        HAL_GPIO_Init(GPIOA, &GPIO_Initure);         //3õê¼»ˉ

        //PC1,4,5
        GPIO_Initure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; //PC1,4,5
        HAL_GPIO_Init(GPIOC, &GPIO_Initure);         //3õê¼»ˉ

        //PG11,13,14->PB11,12,13->PG11,13,14
        GPIO_Initure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;   //PG11,PG13,14
        HAL_GPIO_Init(GPIOG, &GPIO_Initure);         //3õê¼»ˉ

        //ÅäÖÃPD3->PA6->PA4ÎaíÆíêêä3ö,LAN8720¸′λòy½Å
        GPIO_Initure.Pin = GPIO_PIN_4;                                 //PD3->PA6->PA4
        GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;          //íÆíìêä3ö
        GPIO_Initure.Pull = GPIO_NOPULL;                  //ÎTéÏÏÂà-
        GPIO_Initure.Speed = GPIO_SPEED_HIGH;             //¸ßËù
        HAL_GPIO_Init(GPIOA, &GPIO_Initure);

        HAL_NVIC_SetPriority(ETH_IRQn, 1, 0);         //íøÂçÖD¶ÏóÅÏ輶ó|¸Ã¸ßò»μã
        HAL_NVIC_EnableIRQ(ETH_IRQn);
    }


    u32 LAN8720_ReadPHY(u16 reg)
    {
        u32 regval;
        HAL_ETH_ReadPHYRegister(&ETH_Handler, reg, &regval);
        return regval;
    }


    void LAN8720_WritePHY(u16 reg,u16 value)
    {
        u32 temp = value;
        HAL_ETH_ReadPHYRegister(&ETH_Handler, reg,&temp);
    }


    u8 LAN8720_Get_Speed(void)
    {
        u8 speed = 0;
        speed =((LAN8720_ReadPHY(31) & 0x1C) >> 2); //′óLAN8720μÄ31ożÄ′æÆ÷ÖD¶áè¡íøÂçËù¶èoíË«1¤Ä£ê½
        return speed;
    }

    extern void lwip_pkt_handle(void);                //Ôúlwip_comm.càïÃ涨òå


    void ETH_IRQHandler(void)
    {
        while(ETH_GetRxPktSize(ETH_Handler.RxDesc))
        {
            lwip_pkt_handle();//′|àíòÔì«íøêy¾Y£¬¼′½«êy¾Yìá½»¸øLWIP
        }
        __HAL_ETH_DMA_CLEAR_IT(&ETH_Handler, ETH_DMA_IT_NIS);    //Çå3yDMAÖD¶Ï±ê־λ
        __HAL_ETH_DMA_CLEAR_IT(&ETH_Handler, ETH_DMA_IT_R);      //Çå3yDMA½óêÕÖD¶Ï±ê־λ
    }


    u32  ETH_GetRxPktSize(ETH_DMADescTypeDef *DMARxDesc)
    {
        u32 frameLength = 0;
        if(((DMARxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) &&
                ((DMARxDesc->Status & ETH_DMARXDESC_ES) == (uint32_t)RESET) &&
                ((DMARxDesc->Status & ETH_DMARXDESC_LS) != (uint32_t)RESET))
        {
            frameLength=((DMARxDesc->Status & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT);
        }
        return frameLength;
    }


    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;                //éêÇë3é1|
    }


    void ETH_Mem_Free(void)
    {
        myfree(SRAMIN,DMARxDscrTab);//êí·ÅÄú′æ
        myfree(SRAMIN,DMATxDscrTab);//êí·ÅÄú′æ
        myfree(SRAMIN,Rx_Buff);                //êí·ÅÄú′æ
        myfree(SRAMIN,Tx_Buff);                //êí·ÅÄú′æ
    }

#ifdef  __cplusplus
}
#endif


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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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