KSZ8873MLLV在AURIX平台的应用

本文详细介绍了KSZ8873芯片的MII、SMI、SPI和I2C接口特点及帧格式,包括寄存器的读写和调试过程。在驱动调试中,针对MII接口的不足,切换到SPI接口并成功读取所有寄存器数据。同时,阐述了寄存器设置和功能测试,包括Switch和PHY的功能验证,为KSZ8873的配置和应用提供了参考。
摘要由CSDN通过智能技术生成

目录

1.管理接口

1.1 MII 接口

1.1.1特点

1.1.2帧格式

1.1.3 MII寄存器

1.2 SMI 接口

1.2.1特点

1.2.2帧格式

1.2.3 8位寄存器

1.3 SPI接口

1.3.1特点

1.3.2总线格式

1.4 I2C接口

1.4.1特点

2.驱动调试

2.1 管理接口数据读写

2.1.1 MII/SMI接口

2.1.2 SPI接口

2.2 寄存器设置

2.2.1寄存器分析

2.2.2寄存器设置

2.3 功能测试

2.3.1 Switch功能测试

2.3.2 PHY功能测试


1.管理接口

1.1 MII 接口

1.1.1特点

IEEE 802.3标准接口,两根信号线mdc/mdio,最高频率5MHZ,访问8个16位寄存器,含6个标准寄存器[0:5], 2个客户寄存器[29, 31]。

1.1.2帧格式

1.1.3 MII寄存器

port1端口PHY地址默认为0x01,port2端口PHY地址默认为0x02。均可通过bits[7:3] of Register 15 (0x0F): Global Control 13 进行更改。Port3不是PHY,故MIIM接口无法访问。

1.2 SMI 接口

1.2.1特点

非标准接口,两根信号线mdc/mdio,最高频率5MHZ,可访问所有寄存器[0-198],间接访问8个MIIM寄存器。寄存器数据为8位,写数据时高8位无效,读数据时高8位为0。SMI接口不是所有CPU在硬件层面都能支持,可以使用GPIO模拟实现。

1.2.2帧格式

1.2.3 8位寄存器

1.3 SPI接口

1.3.1特点

4线SPI接口,最高频率25MHZ,可访问所有寄存器[0-198]。支持2个标准SPI命令:‘0000_0011’ for data read 和 ‘0000_0010’ for data write。

1.3.2总线格式

1.4 I2C接口

1.4.1特点

2线I2C接口,最高频率2.5MHZ,可访问所有寄存器[0-198],从机地址0x5F。可以外接EEPROM。

 

2.驱动调试

2.1 管理接口数据读写

驱动此类芯片的首要任务是调通管理接口,能够访问芯片寄存器。编写程序之前,检测PHY芯片所有管脚信号,波形均正常,收发数据时钟频率为25MHZ。

2.1.1 MII/SMI接口

使用illd自带驱动访问KSZ8873,发现时序是标准MIIM读写时序:

32个1+ST(01)+OP(10)+PHY Address(00)+REG Address(00)+TA(11)+DATA(0xFFFF)。

32个1+ST(01)+OP(01)+PHY Address(00)+REG Address(00)+TA(11)+DATA(0x8000)。

由于MIIM模式下,PHY1和PHY2地址默认为01和02,故此处读写数据均无效。

将PHY地址分别修改为01和02,并读取0-31所有地址,发现确如数据手册所述,只有8个寄存器可访问。

01地址数据:0-5:0x1120 0x7808 0x0022 0x1430 0x05E1 0x0001;1D:0x0000;1F:0x0034

02地址数据:0-5:0x3120 0x7808 0x0022 0x1430 0x05E1 0x0001;1D:0x0000;1F:0x0014

PHY01为何为10Mbps?极性为何反相?应是管脚设置不对,应当设置相关寄存器并确认。

MII能够访问的寄存器数量太少,无法满足要求;而AURIX 单片机无法控制OPCODE为00,因此无法实现KSZ8873特有的SMI接口。

2.1.2 SPI接口

  修改KSZ8873管理接口为SPI接口,频率10MHZ。

  可见已经正确读出芯片ID,一共读出199个8位寄存器的数据。此处为了分析方便,利用MOSI将寄存器地址和其对应数据同步输出。

2.2 寄存器设置

2.2.1寄存器分析

1) Global Registers (Registers 0 – 15)

Register 6 (0x06): Global Control 4,port3 的端口设置;

Register 15 (0x0F): Global Control 13,设置Port1和2的PHY 地址,默认Port1为 0x1,Port 2 PHY address = (Port 1 PHY address) + 1;

2) Port Registers (Registers 16 – 95)

26 (0x1A): Port 1 PHY Special Control/Status,诊断与近端回环设置;

42 (0x2A): Port 2 PHY Special Control/Status

28 (0x1C): Port 1 Control 12,设置自动协商,速度,双工/半双工,流控,默认全部使能;

