Realtek PHY芯片RTL8211F-CG开发板的制作与调试

Realtek的 RTL8211F 是一款10/100/1000Mbps 的PHY芯片, PHY芯片广泛用于机顶盒,瘦客户机,路由器,工业产品等。 RTL8211F 是一个系列的产品,还有很多子型号,不同的型号与主控接口会有区别,适应不同平台的使用。
例如:
        RTL8211F-CG   : 只支持RGMII, 不支持 SGMII
        RTL8211FS-CG : 同时支持SGMII和 RGMII

所以针对不同的应用,RTL8211F均可以提供不同型号的对应的芯片,满足实际应用的需要。
       PHY芯片电路相对简单,有了PHY芯片后,可以为一个设备增加一个网口,使产品有了与网络互联互通的能力,PHY芯片与主控芯片(如海思HI3798)可以通过RGMII/RMII/MII 进行连接,可以与各种带有不同接口的主控进行连接。
本文是通过一个最小系经来实现对 PHY 芯片的了解。
 
      RTL8211F 最小系统的原理:


                                                                                                                               最小系统的原理(部分)

            按这个原理,可以做成一个没有主控的小模块,引出MDIO控制接口(MDIO Class 22).因为原理相对简单,所以做成一个双层板的小模块即可。


                                                                                                               小板实物图

在小板的侧面引出了 MDIO 口,通过MDIO可以对RTL8211F 进行必要的配置,例如配置LED, 读取 Link 状态等。

MDIO 采用Class 22, 时序如下:



根据上述的MDIO 时序,可以用GPIO 模拟MDIO信号,实现对PHY芯片的控制,此处不列模以MDIO的程序。
PHY 有几个重要的寄存器,包括BMCR(ADDRESS 0x00),BMSR(ADDRESS 0x01),PHYID1(ADDRESS 0x02),PHYID2(ADDRESS 0x03)寄存器等,我们可以通过判断BMSR寄存器的状态,来判断PHY是否Link Up (插入网线到Link指示灯亮)为此我们编写一个简单的接口,来判断PHY是否Link UP。

/*
return ret: 0: link down
1: linking
2: link UP
*/
uint8_t phy_rtl8211f_LinkCheck ( uint32_t phydev )
{
     int32_t result=0;
     uint8_t ret;
     uint32_t data;
     int value = 0;
     int i;
     uint32_t phyad;
     uint32_t pagesel=31;
     uint32_t regad=18;
     uint32_t page =0;

     phyad=phydev;
     data=0;
     regad=00; //BMCR
     result = smiRead ( PHY_MDC_MDIO_PREAMBLE_LEN,phyad,regad,&data );

     regad=01; //BMSR
     result = smiRead ( PHY_MDC_MDIO_PREAMBLE_LEN,phyad,regad,&data );
     //下述判断较粗浅,原则上是判断BMSR 的bit 2 来确认连接状态,此处判断方式便于查看寄存器变化规律,便于理解,另外功能可用。
     if(data==0x7989)
     {
         ret=LINK_DOWN;
     }
     else if(data==0x79A9)
     {
         ret=LINKING;
     }
     else if(data==0x79AD)
     {
         ret=LINK_UP;
     }

     return ret;
}

/*
*   功能: 检测是否有网线插入并LINK UP,此函数接口仅用于打印状态
*

*/
void mdcmdio_task_Check_Realtek_PHY_Status ( void )
{
     uint8_t linkStatus;
     uint32_t phydev = 1;

     linkStatus = phy_rtl8211f_LinkCheck(phydev);

     if(linkStatus!=linkStatusbak)
     {
         linkStatusbak = linkStatus;
         printf ( "\n\r---------RTL8211F----------- \r\n" );
         phy_rtl8211f_display_main_reg(phydev);

         if(linkStatus == LINK_DOWN)
         {
              printf ( "\n\r---------LINK DOWN----------- \r\n" );
         }
         else if(linkStatus == LINK_UP)
         {
             printf ( "\n\r---------LINK UP----------- \r\n" );
         }
         else if(linkStatus == LINKING)
         {
             printf ( "\n\r---------Attempt Connection ----------- \r\n" );
         }
         else
         {
             printf ( "\n\r---------MDIO Connection Failed----------- \r\n" );
         }
     }
     else
    {

    }
}​
在一个 Task 中循环调用mdcmdio_task_Check_Realtek_PHY_Status ()即可实现对网口的监控,插入网线,拔出网线,可以实时打印出来.当插入网线后,通过主控端MCU 的串口,打印出的LOG 如下:
当插上网线时,会显示 Link Up 信息。

---------RTL8211F-----------
PHY ADDR : 0x1
REG 00 0x0 : BMCR 0x1040
REG 01 0x1 : BMSR 0x79ad
REG 02 0x2 ,PHYID1: 0x1c
REG 03 0x3 ,PHYID2: 0xc916
REG 16 0x10 ,LED config: 0xc00b
---------LINK UP-----------


当拔下网线时,会显示 Link Down 信息

---------RTL8211F-----------
PHY ADDR : 0x1
REG 00 0x0 : BMCR 0x1040
REG 01 0x1 : BMSR 0x7989
REG 02 0x2 ,PHYID1: 0x1c
REG 03 0x3 ,PHYID2: 0xc916
REG 16 0x10 ,LED config: 0xc00b
                                                                                                                                          ---------LINK DOWN-----------


由上述的验证,可以看出,即使PHY 芯片不通过 RGMII/RMII 等接口连接主控芯片,PHY自己仍然是可以工作的,可以响应插拔网线,自动Link UP 等,本文中原理图只提供部分信息,如果想使用Realtek 的PHY,可以与大联大北京友尚集团Realtek团队联系,获取相关的详细的资料及支持。                                                                                                                                                                  

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能