RS485实验

news2024/11/23 5:13:24

RS485实验

介绍

RS485采用差分信号进行传输,半双工通信。RS485是一个总线,在同一总线上最多可以挂接32个节点。通信流程简单理解为默认为接收状态,发送数据时切换为发送状态,数据发送完毕后切换为接收状态。发送和接收分别由一个引脚控制,且使能信号相反,可以由一个gpio去控制。下图是一个RS485的芯片,和芯片连接的一端有4个管腿儿,对外只有两条是差分线的。这里注意一下同时发送和接收,发送和接收可以同时使能接收的,发送的数据不仅会对外发,同时也接到了内部的接收器上,因此收发同时使能的话,在没有其他设备发送数据时,发送数据的时候会收到自己发送的数据。
RS485芯片结构在这里插入图片描述

从硬件设计上,可以看到还是有可能会有两个设备同时使用总线发送数据的情况,完成半双工通信的话还需要软件上去实现同步。百度了一些资料,发现没有统一的说法,但是看到了一个CSMA/CD(波侦听多路访问/冲突检测),以太网用的是这种方式。大致意思是发送的时候去监听,如果接收到的数据和发送到的数据不一致,说明和其他设备争用了总线,就随机等待一段时间后再发送。

FPGA代码分析

接收和发送数据还是基于之前的串口模块,RS485多了方向的控制。例子设计了一个握手协议,1起始字节(0x55)+1长度字节+有效数据,fpga收到后将数据返回回来,如果可以收到发送的数据表示握手成功。数据需要缓存,所以需要使用一个fifo来实现,接收到的有效数据放入到FIFO里面,之后将FIFO中的数据发送出去。
状态机设计如下:

	case(state)
		IDLE:	/* 空闲状态,进行一些初始化操作 */
		begin
			state 			<= RCV_HEAD;
			rs485_de 		<= 1'b0 ;
			rx_data_ready 	<= 1'b1 ;
		end
		RCV_HEAD:	/* 起始字节接收状态,等待起始字节的到来 */
		begin
			if (rx_data_valid == 1'b1 && rx_data == 8'h55)	//when received data is valid and data is 8'h55,it means the start of data
				state <= RCV_COUNT ;				
		end
		RCV_COUNT:	/* 数据长度接收状态,接收有效的数据长度,保存到一个计数器中 */
		begin
			if (rx_data_valid == 1'b1)	//record data counter
			begin
				if (rx_data > 0)		//if data counter bigger than 0, then goto receive data state or goto IDLE state
					state <= RCV_DATA ;		
				else
					state <= IDLE ;
					
				data_count <= rx_data ;
			end
		end
		RCV_DATA:	/* 数据接收状态,把数据放到fifo里面,这一要看下fifo的时序 */
		begin
			fifo_wren  <= rx_data_valid ;
			fifo_wdata <= rx_data ;
			
			if (rx_data_valid == 1'b1)
			begin
				if (rx_cnt == data_count - 1)	//the last received data
				begin
					rx_cnt 		<= 8'd0 ;
					rs485_de 	<= 1'b1 ;
					state  		<= WAIT ;
				end
				else
					rx_cnt <= rx_cnt + 1'b1 ;
			end
		end
		WAIT:	/* 等待状态,延时1ms */
		begin						
			fifo_wren  <= 1'b0 ;
			if (wait_cnt >= CLK_FRE * 1000) // wait for 1 ms for direction change
			begin
				wait_cnt <= 32'd0 ;
				state <= SEND_WAIT;
			end
			else
			begin
				wait_cnt <= wait_cnt + 32'd1;
			end
		end
		SEND_WAIT:	/* 数据发送等待状态,读取fifo数据 */
		begin		
			if (tx_data_ready == 1'b1)
			begin
				if (tx_cnt == data_count)			//the last data has transferred
				begin
					tx_cnt 			<= 8'd0 ;					
					fifo_rden		<= 1'b0 ;
					state 			<= IDLE ;
				end
				else
				begin
					fifo_rden		<= 1'b1 ;		//read data from fifo
					state 			<= SEND ;
				end
			end
			tx_data_valid 	<= 1'b0 ;
		end
		SEND:	/* 数据发送状态,发送数据 */
		begin
			fifo_rden		<= 1'b0 ;
			tx_data_valid 	<= 1'b1 ;
			
			if(tx_data_valid == 1'b1 && tx_data_ready == 1'b1 && tx_cnt < data_count)
			begin
				tx_cnt <= tx_cnt + 8'd1; //Send data counter
				state  <= SEND_WAIT ;
			end	
		end
		default:
			state <= IDLE;
	endcase

上板测试

没有485串口,不测试。

参考

  1. 原来RS-485这么简单?
  2. 图文详解RS-485,真的很详细了
  3. RS485能否从机向主机发出请求?冲突如何解决?

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

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

相关文章

01_什么是ansible、基本架构、ansible工作机制、Ansible安装、配置主机清单、设置SSH无密码登录等

1.什么是ansible 1.1.基本介绍 1.2.基本架构 1.3.基本特征 1.4.优点 1.5.ansible工作机制 2.Ansible安装 2.1.机器准备 2.2.安装ansible 2.2.1.安装epel源 2.2.2.安装ansible 2.2.3.查看ansible版本 2.2.4.树状结构展示文件夹 2.2.4.1.其中ansible.cfg的内容如下 2.2.4.2.host的…

SQL 相关子查询 和 不相关子查询、Exists 、Not Exists、 多表连接(包含自连接)

不相关子查询 子查询的查询条件不依赖于父查询&#xff0c;称不相关子查询。子查询可以单独运行的 select stu_id,sex,age from student t where sex(select sexfrom studentwhere stu_id10023 )相关子查询 关联子查询 子查询的查询条件依赖于父查询&#xff0c;称为 相关子…

C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究

C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究 code review! 文章目录 C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究1.传递对象的const引用——ClassB的实例只能访问ClassA的实例&#xff0c;但不会修改ClassA的实…

Python小白学习:超级详细的字典介绍(字典的定义、存储、修改、遍历元素和嵌套)

目录 一、字典简介1.1 创建字典1.2 访问字典中的值1.3 添加键值对1.4 修改字典中的值实例 1.5 删除键值对1.6 由多个类似对象组成的字典1.7 使用get()访问值1.8 练习题 二、遍历字典2.1 遍历所有键值对实例 2.2 遍历字典中的所有键2.3 按照特定顺序遍历字典中的所有键2.4 遍历字…

10_Pulsar跨机房复制、Pulsar跨机房复制

2.2.4.Pulsar跨机房复制 2.2.5.Pulsar跨机房复制 如何配置 2.2.4.Pulsar跨机房复制 在大型的分布式系统中&#xff0c;都会涉及到跨多个数据中心的需求&#xff0c;通常会使用跨地域复制机制提供额外的冗余防止服务无法正常运作。Apache Pulsar 的跨地域多机房互备特性&#…

Android 13 Hotseat定制化修改——001 hotseat布局方向

目录 一.背景 二.hotseat布局方向 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图…

接口测试——python接口开发(二)

目录 1. python接口开发框架Flask简介与安装 2. 使用Flask开发一个Get接口 3. 使用Flask开发一个Post接口 4. Flask结合PyMySQL接口与数据库的交互 1. python接口开发框架Flask简介与安装 Flask接口测试框架的简介与安装Flask是轻量级的web开发框架相比于其他框架&#xff…

Could not resolve host: mirrorlist.centos.org; Unknown error解决方法

今天服务器安装完CentOS系统后&#xff0c;安装网络的时候&#xff0c;出现无法联网yum yum -y install net-tools 以上代码无法运行并报错&#xff0c;这里我要提醒大家&#xff0c;如果在初始安装的时候选中安装网络工具模块就不用在安装net-tools了&#xff0c;因为我选中…

CycleGAN论文解读及代码实现

paper: https://arxiv.org/pdf/1703.10593.pdf github: https://github.com/aitorzip/PyTorch-CycleGAN 1 cycleGAN 小结 网络&#xff1a; 生成器2个&#xff1a;G_A&#xff0c;G_B 判别器两个&#xff1a; D_A&#xff0c;D_B损失函数8个 6个生成器损失函数 2个判别器损失…

Freemarker:生成HTML文本文件

前置工作参考&#xff1a; Freemarker&#xff1a;基本使用_moreCalm的博客-CSDN博客 1、修改application.yml配置文件 server:port: 8881 #服务端口 spring:application:name: freemarker-demo #指定服务名freemarker:cache: false #关闭模板缓存&#xff0c;方便测试settin…

leetcode904. 水果成篮(java)

水果成篮 leetcode904. 水果成篮题目描述滑动窗口代码演示 回溯算法 leetcode904. 水果成篮 难度 - 中等 leetcode 904 水果成蓝 题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树…

PPG心率血氧检测健康型沙发方案

《中国心血管健康与疾病报告2021》数据显示&#xff0c;我国心血管病患病人数已达 3.3 亿。目前&#xff0c;心脑血管病 死亡占城乡居民总死亡原因的首位&#xff0c;农村为46.7%&#xff0c;城市为44%。老年人是心脑血管病的主要发病体&#xff0c;老年 人患心脑血管病的几率较…

jmeter测试rpc接口-使用dubbo框架调用【杭州多测师_王sir】

1.基于SOAP架构。基于XML规范。基于WebService协议。特点:接口地址?wsdl结尾2.基于RPC架构&#xff0c;基于dubbo协议&#xff0c;thrift协议。SpringCloud微服务。3.基于RestFul架构&#xff0c;基于json规范。基于http协议(我们常用的都是这种&#xff0c;cms平台也是) Rest…

【数据分享】2000-2022年我国乡镇人口数量数据(免费获取/Shp/Excel格式)

在之前的文章中我们分享了基于LandScan数据集的2000-2022年的1km精度的全球、全国、分省、分市的人口空间分布栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;。以及基于栅格数据处理出的Shp和Excel两种格式的我国省市县三级的2000-2022年度的人口数量数据&#xff…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

photoshop生成器引入到electron项目(electron与photoshop建立通信)

Photoshop引入了nodejs&#xff0c;在启动的时候&#xff0c;通过pipe调起nodejs运行时核心generator-builtin&#xff0c;通过KLVR机制与ps进行通信和交互&#xff0c;同时会加载用户编写的扩展。 这里记录一下引入时的踩坑过程 generator-core就是它的源码&#xff0c;elect…

【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON

问题背景 这个报错发生在之前部署的一个前后端分离的项目中。后端使用的Spring Boot&#xff0c;前端使用的JavaScript&#xff0c;前后端交互使用Thymeleaf框架。 现象 项目组的另一个小伙伴说&#xff0c;突然有个页面打不开了&#xff0c;整个页面全空白。我F12打开浏览器…

JAVA集合框架 一:Collection(LIst,Set)和Iterator(迭代器)

目录 一、Java 集合框架体系 1.Collection接口&#xff1a;用于存储一个一个的数据&#xff0c;也称单列数据集合&#xff08;single&#xff09;。 2.Map接口&#xff1a;用于存储具有映射关系“key-value对”的集合&#xff08;couple&#xff09; 3.Iterator接口&#…

pycharm的Terminal中如何设置打开anaconda3的虚拟环境

在pycharm的File -> Settings -> Tools -> Terminal下面&#xff0c;如下图所示 修改为红框中内容&#xff0c;然后关闭终端在重新打开终端&#xff0c;即可看到anaconda3的虚拟环境就已经会被更新

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

&#x1f989; AI新闻 &#x1f680; 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要&#xff1a;微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能&#xff0c;允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度&#xff0c;然…