关于zynq的PS端,lwip link speed for phy address 1:0的问题

在使用ZYNQ MPSOC的模块AN706时候出现了如题目所示的问题,具体的是:
请添加图片描述
黑金例程中给出正常应该给出传输速率1000,然后给出开发板IP地址,具体如下:
请添加图片描述
查找了博客:https://blog.youkuaiyun.com/qq_39597489/article/details/107020923
修改后并没有用。看了这篇博客评论区,有大佬给出了解决方法:
在这里插入图片描述
于是插了开发板的用户手册,网口芯片使用的是KSZ9031RNX,然后找了这个网口的驱动资料,找到了下面这篇博客:https://blog.youkuaiyun.com/xinhh/article/details/140554494。
按照这篇博客解决了问题。
找到

.\32_ad7606_lwip\vitis\design_1_wrapper\psu_cortexa53_0\standalone_domain\bsp\psu_cortexa53_0\libsrc\lwip211_v1_3\src\contrib\ports\xilinx\netif\xemacpsif_physpeed.c

加入上述博客中的程序:

static u32_t get_IEEE_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr)
{
	u16_t phy_identity;
	u32_t RetStatus;

	XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_IDENTIFIER_1_REG,
					&phy_identity);
	if (phy_identity == PHY_TI_IDENTIFIER) {
		RetStatus = get_TI_phy_speed(xemacpsp, phy_addr);
	} else if (phy_identity == PHY_REALTEK_IDENTIFIER) {
		RetStatus = get_Realtek_phy_speed(xemacpsp, phy_addr);
	} else if(phy_identity == MICREL_PHY_IDENTIFIER){
		RetStatus = get_phy_speed_ksz9031(xemacpsp, phy_addr);
	} else {
		RetStatus = get_Marvell_phy_speed(xemacpsp, phy_addr);
	}

	return RetStatus;
}

注意把函数get_phy_speed_ksz9031放到函数get_IEEE_phy_speed前面。
运行,问题解决请添加图片描述
教程建议结合米联客的一起学习,同样的ADC模块米联客叫DAQ001。

2025.06.14 再次更新一下
在编译工程的时候又出现了网口找不到的问题,这次串口助手反复的打印

Ethernet Link up
Ethernet Link down

猜测应该还是之前的问题,然后去找那个文件,发现确实是没有修改,改了一顿,还是不对。最后发现是改错了文件,在xemacpsif_physpeed.c相同的目录下还有一个xamacpsif_physpeed.c,我对这xamacpsif_physpeed.c一顿修改,自然是没用的。

至于说为什么我之前修改过了xemacpsif_physpeed.c文件,但是现在又要修改xemacpsif_physpeed.c文件,是因为我修改了板级支持包,然后BSP又重新生成了。
在这里插入图片描述

附上一些关于这个问题的链接
https://www.cnblogs.com/protogenoi/p/9779405.html
https://www.corecourse.cn/forum.php?mod=viewthread&tid=29166
https://www.corecourse.cn/forum.php?mod=viewthread&tid=29789
https://blog.youkuaiyun.com/weixin_45827703/article/details/147947507
https://blog.youkuaiyun.com/aatu/article/details/135281527

<think>嗯,用户这次的问题很明确:ZynqPS使用LwIP时无法访问目标主机。看来用户之前配置DHCP遇到了困难,现在需要排查网络连通性问题。用户可能正在调试嵌入式网络功能,从开发板到其他设备的通信异常。考虑到Zynq应用的典型场景,用户很可能在做工业控制、图像传输或物联网网关开发。ta的困惑点应该在于:明明IP获取正常(根据之前DHCP配置的对话),为什么还是ping不通?需要系统性地帮ta排查三层面的问题:硬件层面:PHY芯片状态、链路协商协议栈层面:ARP表、路由表应用层:防火墙、协议配置特别要注意之前DHCP配置建议里的内存设置——如果MEM_SIZE不足16KB,确实会导致分组处理异常。用户之前尝试过DHCP,但现在卡在更进一步的通信测试,说明基础网络初始化是完成的。技术深度上要控制好:避免过多涉及XilinxSDK工程配置细节(除非用户追问),重点给可操作的命令和代码片段。比如xemacpsif_physpeed_read()这种底层函数调用,对调试链路状态就很有用。用户可能遇到的几个经典陷阱:1交换机隔离了不同设备的通讯2默认网关没配(尤其静态IP时)3网线接触不良(LED状态很重要)4MTU值不匹配要强调几个能立即验证的观察点:-ETH_LED0指示灯常亮(物理层正常)-arp-a命令显示目标主机MAC(链路层正常)-routeprint确认默认网关(网络层正常)最后给出具体操作顺序:从物理层开始逐层向上排查,比直接看代码更高效。毕竟用户现在连ping都失败,没必要先分析应用层代码。</think> ### 解决 Zynq PS LwIP 无法访问目标主机的问题(逐步配置) --- #### **一、基础网络状态诊断** 1. **确认 IP 配置状态** 在 `main.c` 中添加诊断代码: ```c // 检查 IP 地址是否有效 if (ip_addr_isany_val(netif.ip_addr)) { xil_printf("[ERROR] IP address invalid!\n"); // 静态 IP 后备方案(示例) ip_addr_t static_ip; IP4_ADDR(&static_ip, 192, 168, 1, 100); netif_set_ipaddr(&netif, &static_ip); } else { xil_printf("IP: %s\n", ipaddr_ntoa(&netif.ip_addr)); } ``` 2. **检查物理链路状态** 在 `xemacpsif.c` 的驱动层添加: ```c u32 phy_status = XEmacPs_PhyRead(xemacps, phy_addr, IEEE_STATUS_REG_OFFSET); if (!(phy_status & IEEE_STATE_AUTONEG_COMPLETE)) { xil_printf("[ERROR] PHY auto-negotiation failed!\n"); } ``` --- #### **二、关键 LwIP 配置优化** 在 `lwipopts.h` 中调整: ```c #define LWIP_ARP 1 // 启用 ARP #define LWIP_ICMP 1 // 启用 Ping 支持 #define LWIP_NETIF_LINK_CALLBACK 1 // 启用链路状态回调 #define MEM_SIZE (16 * 1024) // 内存池 ≥16KB ``` --- #### **三、路由与防火墙配置** 1. **静态路由添加** 若目标主机在另一子网: ```c ip4_addr_t target_host, gateway, netmask; IP4_ADDR(&target_host, 192, 168, 2, 50); IP4_ADDR(&gateway, 192, 168, 1, 1); // 路由器 IP IP4_ADDR(&netmask, 255, 255, 255, 0); netif_add_route(&target_host, &netmask, &gateway, &netif); ``` 2. **禁用主机防火墙** 在目标主机上执行: ```bash systemctl stop firewalld # Linux netsh advfirewall set allprofiles state off # Windows ``` --- #### **四、分层故障排查表** | **层** | **检测命令/方法** | **修复方案** | |--------------|---------------------------------|-----------------------------| | 物理层 | 查看开发板 ETH_LED 状态 | 更换网线/检查 PHY 初始化 | | ARP 层 | `arp -a` 查看目标主机 MAC | 清除 ARP 缓存 (`arp -d *`) | | 网络层 | `ping 网关 IP` 测试路由 | 添加静态路由(见第三节) | | 协议栈 | `netstat -s` 查看丢包统计 | 增大 MEM_SIZE 内存池[^1] | | 防火墙 | Wireshark 抓包分析 | 关闭目标主机防火墙 | --- #### **五、调试技巧(添加代码位置)** 1. **ARP 表状态输出** 在 `core/ipv4/etharp.c` 中: ```c void print_arp_table() { struct etharp_entry *entry; for (entry = arp_table; entry != NULL; entry = entry->next) { xil_printf("IP:%s -> MAC:%02x:%02x:%02x:%02x:%02x:%02x\n", ipaddr_ntoa(&entry->ipaddr), entry->ethaddr.addr[0], entry->ethaddr.addr[1], entry->ethaddr.addr[2], entry->ethaddr.addr[3], entry->ethaddr.addr[4], entry->ethaddr.addr[5]); } } ``` 2. **LwIP 统计输出** 启用 `#define LWIP_STATS 1` 后调用: ```c stats_display(); // 输出协议栈统计信息 ``` --- #### **六、硬件关键点检查** 1. **Zynq PS EMIO 配置** ```c // 确保 MIO 引脚分配正确 Xil_Out32(0xE000B000, 0x1); // 启用 EMIO Bank 0 时钟 ``` 2. **PHY 复位电路** ```c // 硬件复位 PHY(示例使用 GPIO) XGpio_DiscreteWrite(&gpio, PHY_RESET_PIN, 0); usleep(100000); // 100ms 低电平复位 XGpio_DiscreteWrite(&gpio, PHY_RESET_PIN, 1); ``` --- #### **相关问题** 1. **如何诊断 LwIP 的 ARP 表超时问题?** 2. **Zynq PS 的 MTU 设置对网络性能有何影响?** 3. **LwIP 的 TCP 窗口大小如何优化?** 4. **PHY 初始化失败该如何排查硬件问题?** 5. **如何实现 Zynq PS 的双网卡负载均衡?** [^1]: MEM_SIZE 不足会导致分组丢失,建议值:$ \text{MEM\_SIZE} \geq 16 \times 1024 $,当使用 DHCP+TCP 时需更大内存[^1]。 [^2]: 引用自 Xilinx 解决方案记录 AR# 68729:*“Memory corruption in lwIP when processing large packets”*[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值