Rabbitoose 发表于 2024-1-23 19:18:21

STM32+LAN8720Ai在连到某些交换机时初始化失败问题咨询

我有一些板子是STM32F429IGT6+LAN8720Ai,用STM32 HAL库,无操作系统。

这两天发现如题所述错误。

当网线接到大多数交换机上时,可正常初始化,通过lwip进行http请求等都没问题。不过我测试的都是可管理或三层的H3C、华为交换机。

可就是对少数某些交换机(我还不知道规律,但手头能复现问题的就是一台H3C S1224R 非管理交换机,我可以再继续找傻瓜式交换机试试)表现为插上网线后无法初始化成功,表面现象是网口上表示连接状态的灯不会亮起,后续的网络有关操作也无法成功。

问题原因不那么明显,有坛友遇到过的话可能看问题开头就能知道原因了,所以上来一问,有经验的坛友可以给个提醒。


进行的排查:
(1)芯片各引脚电压正常,原理图无误(毕竟在有些交换机下通讯是可行的,并能达到几MB的速度)
(2)晶振起振了,向MCU输出的50MHz的时钟信号波形也完美。
(3)底层代码并没有多少改动,是用CubeMX生成的代码。CubeMX新版少了外置PHY的参数配置界面,用旧版试过配置了4、5个参数仍然有相同现象。
.。。。
等等。我怀疑这些排查是无用功。

另外有一点我拿不准的是,LAN8720A和网口之间除了板子上走线有约10cm(差分走线,阻抗都计算过的),中间还有一段10cm的FFC排线(0.5mm间距),并且在网口那一端所需的3.3V我是用另一个LDO产生的,和8720A不是同一个LDO。但我觉得应该也不是这里的问题,毕竟在大部分交换机下它都是好的。做之前还发帖问过,见https://www.amobbs.com/thread-5779453-1-1.html

Rabbitoose 发表于 2024-1-23 22:01:31

网上翻到一个帖子:为什么以太网+柔性板与电脑无法协商为100M?

硬件:基于STM32F4单片机+LAN8720A(PHY)芯片,移植LWIP轻型以太网协议栈,硬件参考发烧友探索者开发板。
连接方式:1.板子通过刚柔结合板与PC机进行连接,系统上电后,PC端5s后显示建立连接,打开网络属性,发现双方自协商为10M;
               2.板子不经过刚柔结合板,直接与PC机连接,系统上电后,双方很快建立连接,且协商结果为100M;
问题: 1.为什么经过柔性版之后,双方不能建立100M以太网联系;
          2.以太网传输对传输介质的要求什么?
          3.如果是因为柔性板将信号衰减,那么柔性板设计该注意什么?或者以太网传输不能通过柔性板?
自己回答:

问题已经解决了,板子上以太网的线宽跟柔性板线宽不一致,导致信号损耗,回波反射。

跟我的问题不完全一样但有类似地方。

qwe2231695 发表于 2024-1-24 00:11:19

把 PHY芯片的复位处理一下,可能是网线漏电?

Rabbitoose 发表于 2024-1-24 09:23:19

qwe2231695 发表于 2024-1-24 00:11
把 PHY芯片的复位处理一下,可能是网线漏电?
(引用自3楼)

PHY芯片的15脚nRST我是下拉的,并在HAL_ETH_MspInit()函数中做了一次复位(电平置高,delay 10ms,置低,delay 10ms,再置高)

你说的处理一下应该不是处理电平吧?是指怎么处理呢?我搜索了网线漏电也没找到相关讨论。

Arm2048 发表于 2024-1-24 09:46:26

可能是网速自动协商失败;
cubemx中设置LWIP_NETIF_STATUS_CALLBACK enable ; LWIP_NETIF_LINK_CALLBACK enable;
ethernetif.c中low_level_init()函数中:
/* Initialize the LAN8742 ETH PHY */
LAN8742_Init(&LAN8742);

if (hal_eth_init_status == HAL_OK)
{
    //PHYLinkState = LAN8742_GetLinkState(&LAN8742); //original code
        if(LAN8742_StartAutoNego(&LAN8742) != LAN8742_STATUS_OK){
                printf("\nLAN8742_StartAutoNego_err ");
        }
        PHYLinkState = LAN8742_GetLinkState(&LAN8742);
        printf("\nPHYLinkState=%d ",PHYLinkState);


    /* Get link state */
    if(PHYLinkState <= LAN8742_STATUS_LINK_DOWN)
    {
      netif_set_link_down(netif);
      netif_set_down(netif);
    }
    else
    {
      switch (PHYLinkState)
      {
自动协商后,获取状态,如果自动协商失败,link_down set_down;手动设置网速模式duplex与网速speed,然后set_up与link_up;

Arm2048 发表于 2024-1-24 09:56:14

同上,ethernet_link_thread()函数中的for循环中检测PHY连接状态LAN8742_GetLinkState(&LAN8742),如果连接状态有掉线或者改变,如上处理;

Rabbitoose 发表于 2024-1-24 18:04:45

Arm2048 发表于 2024-1-24 09:56
同上,ethernet_link_thread()函数中的for循环中检测PHY连接状态LAN8742_GetLinkState(&LAN8742),如果连接 ...
(引用自6楼)

十分感谢!

我按你的方法试试,今天白天一直在忙别的还没来得及试。

另外我发现有问题的交换机拉出来的网线,接到另一个交换机上,交换机连接状态指示灯也要等一会儿才能亮起,可见协商需要时间。我十分怀疑我的代码协商等待时间不足。

Rabbitoose 发表于 2024-1-24 18:24:18

Arm2048 发表于 2024-1-24 09:56
同上,ethernet_link_thread()函数中的for循环中检测PHY连接状态LAN8742_GetLinkState(&LAN8742),如果连接 ...
(引用自6楼)

新消息:手动设置为10M全双工可以正常连接。

Rabbitoose 发表于 2024-1-25 11:50:59

又尝试了用CubeMX旧版和旧版的FW生成的代码框架,并关闭自动协商,使用10M全双工可以正常通信,
而使用新版CubeMX的,就算指定了10M全双工,虽然灯能亮起,但仍不能通信。

zzsczz 发表于 2024-1-26 13:22:02

Rabbitoose 发表于 2024-1-25 11:50
又尝试了用CubeMX旧版和旧版的FW生成的代码框架,并关闭自动协商,使用10M全双工可以正常通信,
而使用新版 ...
(引用自9楼)

cubemxmdk版本号晒出来撒

liuqian 发表于 2024-1-26 18:43:51

cube的bug太多了,出问题折腾半天,发现不是自己的问题,实在是觉得憋屈。而且不停升级,就是感觉st自己不好好测试,让用户帮他测。

Rabbitoose 发表于 2024-1-29 16:36:06

zzsczz 发表于 2024-1-26 13:22
cubemxmdk版本号晒出来撒
(引用自10楼)

新版是6.10.0 FW 1.27.1
旧版是6.3.0FW 1.26.2

(旧版CubeMX中有LAN8742的详细寄存器配置,但是新版没有了)


Rabbitoose 发表于 2024-2-4 12:41:09

后来经优化测试服务器接口性能,将传输速度已经提高到了数MB字节/s。

页: [1]
查看完整版本: STM32+LAN8720Ai在连到某些交换机时初始化失败问题咨询