|
发表于 2024-6-12 11:37:03
|
显示全部楼层
/****************************************Copyright (c)****************************************************
**
**
**
**--------------File Info---------------------------------------------------------------------------------
** File name: bsp_eth.c
** Descriptions: ETH Config
** IC MODEL: GD32F450Z
**--------------------------------------------------------------------------------------------------------
** Created by: vim
** Created date: 2023-05-16
** Version: v1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "bsp.h"
#include "lwipopts.h"
#include "netif/ethernet.h"
#include "ethernetif.h"
#define USE_ENET_INTERRUPT
extern struct netif gnetif;
#ifdef USE_ENET_INTERRUPT
static __IO uint8_t ethflag = 0;
#endif /* USE_ENET_INTERRUPT */
static __IO uint32_t enet_init_status = 0;
/*
*********************************************************************************************************
* 函 数 名: ETH_GPIO_Config_RMII
* 功能说明: 配置GD32F4 ETH (RMII Mode)
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void ETH_GPIO_Config_RMII(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOE);
/* enable SYSCFG clock */
rcu_periph_clock_enable(RCU_SYSCFG);
syscfg_enet_phy_interface_config(SYSCFG_ENET_PHY_RMII);
gpio_mode_set(GPIOE,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_11); //配置为输出模式 浮空模式
gpio_output_options_set(GPIOE,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11); //配置为推挽输出 50M
/* PA1: ETH_RMII_REF_CLK */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
/* PA2: ETH_MDIO */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
/* PA7: ETH_RMII_CRS_DV */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_7);
gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1);
gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2);
gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7);
/* PB11: ETH_RMII_TX_EN */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_11);
/* PB12: ETH_RMII_TXD0 */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_12);
/* PB13: ETH_RMII_TXD1 */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_13);
gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_11);
gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12);
gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_13);
/* PC1: ETH_MDC */
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
/* PC4: ETH_RMII_RXD0 */
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_4);
/* PC5: ETH_RMII_RXD1 */
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_5);
gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1);
gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4);
gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5);
}
/*
*********************************************************************************************************
* 函 数 名: ETH_MAC_DMAConfig
* 功能说明: 配置GD32F4 ETH MAC/DMA
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void ETH_MAC_DMAConfig(void)
{
ErrStatus reval_state = ERROR;
/* enable ethernet clock */
rcu_periph_clock_enable(RCU_ENET);
rcu_periph_clock_enable(RCU_ENETTX);
rcu_periph_clock_enable(RCU_ENETRX);
/* reset ethernet on AHB bus */
enet_deinit();
reval_state = enet_software_reset();
if(ERROR == reval_state) {
while(1) {}
}
/* configure the parameters which are usually less cared for enet initialization */
// enet_initpara_config(HALFDUPLEX_OPTION, ENET_CARRIERSENSE_ENABLE|ENET_RECEIVEOWN_ENABLE|ENET_RETRYTRANSMISSION_DISABLE|ENET_BACKOFFLIMIT_10|ENET_DEFERRALCHECK_DISABLE);
// enet_initpara_config(DMA_OPTION, ENET_FLUSH_RXFRAME_ENABLE|ENET_SECONDFRAME_OPT_ENABLE|ENET_NORMAL_DESCRIPTOR);
#ifdef CHECKSUM_BY_HARDWARE
enet_init_status = enet_init(ENET_100M_FULLDUPLEX, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS);
#else
enet_init_status = enet_init(ENET_100M_FULLDUPLEX, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS);
#endif /* CHECKSUM_BY_HARDWARE */
}
/*
*********************************************************************************************************
* 函 数 名: bsp_ETH_Init
* 功能说明: 配置GD32F4 ETH
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_ETH_Init(void)
{
uint16_t count = 5000;
#ifdef USE_ENET_INTERRUPT
nvic_irq_enable(ENET_IRQn, 2, 0);
#endif /* USE_ENET_INTERRUPT */
ETH_GPIO_Config_RMII();
//PHY Reset
gpio_bit_reset(GPIOE, GPIO_PIN_11);
while(count--)
{}
gpio_bit_set(GPIOE, GPIO_PIN_11);
ETH_MAC_DMAConfig();
if(0 == enet_init_status)
{
while(1) {
}
}
#ifdef USE_ENET_INTERRUPT
enet_interrupt_enable(ENET_DMA_INT_NIE);
enet_interrupt_enable(ENET_DMA_INT_RIE);
#endif /* USE_ENET_INTERRUPT */
}
#ifdef USE_ENET_INTERRUPT
uint8_t bsp_Get_ethflag(void)
{
return ethflag;
}
void bsp_Set_ethflag(uint8_t val)
{
ethflag = val;
}
/*!
\brief this function handles ethernet interrupt request
\param[in] none
\param[out] none
\retval none
*/
void ENET_IRQHandler(void)
{
uint32_t reval;
/* handles all the received frames */
do{
reval = enet_rxframe_size_get();
if(reval > 1){
//调用网卡接收函数
ethernetif_input(&gnetif);
}
}while(reval != 0);
/* clear the enet DMA Rx interrupt pending bits */
enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_RS_CLR);
enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_NI_CLR);
}
#endif /* USE_ENET_INTERRUPT */
/******************************************** (END OF FILE) ************************************************/
|
评分
-
查看全部评分
|