芯路恒电子技术论坛

 找回密码
 立即注册

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

热搜: 合集
查看: 402|回复: 1

【Zynq】【Lwip】解决频繁打印link up/down、绿灯不亮、自协商结束后插入网线无反应的问题

[复制链接]

该用户从未签到

28

主题

10

回帖

424

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
424
发表于 2026-3-10 11:03:05 | 显示全部楼层 |阅读模式
在进行软件修复前,需首先确认开发板搭载的 PHY 芯片型号。辨别方式如下:

硬件观察: 查看开发板上网口附近的芯片丝印,查找 RTL8211F 或 YT8531H 字样。

原理图确认: 查阅对应版本的硬件原理图,核对网络部分的芯片型号。

注意: 不同型号的芯片寄存器定义不同,必须使用对应的初始化代码。
image.png



一、RTL8211F 版本修复


如果在使用官方lwip模板时出现自动协商失败,请先查看该帖子:https://www.corecourse.cn/forum.php?mod=viewthread&tid=29166

也可以用本帖提供的源文件直接替换,也可解决自动协商失败问题

xilinx官方提供的 LWIP_ECHO 的demo(vivado2018.3版本),在使用的过程中还发现一些小问题,在此提供解决方法

1、以太网设置固定速率的时候,会频繁打印link up/link down

2、开发板网口与电脑端连接时,会出现绿灯不亮

3、网线先不插,等待自协商结束后,再插上会无反应

这里针对上面3个bug,在这里提供一些解决方法:

(1)报错现象与分析

问题1:固定速率问题
现象如下图所示,设置固定速率为1000M后,插上网线就会不断提示link up/link down

222.png
分析:

① 笔者观察到在以太网物理层链路建立过程中,每次网线重新插入后,PHY状态寄存器的bit2(通常表示链路状态)初始会持续一段时间为0,然后才稳定为1。

在xemacpsif_physpeed.c文件下面configure_IEEE_phy_speed函数中,存在PHY复位操作(在828行左右,IEEE_CTRL_RESET_MASK是用于将bit15写入1)

下载.png

根据数据手册的描述可见,在复位操作后,会导致链路的不稳定;例程中,在复位后,添加了延时操作,等待链路回复正常,但是这个时间是不够的;这也就是导致持续发送link up、link down的原因。

下载 (1).png

所以我们需要给它增加延时,如下图所示

下载 (2).png

② 经过修改后,如下图所示,插上网线后会提示一次Ethernet Link !

下载 (3).png

如下图所示,拔出网线会提示一次Ethernet Link down,不再重复打印

下载 (4).png

问题2:绿灯不亮问题

现象如下图所示,开发板网口与电脑端连接时,会出现绿灯不亮问题;

下载 (5).png

分析:

① 这里主要是EEE寄存器和Reg16寄存器配置不对

② 先关闭LED1、LED2的 EEE 指示,再配置Reg 16寄存器;(代码位于xemacpsif_physpeed.c文件,phy_setup_emacps函数中)

下载 (6).png

③ 设置Reg16寄存器

下载 (7).png

问题3:网线先不插,自协商结束后,插入会无反应

现象如下图所示,网线先不插,等待自协商结束后,再插上会无反应;

下载 (8).png

分析:

①笔者在调试中发现xemacps_control.c文件中,XEmacPs_SetOperatingSpeed函数里面有速率相关的断言;这里将其屏蔽即可。

②自协商失败后,再插入网线,也会尝试连接

下载 (9).png



(2)快速解决方法

① 将帖子下方提供的RTL8211F_code.zip压缩包解压(其中包含三个C文件)
下载 (10).png

② 打开工程下的bsp文件夹,找到对应的文件目录,进行替换即可

下载 (12).png

下载 (11).png

二、YT8531H 版本修复

