目录
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地址。