sunsili 发表于 2023-10-9 10:28:52

千兆交换机(Realtek主芯片RTL8367SS-CG)的开发与调试

本帖最后由 sunsili 于 2024-1-13 14:21 编辑

千兆交换机(Realtek主芯片RTL8367SS-CG)的开发与调试




在现代的生活中,交换机是一个非常常见的,重要的设备,无论在公司企业,还包括一些家庭中,交换机都是很常用的设备,通过交换机,可以将多台设备进行互联互通.
小型网络示意图


那么是否考虑过开发一款自己的交换机呢?
其实开发交换机并不困难,Realtek 有全系列的交换机产品方案,包括RTL8367S-CG(5+2)/RTL8367RBI-VH-CG(5+2)/RTL8370MB(8+2)10/100/1000M交换机,高端的还有万兆交换机。
本文以 RTL8367S-CG作为主芯片作为说明。

1.首先了一下 RTL8367S的外部接口

RTL8367S-CG 交换机框图

由上图我们可以看到 RTL8367S-CG 可以直接引出 5个RJ45接口,另外还有2个扩展接口,所以叫 5+2,通过扩展接口可以与SOC连接,让SOC可以与多个网络设备进行通信,也可以通过扩展接口来与PHY 进行连接,这样可以实现把交换机端口最大扩展到7个。这里需要注意的是GMAC1 支持SGMII/HSGMII,可以通过这个接口扩展光口或接SOC,也可以接支持SGMII的PHY等,GMAC2 支持MII/RGMII , 可以接SOC 或PHY.
如果想设计交换机应用,可以参考 Realtek 的 HDK , 能比较容易的进行开发。

2.根据Realtek 的参考设计(HDK)进行开发
原理设计时一定要严格以Realtek参考设计为准,注意以下几点:
      
A.电源的网络标号要与Realtek原厂的HDK中的一致,交换机的电源网络标号比较多,包括 AVDDH,AVDDL,DVDDL,DVDD09,DVDDIO,DVDDIO2,DVDDIO_2等,每路电源都有具体用途,建议不要轻易改名字。
B.LED 的引脚大部分带有配置功能,一定先设计好strapping,可以上拉,下拉,能进行配置, 再去设计LED显示部分
C.对于RGMII 如果引脚不使用,可以考虑输出引脚悬空,输入引脚接地,输入输出的区分请参考 datasheet
D.如果通过RGMII/SGMII 与对端连接,一定注意方向,做到交换机的输出引脚接对端设备的对应的输入引脚,建议设计原理时在原理上就标出引脚方向,这样不容易出错

3.PCB设计相关说明
PCB 的设计注意项比较多,包括布局及走线,建议开发时,与我们联系,我们会与Realtek原厂一起对咱们的PCB 进行把控。
下图是本人据参考设计业余时间做的交换机Demo板,由于时间关系,PCB 走线部分做得并不细致,有些地方也没有严格按PCB走线要求做,但是交换机功能仍稳定可靠,这也说明Realtek的芯片对PCB的要求也没有那么苛刻(不过我们建议做产品还是要严格按要求设计),实现基本功能还是比较容易的。
自制交换机Demo


4.调试说明板子贴片回来后,可以先做以下检查

A.先要测量电源电压是否正确
B.检查各个配置引脚是否正确
C. 交换机默认就是可以工作的,可以先不用加载API
D. 在API调通之前,一定先把配置引脚LAN1LED0 / EN_PHY: Pull Up: Enable embedded PHY.   拉高后使能 PHY,这样交换机如果硬件没有问题,且配置正确的情况下肯定是可以工作的, 然后把交换机的端口插上网线,对端
连接电脑,并看电脑端的网络状态,就可以判断出交换机是否已经正常工作,如果电脑识别不到,请检查硬件

5.软件说明

Rtl8367S支持通过MDIO进行管理,但是这里需要注意的是,Realtek 的API功能很强大,所以代码量也较大,对MCU要求也比较高。 本人调试时,使用 STM32F103RCT6感觉刚好够用(建议用STM32F103RET6,如果接有SOC , 就用SOC集成API), 通过GPIO模拟MDIO方式实现对交换机的管理即可。集成API时,比较麻烦的点是API 的集成及编译。编译完成之后,调用rtk_switch_init() 函数接口对交换机进行基本配置后,交换机就可以用了。如果要使用 GMAC口,还需要通过rtk_port_macForceLinkExt_set()接口进行相应的配置,再配置好Delay和 LED 部分,交换机的基本功能就都实现了。
另外,在程序中我们还可以加入以下代码,用来监控每个网口的状态,包括连接状态0/1,当前的速度10/100/1000,和全双功/半双功方式,代码可以放在Task 中周期运行。
void rtl83xx_switch_linkcheck ( void )
{
   int i;
   rtk_api_ret_t ret;
   rtk_port_linkStatus_t LinkStatus;
   rtk_port_speed_t Speed;
   rtk_port_duplex_t Duplex;
   printf ( "\r\n\r\n------------------------------------------------------" );
   for ( i=UTP_PORT0; i<UTP_PORT5; i++ )
    {
      ret = rtk_port_phyStatus_get ( i, ( rtk_port_linkStatus_t* ) &LinkStatus, ( rtk_port_speed_t* ) &Speed, ( rtk_port_duplex_t* ) &Duplex );

      printf ( "\r\n Port:%d , LinkStatus:0x%x, Duplex:0x%x",i,LinkStatus, Duplex );

   }
   printf ( "\r\n------------------------------------------------------\r\n" );

}
当我们在一个网口插上网线的时候,系统打印出对应端口的连接状态 LinkStatus: 0x01, 当再取下网线时, 系统会打印出对应的端口的状态: LinkStatus: 0x00 , 通过上面的代码我们就可以监控每个端口的 Link状态,对做更智能的应用,打好基础。

到此这个交换机的功能是不是已经比普通的交换机强大了呢,是不是心动呢?
要做交换机可以与大联大北京Realtek团队联系,邮箱: Lynx.liu@cn.yosungroup.com

页: [1]
查看完整版本: 千兆交换机(Realtek主芯片RTL8367SS-CG)的开发与调试