新手上路 
	积分 35  
        金钱 35  
       注册时间 2014-3-16 
      在线时间 2 小时 
 
 
 
 
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(Ð_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(Ð_Handler, reg, ®val); 
        return regval; 
    } 
 
 
    void LAN8720_WritePHY(u16 reg,u16 value) 
    { 
        u32 temp = value; 
        HAL_ETH_ReadPHYRegister(Ð_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(Ð_Handler, ETH_DMA_IT_NIS);    //Çå3yDMAÖD¶Ï±ê־λ 
        __HAL_ETH_DMA_CLEAR_IT(Ð_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 
 
 
 
我来回答