gd32h750 rgmii加yt8512c rmii2时钟模式调试。

📅 2026/7/7 3:57:20
gd32h750 rgmii加yt8512c rmii2时钟模式调试。
硬件上yt8512c采用外部25M晶振通过内部倍频向mcu输出50M时钟。1 修改代码static void enet_gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOE); rcu_periph_clock_enable(RCU_GPIOG); rcu_periph_clock_enable(RCU_GPIOH); // yt8512 外部PHY晶振删除PA8 MCO配置 //gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8); //gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); //gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* enable SYSCFG clock */ rcu_periph_clock_enable(RCU_SYSCFG); #ifdef MII_MODE #ifdef PHY_CLOCK_MCO /* output HXTAL clock (25MHz) on CKOUT0 pin(PA8) to clock the PHY */ rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL, RCU_CKOUT0_DIV1); #endif /* PHY_CLOCK_MCO */ #ifdef USE_ENET0 syscfg_enet_phy_interface_config(ENET0, SYSCFG_ENET_PHY_MII); #endif /* USE_ENET0 */ #ifdef USE_ENET1 syscfg_enet_phy_interface_config(ENET1, SYSCFG_ENET_PHY_MII); #endif /* USE_ENET1 */ #elif defined RMII_MODE /* choose DIV12 to get 50MHz from 600MHz on CKOUT0 pin (PA8) to clock the PHY */ /* yt8512 PHY自带外部晶振屏蔽MCO时钟输出 */ //rcu_ckout0_config(RCU_CKOUT0SRC_PLL0P, RCU_CKOUT0_DIV12); #ifdef USE_ENET0 syscfg_enet_phy_interface_config(ENET0, SYSCFG_ENET_PHY_RMII); #endif /* USE_ENET0 */ #ifdef USE_ENET1 syscfg_enet_phy_interface_config(ENET1, SYSCFG_ENET_PHY_RMII); #endif /* USE_ENET1 */ #endif /* MII_MODE */ #ifdef USE_ENET0 #ifdef MII_MODE /* PA1: ETH0_MII_RX_CLK */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PA2: ETH0_MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PA7: ETH0_MII_RX_DV */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, 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); /* PB8: ETH0_MII_TXD3 */ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PB10: ETH0_MII_RX_ER */ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_8); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_10); /* PC1: ETH0_MDC */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PC2: ETH0_MII_TXD2 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PC3: ETH0_MII_TX_CLK */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_3); /* PC4: ETH0_MII_RXD0 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4); /* PC5: ETH0_MII_RXD1 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_5); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_3); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5); /* PH2: ETH0_MII_CRS */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PH3: ETH0_MII_COL */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_3); /* PH6: ETH0_MII_RXD2 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PH7: ETH0_MII_RXD3 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_3); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_6); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_7); /* PG11: ETH0_MII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG13: ETH0_MII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH0_MII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_14); /* PD8: ETH0_INT */ gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_8); #elif defined RMII_MODE /* PA1: ETH0_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_100_220MHZ, GPIO_PIN_1); /* PA1: ETH0_RMII_REF_CLK yt8512 RMII2 PHY提供时钟输入 */ gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1); /* PA2: ETH0_MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PA7: ETH0_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_100_220MHZ, 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); /* PG11: ETH0_RMII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PB12: ETH0_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_100_220MHZ, GPIO_PIN_12); /* PG12: ETH0_RMII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_11); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_12); /* PC1: ETH0_MDC */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PC4: ETH0_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_100_220MHZ, GPIO_PIN_4); /* PC5: ETH0_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_100_220MHZ, 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); #endif /* MII_MODE */ #endif /* USE_ENET0 */ #ifdef USE_ENET1 #ifdef MII_MODE /* PH6: ETH1_MII_RXD2 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PH7: ETH1_MII_RXD3 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); /* PH8: ETH1_MII_RXD0 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PH9: ETH1_MII_RXD1 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PH10: ETH1_MII_RX_ER */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10); /* PH11: ETH1_MII_RX_DV */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PH12: ETH1_MII_RX_CLK */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PH13: ETH1_MII_COL */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PH14: ETH1_MDIO */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); /* PH15: ETH1_MII_CRS */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_15); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_7); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_8); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_10); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_14); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_15); /* PG6: ETH1_MDC */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PG9: ETH1_MII_TX_CLK */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PG11: ETH1_MII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG12: ETH1_MII_TXD2 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PG13: ETH1_MII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH1_MII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); /* PG15: ETH1_MII_TXD3 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_15); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_15); /* PE1: ETH1_INT */ gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_1); #elif defined RMII_MODE /* PH8: ETH1_RMII_RXD0 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PH9: ETH1_RMII_RXD1 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PH11: ETH1_RMII_CRS_DV */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PH12: ETH1_RMII_REF_CLK */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* yt8512 eht1 */ gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_12); /* PH14: ETH1_MDIO */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_8); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_14); /* PG6: ETH1_MDC */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PG11: ETH1_RMII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG13: ETH1_RMII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH1_RMII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_14); #endif /* MII_MODE */ #endif /* USE_ENET1 */ }修改部分pa1 添加复用af112 修改enet_init中的代码添加对yt8512的支持。ErrStatus enet_init(uint32_t enet_periph, enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept) { uint32_t reg_value 0U, reg_temp 0U, temp 0U; uint32_t media_temp 0U; uint32_t timeout 0U; uint16_t phy_value 0U; ErrStatus phy_state ERROR, enet_state ERROR; /* PHY interface configuration, configure SMI clock and reset PHY chip */ if(ERROR enet_phy_config(enet_periph)) { _ENET_DELAY_(PHY_RESETDELAY); if(ERROR enet_phy_config(enet_periph)) { return enet_state; } } /* initialize ENET peripheral with generally concerned parameters */ enet_default_init(enet_periph); uint16_t phy_id_high 0U, phy_id_low 0U; ErrStatus read_ret; // 读取PHY ID寄存器 0x02 / 0x03 read_ret enet_phy_write_read(enet_periph, ENET_PHY_READ, PHY_ADDRESS, 0x02, phy_id_high); read_ret enet_phy_write_read(enet_periph, ENET_PHY_READ, PHY_ADDRESS, 0x03, phy_id_low); printf(YT8512 PHY ID Read OK, ID_H:0x%04X ID_L:0x%04X\r\n, phy_id_high, phy_id_low); /* 1st, configure mediamode */ media_temp (uint32_t)mediamode; /* if is PHY auto negotiation */ if((uint32_t)ENET_AUTO_NEGOTIATION media_temp) { /* wait for PHY_LINKED_STATUS bit be set */ do { enet_phy_write_read(enet_periph, ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, phy_value); phy_value PHY_LINKED_STATUS; timeout; } while((RESET phy_value) (timeout PHY_READ_TO)); /* return ERROR due to timeout */ if(PHY_READ_TO timeout) { return enet_state; } /* reset timeout counter */ timeout 0U; /* enable auto-negotiation */ phy_value PHY_AUTONEGOTIATION; phy_state enet_phy_write_read(enet_periph, ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, phy_value); if(!phy_state) { /* return ERROR due to write timeout */ return enet_state; } /* wait for the PHY_AUTONEGO_COMPLETE bit be set */ do { enet_phy_write_read(enet_periph, ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, phy_value); phy_value PHY_AUTONEGO_COMPLETE; timeout; } while((RESET phy_value) (timeout (uint32_t)PHY_READ_TO)); /* return ERROR due to timeout */ if(PHY_READ_TO timeout) { return enet_state; } /* reset timeout counter */ timeout 0U; /* read the result of the auto-negotiation */ enet_phy_write_read(enet_periph, ENET_PHY_READ, PHY_ADDRESS, PHY_SR, phy_value); printf(PHY_SR is 0x%x\r\n,phy_value); #if (PHY_TYPE YT8512) /* configure the duplex mode of MAC following the auto-negotiation result */ if((uint16_t)RESET ! (phy_value PHY_DUPLEX_STATUS)) { media_temp ENET_MODE_FULLDUPLEX; } else { media_temp ENET_MODE_HALFDUPLEX; } /* configure the communication speed of MAC following the auto-negotiation result */ if((uint16_t)RESET !(phy_value PHY_SPEED_STATUS)){ media_temp | ENET_SPEEDMODE_100M; }else{ media_temp | ENET_SPEEDMODE_10M; } #elif (PHY_TYPE LAN8700 || PHY_TYPE DP83848) /* 原厂PHY原有逻辑保留 */ if((uint16_t)RESET ! (phy_value PHY_DUPLEX_STATUS)) { media_temp ENET_MODE_FULLDUPLEX; } else { media_temp ENET_MODE_HALFDUPLEX; } if((uint16_t)RESET ! (phy_value PHY_SPEED_STATUS)) { media_temp | ENET_SPEEDMODE_10M; } else { media_temp | ENET_SPEEDMODE_100M; } #endif } else { phy_value (uint16_t)((media_temp ENET_MAC_CFG_DPM) 3U); phy_value | (uint16_t)((media_temp ENET_MAC_CFG_SPD) 1U); phy_state enet_phy_write_read(enet_periph, ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, phy_value); if(!phy_state) { /* return ERROR due to write timeout */ return enet_state; } /* PHY configuration need some time */ _ENET_DELAY_(PHY_CONFIGDELAY); } /* after configuring the PHY, use mediamode to configure registers */ reg_value ENET_MAC_CFG(enet_periph); /* configure ENET_MAC_CFG register */ reg_value (~(ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM | ENET_MAC_CFG_LBM)); reg_value | media_temp; ENET_MAC_CFG(enet_periph) reg_value; /* 2st, configure checksum */ if(RESET ! ((uint32_t)checksum ENET_CHECKSUMOFFLOAD_ENABLE)) { ENET_MAC_CFG(enet_periph) | ENET_CHECKSUMOFFLOAD_ENABLE; reg_value ENET_DMA_CTL(enet_periph); /* configure ENET_DMA_CTL register */ reg_value ~ENET_DMA_CTL_DTCERFD; reg_value | ((uint32_t)checksum ENET_DMA_CTL_DTCERFD); ENET_DMA_CTL(enet_periph) reg_value; } /* 3rd, configure recept */ ENET_MAC_FRMF(enet_periph) | (uint32_t)recept; /* 4th, configure different function options */ /* configure forward_frame related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)FORWARD_OPTION)) { reg_temp enet_initpara.forward_frame; reg_value ENET_MAC_CFG(enet_periph); temp reg_temp; /* configure ENET_MAC_CFG register */ reg_value (~(ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD)); temp (ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD); reg_value | temp; ENET_MAC_CFG(enet_periph) reg_value; reg_value ENET_DMA_CTL(enet_periph); temp reg_temp; /* configure ENET_DMA_CTL register */ reg_value (~(ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF)); temp ((ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF) 2U); reg_value | (temp 2U); ENET_DMA_CTL(enet_periph) reg_value; } /* configure dmabus_mode related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)DMABUS_OPTION)) { temp enet_initpara.dmabus_mode; reg_value ENET_DMA_BCTL(enet_periph); /* configure ENET_DMA_BCTL register */ reg_value ~(ENET_DMA_BCTL_AA | ENET_DMA_BCTL_FB \ | ENET_DMA_BCTL_FPBL | ENET_DMA_BCTL_MB); reg_value | temp; ENET_DMA_BCTL(enet_periph) reg_value; } /* configure dma_maxburst related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)DMA_MAXBURST_OPTION)) { temp enet_initpara.dma_maxburst; reg_value ENET_DMA_BCTL(enet_periph); /* configure ENET_DMA_BCTL register */ reg_value ~(ENET_DMA_BCTL_RXDP | ENET_DMA_BCTL_PGBL | ENET_DMA_BCTL_UIP); reg_value | temp; ENET_DMA_BCTL(enet_periph) reg_value; } /* configure dma_arbitration related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)DMA_ARBITRATION_OPTION)) { temp enet_initpara.dma_arbitration; reg_value ENET_DMA_BCTL(enet_periph); /* configure ENET_DMA_BCTL register */ reg_value ~(ENET_DMA_BCTL_RTPR | ENET_DMA_BCTL_DAB); reg_value | temp; ENET_DMA_BCTL(enet_periph) reg_value; } /* configure store_forward_mode related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)STORE_OPTION)) { temp enet_initpara.store_forward_mode; reg_value ENET_DMA_CTL(enet_periph); /* configure ENET_DMA_CTL register */ reg_value ~(ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD | ENET_DMA_CTL_RTHC | ENET_DMA_CTL_TTHC); reg_value | temp; ENET_DMA_CTL(enet_periph) reg_value; } /* configure dma_function related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)DMA_OPTION)) { reg_temp enet_initpara.dma_function; reg_value ENET_DMA_CTL(enet_periph); temp reg_temp; /* configure ENET_DMA_CTL register */ reg_value (~(ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF)); temp (ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF); reg_value | temp; ENET_DMA_CTL(enet_periph) reg_value; reg_value ENET_DMA_BCTL(enet_periph); temp reg_temp; /* configure ENET_DMA_BCTL register */ reg_value (~ENET_DMA_BCTL_DFM); temp ENET_DMA_BCTL_DFM; reg_value | temp; ENET_DMA_BCTL(enet_periph) reg_value; } /* configure vlan_config related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)VLAN_OPTION)) { reg_temp enet_initpara.vlan_config; reg_value ENET_MAC_VLT(enet_periph); /* configure ENET_MAC_VLT register */ reg_value ~(ENET_MAC_VLT_VLTI | ENET_MAC_VLT_VLTC); reg_value | reg_temp; ENET_MAC_VLT(enet_periph) reg_value; } /* configure flow_control related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)FLOWCTL_OPTION)) { reg_temp enet_initpara.flow_control; reg_value ENET_MAC_FCTL(enet_periph); temp reg_temp; /* configure ENET_MAC_FCTL register */ reg_value ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); temp (ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_DZQP | ENET_MAC_FCTL_PLTS \ | ENET_MAC_FCTL_UPFDT | ENET_MAC_FCTL_RFCEN | ENET_MAC_FCTL_TFCEN); reg_value | temp; ENET_MAC_FCTL(enet_periph) reg_value; reg_value ENET_MAC_FCTH(enet_periph); temp reg_temp; /* configure ENET_MAC_FCTH register */ reg_value ~(ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD); temp ((ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD) 8U); reg_value | (temp 8U); ENET_MAC_FCTH(enet_periph) reg_value; } /* configure hashtable_high related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)HASHH_OPTION)) { ENET_MAC_HLH(enet_periph) enet_initpara.hashtable_high; } /* configure hashtable_low related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)HASHL_OPTION)) { ENET_MAC_HLL(enet_periph) enet_initpara.hashtable_low; } /* configure framesfilter_mode related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)FILTER_OPTION)) { reg_temp enet_initpara.framesfilter_mode; reg_value ENET_MAC_FRMF(enet_periph); /* configure ENET_MAC_FRMF register */ reg_value ~(ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT | ENET_MAC_FRMF_DAIFLT \ | ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_MFD \ | ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_PCFRM); reg_value | reg_temp; ENET_MAC_FRMF(enet_periph) reg_value; } /* configure halfduplex_param related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)HALFDUPLEX_OPTION)) { reg_temp enet_initpara.halfduplex_param; reg_value ENET_MAC_CFG(enet_periph); /* configure ENET_MAC_CFG register */ reg_value ~(ENET_MAC_CFG_CSD | ENET_MAC_CFG_ROD | ENET_MAC_CFG_RTD \ | ENET_MAC_CFG_BOL | ENET_MAC_CFG_DFC); reg_value | reg_temp; ENET_MAC_CFG(enet_periph) reg_value; } /* configure timer_config related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)TIMER_OPTION)) { reg_temp enet_initpara.timer_config; reg_value ENET_MAC_CFG(enet_periph); /* configure ENET_MAC_CFG register */ reg_value ~(ENET_MAC_CFG_WDD | ENET_MAC_CFG_JBD); reg_value | reg_temp; ENET_MAC_CFG(enet_periph) reg_value; } /* configure interframegap related registers */ if(RESET ! (enet_initpara.option_enable (uint32_t)INTERFRAMEGAP_OPTION)) { reg_temp enet_initpara.interframegap; reg_value ENET_MAC_CFG(enet_periph); /* configure ENET_MAC_CFG register */ reg_value ~ENET_MAC_CFG_IGBS; reg_value | reg_temp; ENET_MAC_CFG(enet_periph) reg_value; } enet_state SUCCESS; return enet_state; }