44 (0x2C): Port 2 Control 12

29 (0x1D): Port 1 Control 13,设置自动协商重启,低功耗,远端回环,默认均不使能;

45 (0x2D): Port 2 Control 13

30 (0x1E): Port 1 Status 0

46 (0x2E): Port 2 Status 0

31 (0x1F): Port 1 Status 1

47 (0x2F): Port 2 Status 1

63 (0x3F): Port 3 Status 1

67 (0x43): Reset,控制软复位;

3) Advanced Control Registers (Registers 96-198)

112 (0x70) to 117 contain the switch engine’s MAC address,读出00 10 A1 FF FF FF。

121 (0x79) to 131 provide read and write access to the static MAC address table, VLAN table, dynamic MAC address table, and MIB counters.

147~142(0x93~0x8E): Station MAC Address 1 MACA1

153~148 (0x99~0x94): Station MAC Address 2 MACA2

187 (0xBB): Interrupt enable register

188 (0xBC): Link Change Interrupt

195 (0xC3): Power Management and LED Mode

166 (0xA6): KSZ8873 mode indicator,读出0x03 ,即芯片型号为MLL/MLLJ。

198 (0xC6): Forward Invalid VID Frame and Host Mode,读出0x02,即为SPI 模式。

 

2.2.2寄存器设置

对0x06,0x1c,0x2c,0x1d,0x2d几个寄存器进行设置,回读正确。

  /* ETH_RST */
  IfxPort_setPinMode(&MODULE_P23, 6, IfxPort_Mode_outputPushPullGeneral);
  /* ETH_INT */
  IfxPort_setPinMode(&MODULE_P23, 7, IfxPort_Mode_inputPullUp);

  IfxPort_setPinState(&MODULE_P23, 6,IfxPort_State_low);
  _DelayMS(20);
  IfxPort_setPinState(&MODULE_P23, 6,IfxPort_State_high);
  _DelayMS(10);

  /* Reset the PHY */
  str_tx[0] = KSZ8873_CMD_WRITE;
  str_tx[1] = KSZ8873_Reg_RESET;
  str_tx[2] = KSZ8873_Reg_RESET_SWRST;
  _SPI_KSZ8873_Send(str_tx,3);

  /* wait for reset to finish */
  do {
      str_tx[0] = KSZ8873_CMD_READ;
      str_tx[1] = KSZ8873_Reg_RESET;
      _SPI_KSZ8873_Exchange(str_tx,str_rx,3);
  } while (str_rx[2] & KSZ8873_Reg_RESET_SWRST);

  /* setup Eth PHY */
  str_tx[0] = KSZ8873_CMD_WRITE;
  str_tx[1] = KSZ8873_Reg_GC4;
  str_tx[2] = 0x20; /* 100MBit,full duplex, flow control */
  _SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_GC9;
  str_tx[2] = 0x40; /* 62.5MHz supports SPI speed between 6MHz to 12.5MHz */
  _SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P1SC_ST;
  str_tx[2] = 0x02; /* Perform Remote loopback */
  //_SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P2SC_ST;
  str_tx[2] = 0x02; /* Perform Remote loopback */
  //_SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P1CON12;
  str_tx[2] = 0xff; /* 100MBit,full duplex, flow control */
  _SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P2CON12;
  str_tx[2] = 0xff; /* 100MBit,full duplex, flow control */
  _SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P1CON13;
  str_tx[2] = 0x00; /* Enable auto MDI/MDI-X */
  _SPI_KSZ8873_Send(str_tx,3);

  str_tx[1] = KSZ8873_Reg_P2CON13;
  str_tx[2] = 0x00; /* Enable auto MDI/MDI-X */
  _SPI_KSZ8873_Send(str_tx,3);

 

2.3 功能测试

2.3.1 Switch功能测试

设置KSZ8873相应寄存器后,将两台PC分别连至Port1、Port2,观察寄存器30和46的第五位,插上网线后都为1。设置PC1 IP地址为192.168.4.8,设置PC2 IP地址为192.168.4.23。

PC1执行:ping 192.168.4.23

PC2执行:ping 192.168.4.8

2.3.2 PHY功能测试

目标板运行测试程序,连接PC至Port1,在PC上使用Wireshark抓包,观察收发数据是否正确。

1) 关闭回环模式,目标板只发送数据,可见Wireshark接收到了相应数据[aa 55 aa 55 01 02 03 04]。PC接到Port1和Port2均能接收到数据。

2) 关闭回环模式,目标板只接收数据。

当PC使用ping命令时(广播),PHY芯片的RXDx管脚出现数据,说明PHY部分通讯正常。在单步运行模式下,目标板抓到IP数据,说明下位机已经成功接收了数据。PC接至Port1,执行ping 192.168.4.5 -t;PC接至Port2,执行ping 192.168.4.13,分别在目标板抓到相应IP地址。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值