FPGA控制W5500完成UDP环回测试

news/2024/5/3 7:39:50/文章来源:https://blog.csdn.net/changshengxiao/article/details/128124140

FPGA控制W5500完成UDP环回测试

  • 1 前言
  • 2 前期准备
  • 3 W5500寄存器描述
  • 4 W5500 环回测试
    • 4.1 W5500初始化
      • 4.1.1 通用寄存器初始化
      • 4.1.2 socket寄存器初始化
    • 4.2 W5500数据接收
    • 4.3 W5500数据发送
    • 4.4 数据环回
  • 5 总结

1 前言

本文针对已经对W5500有一定了解,并且数据手册已经通读一遍的人群,因为博主目前只完成了UDP环回测试,因此在后文可能只介绍有关UDP部分。

2 前期准备

1.FPGA核心板或者开发板;
2.W5500模块。下图是博主使用的模块;
在这里插入图片描述
3.网络调试助手,网上随便找一个就行;

3 W5500寄存器描述

主机与W5500通信有固定协议(数据帧),主机先发两个字节的寄存器地址,然后一个字节的控制字,最后是数据,这个数据可以是一个字节,也可以是N的字节,但是W5000为了方便操作,可以将这个N分为1、2、4和可变长度,这些都可以配置。下图是数据帧格式。
在这里插入图片描述
下图是控制字段寄存器,BSB4~BSB0选择寄存器,RWB是读写选择位(1:写 0:读),OM选择数据段中N的字节数。
在这里插入图片描述

W5500的寄存器分为两种,一是通用寄存器,二是socket寄存器。这两种寄存器通过数据帧中的地址段来选择,如下图所示。例如,当寄存器地址为16’h0000时,如果BSB是5‘h00000,那么此时选择的是通用寄存器中的MR寄存器;如果BSB是5‘h00001,那么此时选择的是socket0寄存器中的Sn_MR寄存器。
在这里插入图片描述

4 W5500 环回测试

4.1 W5500初始化

4.1.1 通用寄存器初始化

通用寄存器的初始化就是配置源网关、子网掩码、MAC地址,IP地址、PHY寄存器,然后清中断。

always@(posedge clk,negedge rst_n)if(!rst_n)o_dat<='d0;else begincase(state)WR_MR://WRMR_CMD,o_dat<=8'h00;WRGAR_CMD,WR_GAR:if(rdreq)case(cnt_byte)'d00:o_dat<=GAR[31:24];'d01:o_dat<=GAR[23:16];'d02:o_dat<=GAR[15:08];'d03:o_dat<=GAR[07:00];default:;endcaseelseo_dat<=o_dat;WR_SUBR://WRSUBR_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=SUBR[31:24];'d01:o_dat<=SUBR[23:16];'d02:o_dat<=SUBR[15:08];'d03:o_dat<=SUBR[07:00];default:;endcaseelseo_dat<=o_dat;WR_SHAR://WRSHAR_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=SHAR[47:40];'d01:o_dat<=SHAR[39:32];'d02:o_dat<=SHAR[31:24];'d03:o_dat<=SHAR[23:16];'d04:o_dat<=SHAR[15:08];'d05:o_dat<=SHAR[07:00];							default:;endcaseelseo_dat<=o_dat;	WR_IP://WRIP_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=SIPR[31:24];'d01:o_dat<=SIPR[23:16];'d02:o_dat<=SIPR[15:08];'d03:o_dat<=SIPR[07:00];default:;endcaseelseo_dat<=o_dat;WRIR_CMD,WR_IR,WRIMR_CMD,WR_IMR:o_dat<=8'hFF;WR_RTR://WRRTR_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=8'h07;'d01:o_dat<=8'hD0;default:;endcaseelseo_dat<=o_dat;WRRCR_CMD,WR_RCR:o_dat<=8'h08;WRPHY_CMD,WR_PHY:o_dat<=8'b11111111;default:o_dat<=8'h00;endcaseend

4.1.2 socket寄存器初始化

socket寄存器配置跟通用寄存器类似,先配置目的socket模式(TCP、UDP、MACRAW)、MAC地址、目的IP地址、目的端口、以及本地端口等寄存器,然后清中断等,最后配置Sn_CR寄存器打开端口,之后就是定时查询SN_SR寄存器,等待socket初始化成功(Sn_SR寄存器值为8’h22)。

