下面对照正点的LAN8720来修改GD32F407上的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也成功了,如图: