以太网基础⑥ ZYNQ PS端 基于LWIP的TCP例程测试
1.今日摸鱼任务
实现:基于 LWIP 模板的 TCP 回环测试 以官方模板中的 LwIP Echo Server 为例,学习使用 LwIP 模板。 |
小梅哥链接:【BX71】基于LWIP模板的TCP回环测试 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! |
2. LWIP简介
LwIP 是一个小型开源的TCP/IP协议栈。保持 TCP 协议主要功能的基础上减少RAM的占用。 |
Vivado2018.3 中提供 LwIPv2.0.2 版本的 SDK 库,为 Ethernetlite(axi_Ethernetlite)、TEMAC(Axii_ethernet)以及千兆以太网控制器和 MAC(GigE)核提供适配。能够在 MicroBlaze、ARM Cortex-A9、 ARM Cortex-A53、ARM Cortex-R5 处理器上运行。 Ethernetlite 和 TEMAC 核适用于 MicroBlaze 系统。 千兆以太网控制器和 MAC(GigE)核仅适用于 ARM Cortex-A9(Zynq-7000 处理器设备)、ARM Cortex-A53 和 ARM Cortex-R5(Zynq UltraScale + MPSoC)系统。 |
根据是否基于操作系统,LwIP 提供了两套 API(术语为 A05PI),分别如下: Raw API:事件驱动的 API,在没有操作系统的情况下运行 lwIP 时惟一可用的 API。 Socket API:bsd 风格的套接字 API。线程安全,只能从非 tcpip 线程调用。 对于嵌入式而言,通常并不会使用到操作系统,因此大都是使用的 Raw API。 |
LwIPv2.0.2: ① 支持多网络接口下的 IP 转发; ② 支持 ICMP 协议; ③ 支持 (Dynamic Host Configuration Protocol,DHCP )协议,动态分配 ip 地址; ④ 支持 ARP 协议(以太网地址解析协议); ⑤ 支持 IGMP 协议(互联网组管理协议),可以实现多播数据的接收; ⑥ 支持 UDP 协议(用户数据报协议); ⑦ 支持 TCP 协议(传输控制协议),包括阻塞控制、 RTT 估算、快速恢复和快速转发。 |
SDK 中官方模板默认使用的是 Realtek 的 RTL8211E 芯片,开发板上是RTL8211F-CG 要注意 PHYSR 寄存器 |
RTL8211E PHYSR 寄存器 RTL8211E-VB-CG -PDF数据手册-参考资料-立创商城 |
RTL8211F-CG PHYSR 寄存器 RTL8211F-CG -PDF数据手册-参考资料-立创商城 |
这两个寄存器无论是偏移地址还是位分布都有很大的差异。 导致 PHY 芯片在查询 PHYSR 实时链路读取回错误值,导致自动协商一直处于失败状态。 除此之外,由于Link Speed位分布的不同,无法获取到正确的速度配置。 因此,在使用官方模板时,我们就需要修改这些相关位。 |
3. 硬件逻辑设计
3.1 IP核添加与配置 |
使用PL侧的以太网,在UG585CH16中,通过 EMIO 路由到 PL 时,其接口类型为 GMII: 所以,除了 ZYNQ 核之外,设计还需要添加一个 GMII 转 RGMII 核,用来实现接口类型的转换。 |
IP 手册 pg160pg160-gmii-to-rgmii最新说明书手册.pdf-原创力文档 对于 ZYNQ- 7000 系列器件,在使用 GMII to RGMII 核时,需要为其提供 200MHz 输入时钟。 |
设计还需要添加一个 Constant 核,用来输出常量,控制以太网复位信号。 |
3.1.1 ZYNQ核 |
3.1.2 GMII to RGMII 核PHY Address:该项不是以太网 PHY 地址,而是用于标识 MDIO 事务中core 的虚拟地址。 因此该项只需设置一个与板载 PHY 不同的地址即可。 Provide 2 ns Skew on RGMII TXC:选择为 RGMII 的 TXC 添加 2ns 的偏斜; 可以选择由外部 PHY 添加,或由 IP 核通过 MMCM 添加。 Shared Logic:选择是否需要共享时钟资源。 Include Shared Logic in the Core: 只有一个 core,或者存在多个 core 但需要一个 core 共享时钟资源,以驱动其余核时,需要勾选 。 Include Shared Logic in the Example Design: 存在多个core,且已经有一个 core共享了时钟资源用来驱动其他核时,才需要勾选 。 |
3.1.3 Constant 核用于控制以太网复位信号,只需给一个常量 1,确保以太网不会被复位即可 |
|
3.2 端口连接 |
|
3.3 .XDC |
//这里使用的是ACZ702系列的PL端 set_property IOSTANDARD LVCMOS33 [get_ports MDIO_PHY_0_mdc] |
.bit .hdf |
4. 软件程序设计
SDK,选择模板: |
该模板工程会将开发板的 IP 设置为 192.168.1.10,并在端口 7 监听数据,对接收到的数据进行回发。 |
修改以下参数: |
xemacpsif_physpeed.c #include "netif/xemacpsif.h" #if defined (__aarch64__)
static u32_t get_Realtek_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr) xil_printf("Start PHY autonegotiation \r\n"); XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET, XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control); XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control); while (1) { XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status); xil_printf("Waiting for PHY to complete autonegotiation.\r\n"); while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) { if (timeout_counter == 30) { XEmacPs_PhyRead(xemacpsp, phy_addr,IEEE_SPECIFIC_STATUS_REG, if (temp_speed == IEEE_SPEED_1000) return XST_FAILURE; |
main.c int main() #endif echo_netif = &server_netif; /* Define this board specific macro in order perform PHY reset on ZCU102 */ init_platform(); #if LWIP_IPV6==0 lwip_init(); #if (LWIP_IPV6 == 0) netif_create_ip6_linklocal_address(echo_netif, 1); print_ip6("\n\rBoard IPv6 address ", &echo_netif->ip6_addr[0].u_addr.ip6); #endif /* now enable interrupts */ /* specify that the network if is up */ #if (LWIP_IPV6 == 0) while(((echo_netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0)) if (dhcp_timoutcntr <= 0) { ipaddr.addr = echo_netif->ip_addr.addr; print_ip_settings(&ipaddr, &netmask, &gw); #endif /* receive and process packets */ /* never reached */ return 0; |
echo.c void print_app_header() int start_application() /* create new TCP PCB structure */ /* bind to specified @port */ /* we do not need any arguments to callback functions */ /* listen for connections */ /* specify callback to use for incoming connections */ xil_printf("TCP echo server started @ port %d\n\r", port); return 0; |
开发板的 MAC 地址00_0a_35_01_fe_c0,IP 地址 192.168.0.2,监听端口号 5000。 |
5. 板级验证
//具体的验证步骤就不重复啦,链接的PDF比较详细
//主要是参数修改要看清楚位置,橙色是文件,红色要修改或者复制