always@(posedge clk,negedge rst_n)if(!rst_n)o_dat<='d0;	else begincase(state)WR_MR:o_dat<=8'h02;WR_IR,WR_IMR:o_dat<=8'hFF;WR_PORT:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_PORT[15:08];		'd01:o_dat<=SN_PORT[07:00];default:;endcaseelseo_dat<=o_dat;WR_DHAR:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DSHAR[47:40];		'd01:o_dat<=SN_DSHAR[39:32];'d02:o_dat<=SN_DSHAR[31:24];		'd03:o_dat<=SN_DSHAR[23:16];'d04:o_dat<=SN_DSHAR[15:08];		'd05:o_dat<=SN_DSHAR[07:00];							default:;endcaseelseo_dat<=o_dat;WR_DIPR:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DIP[31:24];		'd01:o_dat<=SN_DIP[23:16];'d02:o_dat<=SN_DIP[15:08];		'd03:o_dat<=SN_DIP[07:00];						default:;endcaseelseo_dat<=o_dat;WR_DPORT:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DPORT[15:08];		'd01:o_dat<=SN_DPORT[07:00];default:;endcaseelseo_dat<=o_dat;WR_MSSR:if(rdreq)case(cnt_byte)'d00:o_dat<=8'h05;		'd01:o_dat<=8'hB4;default:;endcaseelseo_dat<=o_dat;		WR_CR:o_dat<=8'h01;		default:;endcase	end

4.2 W5500数据接收

软件一直在查询Sn_RX_RSR寄存器(Socket n 空闲接收缓存寄存器),显示了 Socket n 接收缓存中已接收和保存的数据大小,当其值大于0时,表明socket已经接收到数据,因此可以进行数据接收流程。W5500数据手册提供了一种数据读取的方法,如下图所示。
在这里插入图片描述
socket的接收缓存(RX_BUF)有两个指针,一是写指针(Sn_RX_WR)二是读指针(Sn_RX_RD),当外部将UDP数据发送给W5500时,Sn_RX_WR会自动增加,因此Sn_RX_WR是W5500芯片控制的。Sn_RX_RD由用户控制,控制流程如上图所示。

always@(posedge clk,negedge rst_n)if(!rst_n)o_dat<='d0;else begincase(state)WR_RXRD:	if(rdreq)case(cnt_byte)'d00:o_dat<=rx_ptr[15:08];		'd01:o_dat<=rx_ptr[07:00];default:;endcaseelseo_dat<=o_dat;WR_CR:o_dat<=8'h40;		default:o_dat<=o_dat;endcaseendalways@(posedge clk,negedge rst_n)if(!rst_n)rx_ptr<='d0;else begincase(state)RD_RXRD:if(rdrxrd_vld)rx_ptr<=dinr;elserx_ptr<=rx_ptr;RD_RXBUF:if(den)rx_ptr<=rx_ptr+'d1;elserx_ptr<=rx_ptr;
//				END:
//					rx_ptr<='d0;default:rx_ptr<=rx_ptr;endcase	end

4.3 W5500数据发送

软件进入数据发送流程时,先查询W5500的发送缓存剩余空间大小,如果剩余空间大于用户发送数据长度,那么继续后续流程,反之则拒绝发送用户数据。同样,手册也提供了一种数据发送的方法,如下图所示。
在这里插入图片描述

4.4 数据环回

软件例化例一个ram来存储收到的数据,接收完成后将数据读出然后发送,代码如下:

