GD32F407之LWIP+RTL8201F

时间:2024-10-16 08:13:22

由于项目需求需要使用到网络,强大的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也成功了,如图: