【Zynq】【Lwip】解决使用官方lwip模板时自动协商失败的问题

问题


近期有小伙伴在使用ACZ702开发板尝试官方的lwip模板做实验时,出现自动协商失败或者Phy设置失败的问题

image.png

这个问题可以在bsp中关闭自动协商解决,但治标不治本,因此这里教大家如何一劳永逸的解决这个问题。

备注:使用lwip echo server模板时,关闭自动协商会出现Link up/down反复的Bug,要么根据本帖修改源码,要么更换其它模板关闭自协商。

原因


使用官方的lwip模板无法自动协商,是因为该模板默认使用Realtek的RTL8211E芯片,而ACZ702开发板上使用的网卡芯片是Realtek的RTL8211FDI芯片,由于两种芯片的PHYSR寄存器有差异,因此需要小小的修改一下

RTL8211E的PHYSR寄存器说明

RTL8211FDI的PHYSR寄存器说明

可以看出来两款芯片的PHYSR寄存器的

### ZYNQ 平台下 LWIP协商配置与故障排除 #### 配置网络参数一致性 确保子网掩码和默认网关与 `main.c` 中设置的一致非常重要。任何不一致都可能导致自协商失败。建议以官方例程中的配置作为标准进行调整[^2]。 ```c // main.c 示例片段 struct ip_addr ipaddr, netmask, gw; IP4_ADDR(&gw, 192, 168, 1, 1); IP4_ADDR(&ipaddr, 192, 168, 1, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); err_t err = lwip_init(); if (err != ERR_OK) { printf("LWIP初始化失败\n"); } ``` #### 物理层(PHY)驱动适配 对于不同的PHY芯片,可能需要额外编写或修改对应的驱动程序来支持特定的功能特性。Xilinx Vitis 创建的 demo 工程已经较好地集成了LWIP库并进行了优化和支持,但对于某些特定型号的 PHY 可能仍需做适当调整[^3]。 #### UDP通信方式下的回调函数注册 当更改LWIP协议栈为UDP通信模式,通过调用`udp_recv()`可以指定用于处理接收到的数据包的回调函数。这一步骤虽然不是直接解决协商问题的关键,但在构建完整的通讯链路过程中不可或缺[^1]。 ```c static void udp_recv_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { // 处理接收到的数据... } void setup_udp_communication(struct udp_pcb* pcb){ udp_recv(pcb, udp_recv_callback, NULL); } ``` #### 故障排查指南 - **确认硬件连接无误**:检查物理连线是否牢固可靠。 - **验证MAC地址唯一性**:保证设备间不会因为重复的MAC地址而发生冲突。 - **调试信息输出**:利用日志打印功能监控自协商过程的状态变化,便于定位具体环节的问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值