always@(posedge clk,negedge rst_n)if(!rst_n)state<='d0;else begincase(state)IDLE:if(rxdat_end && waddr>'d0)state<=RDDAT_PRE;elsestate<=IDLE;RDDAT_PRE:state<=RD_DAT;RD_DAT:if(dat_tx_end)state<=END;else state<=RD_DAT;END:state<=IDLE;default:state<=IDLE;endcaseendalways@(posedge clk,negedge rst_n)if(!rst_n)dat_len<='d0;else if(state==RDDAT_PRE)dat_len<=waddr;always@(posedge clk,negedge rst_n)if(!rst_n)o_dat_tx_req<='d0;else	if(state==RDDAT_PRE)o_dat_tx_req<='d1;else	if(state==END)o_dat_tx_req<='d0;	elseo_dat_tx_req<=o_dat_tx_req;always@(posedge clk,negedge rst_n)if(!rst_n)waddr<='d0;		else if(rxdat_vld)waddr<=waddr+'d1;else if(state==END)	waddr<='d0;	always@(posedge clk,negedge rst_n)if(!rst_n)raddr<='d0;		else if(dat_tx_rden)raddr<=raddr+'d1;else if(state==END)	raddr<='d0;			my_ram	my_ram_inst (.clock 			( clk 			),.wren 			( rxdat_vld		),.wraddress 		( waddr 		),.data 			( rxdat 		),.rden 			( dat_tx_rden 	),.rdaddress 		( raddr 		),.q 				( o_dat 		));assign 	o_dat_len	=dat_len;

最后测试结果如下图所示,包含wireshark抓包结果。
Alt

5 总结

W5500的UDP通信是不难的,只要初始化正确,然后在收发时正确读写socket寄存器,然后就没啥难度了,手册的话还是要多看几遍,博主是在官网下载中文手册, W5500官网(手册、参考电路、驱动固件、例程等),完整代码及工程放在评论区。
博主在完成UDP环回测试后还尝试进行TCP测试验证,W5500作为客户端,但是在配置完成后发现W5500都没有发出ARP包,后来就没有测了,暂时先放下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228408.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android: SimpleAdapter+GridView 简单图片展示

1&#xff1a;原理解析&#xff1a; 一个xml放总布局&#xff0c;一个xml放适配器要加载的模板&#xff08;我喜欢这样理解&#xff09;&#xff1b; java中写适配事件&#xff1b; 2&#xff1a;目录&#xff1a; 3&#xff1a;主布局&#xff1a;最重要的是要放一个GridView …

ByteX-shrink_r源码解析

背景 为什么要对R文件内联处理&#xff1f; 这里首先说一下Android R文件的产生&#xff0c;对于Android开发者我们都知道&#xff0c;当我们要使用要使用一些布局文件&#xff0c;drawable等其他资源时&#xff0c;可以直接用 R.id. R.drawble.等直接使用&#xff0c;而这个…

易基因科技|单细胞甲基化测序低至2500元/样

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。12月活动来袭&#xff5e; 限时特惠&#xff01;单细胞甲基化测序低至2500元/样&#xff01; 易基因高通量单细胞DNA甲基化测序&#xff1a;单细胞DNA甲基化组学研究很大程度上受制于建库…

定时执行专家 —— 使用网络唤醒功能实现远程开机

目录 ◆ 关于网络唤醒 ◆ 定时执行专家 - 远程开机功能 - 设置方法 ◆ 使用网络唤醒实现远程开机的一些前提条件 ◆ 关于网络唤醒 Wake-on-LAN简称WOL或WoL&#xff0c;中文多译为“网上唤醒”、“远程唤醒”技术。WOL是一种技术&#xff0c;同时也是该技术的规范标准&…

CSS自定义属性与前端页面的主题切换

基于级联变量的CSS自定义属性&#xff0c;已经出来很多年了。 虽然有less、sass等预处理器大行其道&#xff0c;但是自定义属性也有它的特点和用处&#xff0c;诸如在js中读写、作用域设置等等&#xff0c;在处理UI主题切换等功能上也发挥着很大的作用。 自定义属性 CSS自定义…

[附源码]SSM计算机毕业设计学习资源共享与在线学习系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux驱动: rtc子系统

1. 前言 限于作者能力水平&#xff0c;本文可能存在的谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文分析代码基于Linux 3.10内核&#xff0c;硬件平台为嵌入式ARM32平台. 3. rtc子系统 3.1 相关代码文件列表 drivers/rtc/class.c …

Lactoferrin-PEG-alginate 乳铁蛋白-聚乙二醇-海藻酸钠

产品名称&#xff1a;乳铁蛋白-聚乙二醇-海藻酸钠 英文名称&#xff1a;Lactoferrin-PEG-alginate 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、…

Redis高级篇——Redis的优化

