GD32F407之LWIP+RTL8201F

本文介绍了在GD32F407项目中使用LWIP网络库对接RTL8201F以太网芯片的过程。作者对比了STM32F407与GD32F407的不同PHY芯片,并详细说明了RTL8201F的重要寄存器配置和代码配置步骤,包括PHY地址设置、MAC和DMA初始化等问题的解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需求需要使用到网络,强大的ARM真的是什么都有,以前没有玩过LWIP刚好来研究研究,网上有野火博客帖子(ETH—Lwip以太网通信)非常的详细,可以让你从入门到精通再到放弃,一篇帖子五十多页都可以出书了。

我看STM32F407的PHY使用的是LAN8720芯片,而GD32F407上面使用的是DP83848芯片,总之没有使用RTL8201F的,网上百度了一下资料不是很多,所以只能对着datasheet来修改,其实和LAN8720,DP83848的寄存器差不多,认真点就OK

 

下面对照正点的LAN8720来修改GD32F407上的RTL8201F

一、RTL8201F重要寄存器配置

在RTL8201F中比较重要的寄存器,BCR(0),BSR(1),PHY特殊功能寄存器

BCR(0)

我们配置RTL8201F其实就是配置BCR寄存器,通过GD调用官方的enet_phy_write_read函数来完成对PHY芯片寄存器的读写操作,在GD官方库gd32f4xx_enet.h中已经定于了BCR,BSR代码如下:

BSR(1)

BSR寄存器为RTL8201F的状态寄存器,通过读取该寄存器值可以得到当前的连接速度,双工状态和连接状态等。在GD官方以太网gd32f4xx_enet.c库中通过enet_init函数来读取PHY的BSR寄存器来判断连接是否建立,自协商是否完成等信息。

PHY特殊功能寄存器

和DP83848,LAN8720,有点不一样,RTL8201F没有这个PHY特殊状态寄存器,它是直接在BCR寄存器中直接映射出来的,配置是请注意

主要就是要来判断连接状态和速度,RTL8201F芯片通过完成Auto negotiation后自动映射出Speed status和duplex status我们读取完了后就可以设置

Speed Selection和Duplex Mode 这两个寄存器,在gd32f4xx_enet.h文件中定义:

二、代码配置

1、PHY地址设置

地址引脚和LED引脚共用了,

实际电路连接,AD0接3.3,AD1接地,所以地址为0x01

RTL8202F及其它网卡芯片寄存器全部定义在gd32f4xx_enet.h库文件中,如下图所示:

到这寄存器配置功能基本完成OK, GPIO引脚配置就不多说了,使用的是RMII模式,本来以为万事具备就差上电了,一上电我去卡住了,灯都没能点亮,Debug一步步发现卡在了Rtl8210f_Init函数里面了的Rtl8210f_mac_dma_config()函数,初始化MAC和DMA官方的怎么会呢,

继续往下找

发现这里面有个while,很有可能了,但是加了串口Debug发现0x30可以打印,居然不是那只有最后一个函数了 enet_init();官方库寄存配置有点多啊,只能加串口Debug看卡在那了,发现卡在enet_phy_config()函数

enet_phy_config()函数比较简单,PHY interface configuration (configure SMI clock and reset PHY chip) RTL8201F的接口配置

发现就是对RTL8201F芯片的reset,这都会卡,难道芯片有问题,试了两个板子都不行,将寄存器的值串口打印出来,发现对芯片reset后不能自动清除,Datasheet上明明说可以的(问了供应商叫我们检查电路是不是有问题,没毛病和PHY的clk信号也是杠杠的,供应商就沉默了)

没办法我能不能不进行reset操作啊,如果不进行reset操作寄存器那不就不能回到Default状态,所以我自己写数据到这些寄存器让他们成为Default状态不就OK(好办法),修改参考(Register 0 Basic Mode Control Register)

修改如下:

这下通过了,但是下面又卡住了

卡在这个if里面了,乍回事,自动协商模式过不去,那就不用它了,看看还有什么模式,如下还是有选择的,选择(ENET_100M_FULLDUPLEX)100Mbps 全双工模式,

