前提
对STM32双网口实现的方案的继续探究,比较多见的都是
- W5500
- DM9000
- ENC28J60
通过研究,我还发现了一类比较少见但是灵活的方案
交换机芯片
也就是本文提到的这个KSZ8863
一颗LQPF48脚的3口10/100M的以太网交换芯片
目前(21年9月份)在立创上的价格是:
简单说就是这芯片就实现了一个三口管理型交换机…而且价钱还算比较OK,当然现在疫情的原因,买不到/要订货啥的我也不意外。
最新进展
23年 5月
总觉得这个事情没有完成觉得不甘心呀
立创上终于有货了。又打了一次
这次我试了试IIC
但是还是不行。。。。
于是我托人请了微芯的FAE来指导
结果发现!!
我可能之前为了好走线,把板子PCB上的接线插针的丝印写错了
导致我接线没有接对
其实板子画的是对的
在它指导下,我尝试用IIC去读了寄存器,可以读出来了
我尝试读了0-8号寄存器,用RTT工具打出来
IIC通信正常
我估计前面SPI那个接线不行
估计和这个丝印错了有关系
这个翻车翻得真是始料未及~~
以前方向错了,一直怀疑芯片有问题(也确实FAE说他感觉那个芯片丝印也是有点不正常,但是他也不确定)
也算是给自己一个交代了,不想搞了,不知道SPI的配置功能到底为啥不行~~
22年6月底第二次打板
4. 22年6月底第二次打板,我重新再认真读了官方模块的手册和数据手册,改了下原理图,SPI还是类似的现象,还是读不出…呜呜呜
相较上一版本,加了一个LDO,优化走线布局,认真的理了理SPI部分的走线,结果还是读不出来,真的是很无奈~~~
这次读出来的不是FF了,好像是主机发什么,它就返回什么,02指令和03指令都试了
抛开这个配置,交换机本身的功能是可以的,这个没啥好说,这次打板PCB没有改这部分。。。
22年2月第一次打板
- 网络似乎是能够通信上(脱开开发板,2个口与电脑双向PING通(普通交换机功能),接上开发板的RMII接口,开发板通过 RMII接口可以与电脑正常网络通信,两个口单独使用都可以,但是两个口一起插网线,驱动挂了,可能要改驱动(驱动基于LAN8720))
- SPI配置功能没调通,RMII接口读PHY的信息都读不到,不知道原因,但是网络通信却是正常的.
- 驱动可能要研究下LWIP多个网卡怎么搞?
疑点1-RMII接口
似乎原生驱动LAN8720的程序好像没有使能MDIO这个外设??那LAN8720是如何在仅仅初始化了RMII接口之后获得到PHY相关的信息的了?
看H743的手册,我好像有点明白了~~~
H743的网络接口有三种
a) RMII(目前用的)
b) SMA(站管理模式)
c) MII
SMA接口就是需要使用MDIO和MDC数据线传输数据的方式与PHY芯片通信的
通信的数据帧格式和交换机芯片的一致
这个是可以设置时钟的
在RTT LAN8720驱动代码里,确实找到了这样一句HAL驱动函数的调用
void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
{
uint32_t tmpreg, hclk;
/* Get the ETHERNET MACMDIOAR value */
tmpreg = (heth->Instance)->MACMDIOAR;
/* Clear CSR Clock Range bits */
tmpreg &= ~ETH_MACMDIOAR_CR;
/* Get hclk frequency value */
hclk = HAL_RCC_GetHCLKFreq();
/* Set CR bits depending on hclk value */
if((hclk >= 20000000U)&&(hclk < 35000000U))
{
/* CSR Clock Range between 20-35 MHz */
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV16;
}
else if((hclk >= 35000000U)&&(hclk < 60000000U))
{
/* CSR Clock Range between 35-60 MHz */
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV26;
}
else if((hclk >= 60000000U)&&(hclk < 100000000U))
{
/* CSR Clock Range between 60-100 MHz */
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV42;
}
else if((hclk >= 100000000U)&&(hclk < 150000000U))
{
/* CSR Clock Range between 100-150 MHz */
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV62;
}
else /* (hclk >= 150000000)&&(hclk <= 200000000) */
{
/* CSR Clock Range between 150-200 MHz */
tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV102;
}
/* Configure the CSR Clock Range */
(heth->Instance)->MACMDIOAR = (uint32_t)tmpreg;
}
似乎目前HAL库里面是关联了HCLK时钟的
有没有可能是因为芯片的HCLK时钟设置的比较高,导致对应这个MDIO的时钟设置的过高(超过了5MHz)导致访问交换机芯片读出的内容都有问题。
应该不是的,用 LAN8720的驱动打断点看了函数的执行
HCLK 200Mhz, 它是走了CSR/102这个分支,对应算下来MDC时钟应该不超过3MHz,应该是没有超过5Mhz的上限。
或者说还有一种可能
因为LAN8720是使用RMII接口驱动。 实际上RMII接口下,MDIO实际上并没有使用,也没有初始化呢,导致读取的值都是异常值?
应该不会,因为LAN8720的网线断开插入后重新连接应该是会用到MDIO查询PHY的,不可能RMII接口不联动这个MDIO,不然这个重新连接怎么实现的呢?
单独做了一个只有MDIO接口的工程,尝试读了,也是读不出来.
疑点3-SPI接口
难道SPI驱动那里驱动没调好???
再次用CubeMx单独做了个15MHz/7.5MHz的SPI4接口(模式0和模式3)的工程分别试了试
用逻辑分析仪抓了通信,读出来都是FF
跟它提供的多字节读的波形应该对的上呀,但是读不出来?
难道说SPI接口的线和板子的电源层短路了,所以被拉高?
这个也拿万用表量了引脚和VCC,也没有短路,引脚也是通到了座子上的
上次调也有试过下掉MISO/MOSI这两条上拉电阻,拿USB转SPI仪器去读,也是读不出来,全是FF
看来是无解了
原理图,送给大家(这个要积分哈),虽然有点问题,但是单纯做交换机本身还是可以用的
说不定有大佬能够搞明白哪里画的不对,能够解决上面的问题
22.2.25
1. spi读不到任何数据,全是ff,手册说要用模式0或者3来读,都试了,也换了SPI频率,都是一样,读不出任何东西,都是FF。
试了12M,24M的SPI频率都不行,都是读出来都是FF(这里忘记截图了,现象很奇怪)
指令说是"3"是数据读,"2"是数据写
但是它下面给 的波形图,好像又不是这样的,“2”和"3"我都试过了,都不行…
读和写都是"2"???
板子这边我也是参考这个官方核心板的原理图上的说法做的
SPI接口: P2LED1不用下拉(NG不贴),P2LED0.1K下拉到地
SPI接口: P2LED1不用下拉(NG不贴),P2LED0.1K下拉到地
手册也说,配置模式,就是上电,复位完毕时候读取这两引脚的状态,决定配置的方式。
反正就是啥也读不出,不知道为啥…
2. 网络部分,rtt的lan8720驱动把读软复位的功能去掉之后,网络是通的,只要不同时两个口插网线,只要插了双网线,驱动会有问题(问题 可能是原来只注册了一个网卡,两个网卡同时在的话,它就会有异常了).
双向ping都是通的,但是用mdio口读芯片的phy寄存器信息全部是FFFF…有点怀疑是不是芯片有问题(X宝买的,目前X宝有卖,立创买不到,没办法),原来给LAN8720配PHY地址原来是0,然后试过1,2,3,好像都可以ping的通,网络也是正常的**(按手册描述,应该是3才对(3对应的是RMII接口),1和2是它外扩的RJ45)**。
22.2.23
半年工作比较忙,终于有空把所有信息整合,画原理图,PCB,打样,把初版核心板制作出来了
后期如果调通完,我就放出原理图
先晒下效果。。
先是板子,我引出了RMII接口和SPI管理接口和电源接口
唯一小遗憾的是应该加一个LED电源指示灯,因为它上电以后,不插网线的情况下,是没有任何反应的
插上网线的效果(一头接交换机,一头接PC)
PC端显示网络正常(100M),网络通信也是正常的!!因为我是在内网环境下,我试着访问了内网的一个服务器也是正常的。
芯片信息汇总
(我会提供这些收集到的文档和资料在我的csdn,不要积分下载):
https://download.csdn.net/download/tpoem/21883787
手册在微芯官网上可以查
原理框图大概是这样的
一共三个MAC,两个PHY。
其中MAC3是可以通过RMII/MII接入处理器或者PHY芯片的[手册24页],它下面也附录了接的方法
MII/RMII的解法
microchip收购了micrel这个牌子,所以KSZ系列芯片以前是这个公司的
接PHY或者MAC的方法
接的时候也有一些坑的地方
注意看这个表格,Clock Source那里,有特殊的接线的描述
关于RX_ER的问题
它这个芯片没有提供EX_ER信号出,它自身过滤了错误帧,它有特殊的做法
关于MII 管理帧格式和SMI管理帧格式
MII管理帧格式如下(这个就是芯片提供的MII/RMII接口的那个MDC/MDIO的通信协议)
看H743的描述理论上应该式可以用MDIO与交换机通信的
但是交换机芯片对MDIO时钟有限制(最大5MHz)
关于供电
这个芯片需要3.3V+1.8V供电(这个芯片内置1.8V LDO),它1.8V的引脚有特殊接法【磁珠隔离数字电源和模拟电源】
这个在微芯官方的8863模块(它是RMII接口输出的)上也有体现
来源于这个文档
关于网络变压器和网口选择
上面这个官方模块用的是一个带隔离变压器的双口RJ45座子,手册和它官方的原理图上都提供了推荐网络变压器选型,至于RJ45座子,这个可能要采取类似于官方模块这种变压器构型的或者无变压器的座子吧
其中这个型号立创上有卖,还挺多货,可以!!
关于配置交换机的功能
芯片支持必要的网管功能,可以通过SPI/SMI/I2C配置,还可以将配置写到一片外部的EEPROM(24Cxx)上,实现配置信息自动加载,无管理交换机的功能。
芯片上电启动或者复位后的时候会优先从外部EEPROM读配置信息,然后引脚恢复成其他功能。
或者直接用I2C读芯片的所有寄存器
关于外部EEPROM的配置信息如何制作
这里参考这个链接,官方其实做了一个小工具
EEPROM的配置信息制作
其他
看到个实验成功的博主的帖子