一、Redis的键值设计 1.1key的结构 Redis的Key在自定义时&#xff0c;最好遵循以下三个规则&#xff1a; 基本格式&#xff1a;[业务名称]&#xff1a;[数据名]&#xff1a;[id]长度不超过44字节不包含特殊字符 如&#xff1a;登录业务&#xff0c;保存用户信息的key 定义为…

python常用代码总结2

1、列表的常规追加元素、追加列表操作 (1)列表追加多个元素&#xff0c;比如追加0-9 ls [] ls.extend(list(range(10)))ls Out[20]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (2)列表追加多个相同的元素&#xff0c;比如追加10个0 ls1 [] for i in range(10):ls1.append(0)ls1 Ou…

直播邀请函 | 第12届亚洲知识产权营商论坛:共建创新价值 开拓崭新领域

由香港特别行政区政府、香港贸易发展局及香港设计中心共同举办的亚洲知识产权营商论坛&#xff0c;每年为世界各地知识产权业界专家、商界领袖提供一个理想平台&#xff0c;共同探讨亚洲知识产权市场的最新发展&#xff0c;发掘更多商机。 去年&#xff0c;论坛共邀请70余位国…

聚观早报 | 中国茶申遗成功;特斯拉市值蒸发4个推特

今日要闻&#xff1a;中国茶申遗成功&#xff1b;特斯拉市值蒸发4个推特&#xff1b;iPhone14Pro出货量预期下调&#xff1b;FF91距交付仅剩一步之遥&#xff1b;AI绘画一天新增60万用户中国茶申遗成功 11月29日晚&#xff0c;我国申报的“中国传统制茶技艺及其相关习俗”在摩洛…

[附源码]JAVA毕业设计高速公路服务区管理系统(系统+LW)

[附源码]JAVA毕业设计高速公路服务区管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

最全面的Spring教程(五)——文件上传与下载

前言 本文为 【SpringMVC教程】文件上传与下载 相关知识&#xff0c;具体将对使用MultipartResolver处理文件上传的步骤&#xff0c;两种文件下载方式&#xff08;直接向response的输出流中写入对应的文件流、使用 ResponseEntity<byte[]>来向前端返回文件&#xff09;等…

智慧城市运营中心建设方案(SCOC)智慧城市的心脏

一、大数据&#xff1a;智慧城市的基础与引擎 中国每天正以消失100个村庄的速度快速步入城镇化&#xff0c;未来10年内将有5亿以上的人涌入城市。这无疑会给城市的建设带来巨大的压力&#xff0c;城市资源有限&#xff0c;规模不可能无限扩张&#xff0c;城市在就业、教育、住房…

HashMap底层数据结构,扩容机制

HashMap的底层结构是数组链表 没有哈希冲突的元素放在数组里面&#xff0c; 哈希冲突的元素用链表串起来 初始数组长度是16&#xff0c;对应源码&#xff1a; static final int DEFAULT_INITIAL_CAPACITY1; 最大的容量为2的30次方&#xff0c;一个很大很大很大的数 还定义了…

多个JDK版本可以吗:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂

多个版本JDK切换 多个JDK&#xff1a;JDK17、JDK19、JDK1.8轻松切换&#xff08;无坑版&#xff09;小白也可以看懂 提示&#xff1a;看了网上很多教程&#xff0c;5w观看、32w观看、几千观看的&#xff0c;多多少少带点坑&#xff0c;这里我就把踩过的坑都给抹了 文章目录多个…

【数据结构】二叉树的运算

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ******…

极值分析:分块极大值BLOCK-MAXIMA、阈值超额法、广义帕累托分布GPD拟合降雨数据时间序列...

全文链接&#xff1a;http://tecdat.cn/?p25348 你们可能知道&#xff0c;实际极值分析有两种常用方法&#xff1a;分块极大值Block-maxima、阈值超额法threshold excess&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。今天&#xff0c;我们将分别介绍这两种…

【毕业设计】10-基于单片机的车站安检门_磁性霍尔传感器系统设计(原理图+源码+仿真工程+答辩论文)

【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程答辩论文&#xff09; 文章目录【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程答辩论文&#xff09;任务书设计说明书摘要设计框架…