CH32V307外挂千兆PHY应用
CH32V307外挂千兆PHY应用
简介
CH32V307 内置了千兆mac和10Mphy,本身可以使用10M的网络,但在有些网络应用中,10Mbps网络速度并不能满足需求,于是这里介绍一下CH32V307使用RGMII接口外挂千兆PHY的应用
RGMII接口介绍
RGMII接口是一种高速差分信号接口,用于连接以太网MAC和PHY之间的通信,分为MAC模式和PHY模式,需要125M时钟。CH32V307工作在MAC模式下,发送时钟由MAC提供,接收时钟由PHY提供。CH32V307的125M时钟有两种获取方式,一种为外部输入,即外部PHY倍频到125M输出到CH32V307的PB1脚,还有一种为通过内部PLL2或PLL3的VCO输出,VCO输出为PLL输出的两倍,所以PLL2,PLL3倍频到62.5M即可,RGMII接口时钟和引脚如下图所示:
SMI接口介绍
SMI 接口是一种串行通讯接口,使用 MDC和 MDIO两线来访问 PHY 的寄存器 实现对 PHY 的管理。其中 MDC 是时钟线,空闲时保持低电平,MDIO 是数据线一般需要上拉。SMI 的读写操作和帧的组成都是由 MAC 主导的,只需要写入地址和数据即可操作PHY相应寄存器。
PHY物理地址介绍
首先需要根据硬件设置PHY的物理地址,有物理地址才可以操作PHY寄存器,一般通过硬件选择,千兆phy的地址线一般有3根,如下图:
这3根地址线使用4.7k电阻上拉或下拉来设置物理地址,上拉为1,下拉为0,例如这三根分别为101,则设置的物理地址为5,那我们代码中就需要通过物理地址5来操作phy寄存器,若想判断是否可以正常操作phy,则可以读取phy id寄存器,看读出数据和PHY手册中是否一致,若读出不一致且为FFFF之类,则需要看一下物理地址是否设置错,MDIO是否上拉,检查下硬件看哪里有不妥当的地方。
配置和读取PHY
目前市面上PHY默认配置即可正常通信,但也有些需要设置一下,总体来说,要开启phy自协商能力,并且可以正确读取phy的状态,来相应设置mac的速率,全双工半双工,是否link上之类,例如RTL8211FS,我们需要读取 PHY specific status 寄存器来获取phy的状态,并将状态通过WCHNET_PhyStatus();函数传入协议栈,让协议栈检测phy是否link上
该寄存器因为并不是统一标准的,所以每款phy对于link状态位的定义不同,RTL8211FS的link位判断为bit2,而别的phy不一定,例如YT8531的link位为bit10
RTL8211FS LINK位
YT8531 LINK位
由于WCHNET协议栈判断的是bit2位,所以在使用YT8531时不可将PHY特殊状态寄存器的值直接传入协议栈,一般需要进行移位,例如:
phy_status=ETH_ReadPHYRegister(gPHYAddress,0x11) ;
WCHNET_PhyStatus(phy_status>>8);
按照这种方式即可让协议栈判断是否link上,link上之后,协议栈才会进行后续操作。
有两种方式来调用PHYLink函数,PHYLink函数中的作用是用来读取phy状态,那么需要在何时调用该函数呢,第一种:通过中断的方式,将phy的中断脚连到CH32V307任意IO,并且接4.7K上拉,当出现下降沿时,证明有网线插入,此时触发中断,调用PHYLink函数,例程中使用的引脚为PC7。第二种为轮询的方式,判断phy状态是否发生改变,若发生改变时则调用PHYLink函数。这两种方式在CH32V307的例程中都可以找到,可自由选择使用。