问题1:绿灯不亮问题
问题分析: 裕太(YT)芯片需要通过配置 LED1_CFG 寄存器来强制定义绿灯的显示逻辑。
修复逻辑: 修改xemacpsif_physpeed.c文件中的phy_setup_emacps函数(可删除原函数,然后粘贴下方函数)。

代码实现:

[C] 纯文本查看 复制代码
u32_t phy_setup_emacps (XEmacPs *xemacpsp, u32_t phy_addr)
{
        u32_t link_speed;
        u32_t conv_present = 0;
        u32_t convspeeddupsetting = 0;
        u32_t convphyaddr = 0;

#if 1//控制LED1和LED2闪烁或常亮
        u16 led_val;

        // 1、设置扩展寄存器地址偏移为 LED1 的配置寄存器 0xA00D
        XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1E, 0xA00D);

        // 2、从 0x1F读取 LED1 当前的配置值
        XEmacPs_PhyRead(xemacpsp, phy_addr, 0x1F, &led_val);

        // 3、修改配置,这里主要将 Bit 6 (Led_gt_on_en_1) 置为 1,使能千兆常亮
        led_val |= 0x0040;

        // 4、再次写入地址偏移以防被改变
        XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1E, 0xA00D);

        // 5、将修改后的值写回 0x1F
        XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1F, led_val);
#endif


#ifdef XPAR_GMII2RGMIICON_0N_ETH0_ADDR
        convphyaddr = XPAR_GMII2RGMIICON_0N_ETH0_ADDR;
        conv_present = 1;
#endif
#ifdef XPAR_GMII2RGMIICON_0N_ETH1_ADDR
        convphyaddr = XPAR_GMII2RGMIICON_0N_ETH1_ADDR;
        conv_present = 1;
#endif

#ifdef  CONFIG_LINKSPEED_AUTODETECT
        link_speed = get_IEEE_phy_speed(xemacpsp, phy_addr);
        if (link_speed == 1000) {
                SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
                convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
        } else if (link_speed == 100) {
                SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
                convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
        } else if (link_speed != XST_FAILURE){
                SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
                convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
        } else {
                xil_printf("Phy setup error \r\n");
                return XST_FAILURE;
        }
#elif        defined(CONFIG_LINKSPEED1000)
        SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
        link_speed = 1000;
        configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
        sleep(1);
#elif        defined(CONFIG_LINKSPEED100)
        SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
        link_speed = 100;
        configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
        sleep(1);
#elif        defined(CONFIG_LINKSPEED10)
        SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
        link_speed = 10;
        configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
        sleep(1);
#endif
        if (conv_present) {
                XEmacPs_PhyWrite(xemacpsp, convphyaddr,
                XEMACPS_GMII2RGMII_REG_NUM, convspeeddupsetting);
        }

        xil_printf("link speed for phy address %d: %d\r\n", phy_addr, link_speed);
        return link_speed;
}




更新记录
24.10.24 更新固定速率,频繁打印link up/link down解决方法
26.3.10   添加YT8531H版本,以太网通信时绿灯不亮问题解决方案

文件下载:
RTL8211F_code.zip (18.28 KB, 下载次数: 68)
回复

使用道具 举报

该用户从未签到

28

主题

10

回帖

424

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
424
 楼主| 发表于 2026-3-30 10:48:02 | 显示全部楼层
Linux下修改YT8531H版本,配置绿灯:

1、从下方下载mdio-tool应用,移动到Linux系统中,修改权限;
2、在终端中执行下面命令;
image.png

[C] 纯文本查看 复制代码
./mdio-tool w eth0 0x1E 0xA00D
./mdio-tool r eth0 0x1F
./mdio-tool w eth0 0x1E 0xA00D
./mdio-tool w eth0 0x1F 0x0041

结果如下所示:
image.png


附件:
mdio-tool.zip (3.29 KB, 下载次数: 5)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

GMT+8, 2026-4-11 19:14 , Processed in 0.053093 second(s), 37 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表