FPGA控制W5500完成UDP环回测试

news2024/11/24 13:04:18

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 begin
		case(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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_dat<=o_dat;
			WRRCR_CMD,WR_RCR:
				o_dat<=8'h08;
			WRPHY_CMD,WR_PHY:
				o_dat<=8'b11111111;
			default:o_dat<=8'h00;
		endcase
	end

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 begin
		case(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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_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:;
					endcase
				else
					o_dat<=o_dat;
			WR_MSSR:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=8'h05;		
						'd01:o_dat<=8'hB4;
						default:;
					endcase
				else
					o_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 begin
		case(state)
			WR_RXRD:	
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=rx_ptr[15:08];		
						'd01:o_dat<=rx_ptr[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_CR:
				o_dat<=8'h40;		
			default:o_dat<=o_dat;
		endcase
	end
	
always@(posedge clk,negedge rst_n)
	if(!rst_n)
		rx_ptr<='d0;
	else begin
		case(state)
				RD_RXRD:
					if(rdrxrd_vld)
						rx_ptr<=dinr;
					else
						rx_ptr<=rx_ptr;
				RD_RXBUF:
					if(den)
						rx_ptr<=rx_ptr+'d1;
					else
						rx_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 begin
		case(state)
			IDLE:
				if(rxdat_end && waddr>'d0)
					state<=RDDAT_PRE;
				else
					state<=IDLE;
			RDDAT_PRE:
				state<=RD_DAT;
			RD_DAT:
				if(dat_tx_end)
					state<=END;
				else 
					state<=RD_DAT;
			END:state<=IDLE;
			default:state<=IDLE;
		endcase
	end

always@(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;	
	else
		o_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.coloradmin.cn/o/51035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RKMEDIA--VO的使用

这一节主要说说rkmedia vo模块的使用。 rkmedia的vo是对DRM接口的封装&#xff0c;提供给用户更方便的使用&#xff0c;rv1126/rv1109支持两个vo图层。 1、首先先介绍一下DRM的测试命令--modetest&#xff0c;用来确认当前屏幕能够正常点亮。 modetest -M rockchip //打印出…

融云艾瑞发布《政企数智办公平台行业研究报告》,解读数智化时代的办公新趋势

关注公众号文章扫码报名融云&艾瑞“政企数智办公报告及新品发布会” 近期&#xff0c;安全可信的通信云服务商融云&#xff0c;携手业内权威研究机构艾瑞咨询联合发布《2022 年中国政企数智办公平台行业研究报告》&#xff08;下简称《报告》&#xff09;&#xff0c;回顾政…

Kotlin高仿微信-第28篇-朋友圈-预览图片、预览小视频

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

ios照片误删怎么恢复,iphone已经删除的照片怎么恢复

苹果手机里面的重要照片被删除了&#xff0c;相信很多人都比较着急&#xff0c;想要想办法找回来。ios照片误删怎么恢复&#xff1f; 方法1.通过“最近删除”恢复照片 苹果删除的照片如何恢复&#xff1f;一般情况下&#xff0c;从苹果手机刚删除的照片会暂存在“最近删除”这…

使用MAT分析线上问题实战

概述 MAT&#xff0c;下载地址&#xff0c;Eclipse Memory Analysis Tools&#xff0c;一个分析Java堆数据的专业工具&#xff0c;可以计算出内存中对象的实例数量、占用空间大小、引用关系等&#xff0c;可得知哪些线程阻止垃圾收集器的回收工作&#xff0c;从而定位内存泄漏…

如何低成本减少企业知识流失?天翎知识文档系统+群晖NAS值得一试

编者按&#xff1a;知识管理可以减少企业知识流失&#xff0c;有效提高企业员工工作水平&#xff0c;增强企业综合竞争力。如何小成本做好企业知识管理呢&#xff1f;天翎知识文档系统群晖NAS值得一试。 关键词&#xff1a;标签分类&#xff0c;权限管理&#xff0c;在线预览&…

Git学习

Git是什么 Github作为最大的代码托管平台&#xff0c;是基于Git开发的 Git是最优秀的版本控制工具 iCode是基于Git的代码托管平台 版本控制&#xff1a;是对软件开发过程中各种程序代码&#xff0c;配置文件&#xff0c;说明文档等。 版本控制系统&#xff1a;集中式、分布式 …

在Mac中管理多版本 java——安装和使用 jenv

jenv 的 github 地址:https://github.com/jenv/jenv 安装 $ brew install jenv安装成功后需要进行一下简单的配置,让它可以起作用 使用Bash的情况$ echo export PATH="$HOME/.jenv/bin:$PATH" >> ~/.bash_profile $ echo eval "$(jenv init -)" &…

MAC 搭建vue开发环境,配置环境变量

1.官网下载nodejs安装包 http://nodejs.p2hp.com/ 下载完成后安装&#xff0c;一直点击下一步即可 2.自定以配置全局模块路径和缓存路径 先自己找一个路径创建两个文件夹&#xff0c;node_cache 和 node_global 打开终端&#xff0c;执行一下俩条命令,注意引号中的路径要换…

图纸识别自动生成BOM清单的方法

01 方案应用领域及行业 高端装备制造业行业、离散型制造业、电气机械和器材制造业等。 02 方案应用场景 某特变电工公司是国内输变电行业的核心骨干企业&#xff0c;每年生产产能巨大&#xff0c;拥有海量的技术图纸&#xff0c;因此技术人员人工拆解设计图纸的工作难度系数大…

【优化调度】基于改进遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)

目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 本文对当前公交企业调度系统进行了分析&#xff0c;建立了公交排班的数学模型。本文基于数据挖掘分析的结果上&#xff0c;使用截面客流量数据对模型进行约束&#xff0c;得出了公交客流出行的空间分布规律。再以…

软件测试1

这里写自定义目录标题软件测试的定义1、软件测试的目的2、软件测试的要求3、测试与开发的模型3.1 测试的工作流程3.2 开发模型3.2.1 瀑布模型3.2.2 增量模型3.2.3 快速模型3.2.4 其他模型3.3 测试模型4、测试与开发的关系5、软件测试分类软件测试的定义 找Bug,发现缺陷。使用人…

全球科学家给孩子的stem课【001-046】mp3合集

全球科学家给孩子的stem课【001-046】mp3合集&#xff0c;适合给孩子们启蒙教育使用。 一只蚂蚁走丢后的8种可能结局.mp3 下雨天清爽的味道&#xff0c;来自尸体和臭气.mp3 为什么光的三原色是红绿蓝&#xff0c;绘画的三原色又成了红黄蓝&#xff1f;.mp3 为什么剖腹产的孩子…

患有癌症的心力衰竭患者LVAD植入前景可期

相关调查显示&#xff0c;患有终末期心力衰竭的癌症患者&#xff08;有癌症史&#xff09;正在增加&#xff0c;但其进行心脏移植的可能性不大&#xff0c;而左心室辅助装置&#xff08;LVAD&#xff09;是一种可选择的替代策略。近日&#xff0c;发表于Circulation: Heart Fai…

[附源码]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…

Kotlin高仿微信-第27篇-朋友圈-相册选择图片或小视频

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

ContentProvider启动流程分析

文章目录1.ActivityThread.handleBindApplication()2.ActivityThread.installContentProviders()3.ActivityThread.installProvider()4.AppComponentFactory.instantiateProvider()5.ActivityManagerService.publishContentProviders()6.ContentProviderHelper.publishContentP…

基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

[附源码]计算机毕业设计springboot汽车租赁管理系统

项目运行 环境配置&#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…

项目的坎坷一生

一、从产品到项目 项目的定义&#xff1a;只会进行一次&#xff0c;包含多项互相关联的任务&#xff0c;并且有绩效、时间、成本和范围限制的一项工作。 产品是解决某个问题的东西&#xff0c;项目是一个过程。 1、做产品VS做项目 ①从生命周期角度区别 做产品的生命周期相…