新手上路
积分 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
我来回答