ksz8863是一款交换芯片,结构如下:
有2个完整的MAC + PHY, 还有第三路网口,只有一个MAC3,右边是switch逻辑,下边是控制接口,支持i2c/spi/smi
1.片子的rmii/mii接口支持2种模式, MAC 模式 加 PHY 模式, 注意,工作模式是相对于它自身所起的功能所说的,如果它是通过rmii接stm32f437的MAC,它起到一个外置PHY的作用,那它用的就是PHY模式。这也是KSZ8863复位后处于的模式,常用模式。
2.测试过程中,有时候10M通,有时候100M通,终于找到问题了, 必须通过I2C/SPI/SMI来控制REG_SWITCH_CTRL_4寄存器写入SWITCH_10_MBIT位。
感觉KSZ8863的MDIO不需要设置,直接就能通。 想想应该也是这样的,一个交换机,就应该是傻瓜级的,如果是简单应该就不应该配置。
但10/100为什么 不做成自适应的呢?看来网上的教程大部分都是错误 的。
我的RSTN引脚没有使用,造成硬复位不正常。
3 switch逻辑如果复位不完整的话,值是不定的。最好是通过i2c/spi/smi接口来写入确定的值。
4。最坑的接口smi,这个接口STM32是不支持,这也不是标准的接口,
标准的SMI接口是这样的
写OP码是 01 读OP码是10, 但ksz8863却自作聪明搞了个00的OP码, 让我误以为大家都支持呢, 经过我的研究,STM32F4XX寄存器层面就不支持, STM32H7XX寄存器层面支持但实际也不支持,也就是说在STM32平台OP码这个位置永远不会出现00,
下面是KSZ8863要求的SMI时序。应该很少平台能支持。
SMI接口不能用,那最方便的就是直接把MDC MDIO配置为I2C接口,STM32平台 那2引脚不能配置I2C, 那我就使用软件模拟的方法成功的读到了KSZ8863的ID号 0x88.
后面就很顺利的。
后续: 总线调通之后 ,又把linux下ksz8863的驱动移植到stm32下, 片子很简单,但驱动结构相当复杂。主要是因为ksz8863这个片子的功能相当强大, 一大堆寄存器, 能实现很多功能,但在简单应用时完全可以不用,也就是硬件连好之后就通了,基本功能就有。