上电通过了,自动获取IP也成功了,如图:

 

 

<think>好的,我现在需要帮助用户找到关于RTL8201与STM32F407的驱动代码和初始化方法。首先,回顾之前的对话,用户之前询问了RTL8201和LAN8720在STM32F407上的驱动初始化区别,现在他们想具体查找RTL8201的驱动代码或初始化方法。 首先,我应该检查用户提供的引用内容。引用[1]提到了使用HAL库初始化RTL8201F的代码,主函数中调用了MX_ETH_Init和ETH_PHY_Init,这可能涉及PHY的初始化流程。引用[2]提到了一个基于STM32F4和RTL8201的项目,使用STM32CubeMX配置并结合LWIP协议栈,项目地址可能有用。引用[3]提到GD32F407使用LWIPRTL8201F时遇到的初始化问题,特别是Rtl8210f_Init函数卡住的情况,这可能涉及到硬件配置或DMA设置的问题。 接下来,我需要结合这些引用内容,以及用户之前的问题,来构建一个关于RTL8201在STM32F407上的驱动初始化的详细回答。用户需要具体的代码示例和步骤,所以需要整理出硬件配置、初始化流程、关键代码示例以及注意事项。 首先,硬件配置方面,用户可能需要注意RMII接口的引脚配置是否正确,包括REF_CLK、MDIO、MDC等引脚的复用设置。然后时钟配置,确保PHY的时钟源正确,比如使用HSE或经过PLL倍频后的时钟。 初始化流程方面,可能需要使用STM32CubeMX生成ETH和GPIO的初始化代码,然后手动添加PHY的初始化函数,比如读取PHY ID寄存器以确认PHY类型,配置自动协商,检查链接状态等。 关键代码示例应包括ETH初始化结构体配置,PHY初始化函数,比如读取PHY ID,设置自动协商参数,等待链接建立等。还需要注意在HAL_ETH_Init之后调用PHY初始化,并处理可能的状态返回值。 注意事项部分,需要提醒用户检查硬件连接,特别是RMII接口的引脚是否正确,时钟频率是否符合要求,比如RTL8201需要50MHz的REF_CLK。此外,可能还需要根据PHY地址进行配置,比如通过硬件引脚设置PHY地址,并在代码中正确指定。 同时,用户提供的引用[2]中的项目地址可能是一个有用的资源,建议用户参考该开源项目,以及ST官方提供的例程,比如STM32CubeF4中的ETH示例,可能需要进行适当修改。此外,如果使用LWIP协议栈,需要正确配置描述符和内存管理。 在思考过程中,还要考虑用户可能遇到的问题,比如初始化卡在某个函数,如引用[3]中提到的Rtl8210f_Init卡住的问题,这可能涉及到DMA或MAC配置错误,需要检查相关寄存器的配置是否正确,或者PHY的复位时序是否满足。 总结来说,回答需要涵盖硬件配置步骤、初始化代码示例、关键注意事项,以及推荐参考的资源,帮助用户正确实现RTL8201在STM32F407上的驱动初始化,并避免常见问题。</think>### RTL8201 与 STM32F407 驱动初始化实现详解 以下是基于 RTL8201 和 STM32F407 的以太网驱动初始化核心代码及关键步骤,结合硬件配置和实际项目经验整理而成。 --- #### 一、硬件配置要点 1. **RMII 接口引脚映射** STM32F407 的 RMII 接口需要严格匹配以下引脚(以 RMII 模式为例): ```c // RMII 接口定义 (以 STM32F407ZG 为例) ETH_RMII_REF_CLK -> PC1 // 外部 50MHz 时钟输入 ETH_MDIO -> PA2 // 管理数据输入输出 ETH_MDC -> PC1 // 管理数据时钟 ETH_RMII_CRS_DV -> PA7 // 载波侦听/数据有效 ETH_RMII_RXD0 -> PC4 // 接收数据位 0 ETH_RMII_RXD1 -> PC5 // 接收数据位 1 ETH_RMII_TX_EN -> PG11 // 发送使能 ETH_RMII_TXD0 -> PG13 // 发送数据位 0 ETH_RMII_TXD1 -> PG14 // 发送数据位 1 ``` 需通过 `STM32CubeMX` 配置 GPIO 复用功能为 `ETH_RMII_XX`,并开启 ETH 外设时钟[^2]。 2. **时钟配置** RTL8201 需要外部 50MHz 参考时钟(由 STM32 或外部晶振提供): ```c RCC_PeriphCLKInitTypeDef clkcfg; clkcfg.PeriphClockSelection = RCC_PERIPHCLK_ETH; clkcfg.EthClockSelection = RCC_ETHCLKSOURCE_PLL; // 通过 PLL 生成 50MHz HAL_RCCEx_PeriphCLKConfig(&clkcfg); ``` --- #### 二、驱动初始化代码实现 1. **ETH 外设初始化** 使用 HAL 库初始化以太网控制器: ```c ETH_HandleTypeDef heth; void MX_ETH_Init(void) { heth.Instance = ETH; heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; heth.Init.Speed = ETH_SPEED_100M; heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX; heth.Init.PhyAddress = 0x00; // PHY 地址(需根据硬件调整) HAL_ETH_Init(&heth); } ``` 2. **RTL8201 PHY 初始化函数** ```c #define PHY_ID_REG 0x02 // RTL8201 PHY 标识寄存器 #define PHY_BSR_REG 0x01 // 基础状态寄存器 #define PHY_BCR_REG 0x00 // 基础控制寄存器 HAL_StatusTypeDef ETH_PHY_Init(ETH_HandleTypeDef *heth) { uint32_t phyid = 0; // 读取 PHY ID 确认芯片类型 HAL_ETH_ReadPHYRegister(heth, PHY_ID_REG, &phyid); if ((phyid & 0xFFFF) != 0x8201) { // RTL8201 标识码为 0x00008201 return HAL_ERROR; } // 配置自动协商参数 HAL_ETH_WritePHYRegister(heth, PHY_BCR_REG, ETH_PHY_AUTONEGOTIATION | ETH_PHY_RESTART_AUTONEGOTIATION); // 等待链路建立(最长等待 5s) uint32_t timeout = 5000; while (timeout--) { uint16_t bsr; HAL_ETH_ReadPHYRegister(heth, PHY_BSR_REG, &bsr); if (bsr & ETH_PHY_LINKED_STATUS) break; HAL_Delay(1); } return (timeout > 0) ? HAL_OK : HAL_TIMEOUT; } ``` --- #### 三、关键注意事项 1. **PHY 地址匹配** RTL8201 的默认地址通常为 `0x00`,但需根据硬件设计验证(如通过电阻配置 PHYAD 引脚)[^3]。 2. **时钟同步问题** 若使用内部时钟生成 REF_CLK,需确保 PLL 配置精确输出 50MHz(误差 < ±50ppm)。 3. **LWIP 协议栈集成** 初始化完成后需配置发送/接收描述符(参考 ST 官方 `ETH_TxRx_Config()` 函数): ```c void ETH_TxRx_Config(void) { heth.TxDesc = DMATxDscrTab; // 发送描述符数组 heth.RxDesc = DMARxDscrTab; // 接收描述符数组 HAL_ETH_DMATxDescListInit(&heth, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); HAL_ETH_DMARxDescListInit(&heth, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); HAL_ETH_Start(&heth); } ``` --- #### 四、参考资源 1. **开源项目参考** - [STM32F4 + RTL8201 驱动示例](https://gitcode.com/open-source-toolkit/2228a):包含完整工程文件和 LWIP 配置[^2]。 - ST 官方示例:`STM32CubeF4` 包中的 `ETH_Project` 模板(需适配 RTL8201 寄存器)。 2. **调试技巧** - 若卡在初始化阶段(如引用[3]中的问题),优先检查: - PHY 复位信号(NRST 引脚电平) - RMII 接口的 GPIO 复用配置 - 时钟源的稳定性(示波器测量 REF_CLK) ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值