【常用通讯协议】—RS-485通讯协议
-------------------------------------------------------------------------------------------------------------------------------------
本文章参考原文链接:
通常将实现两个设备之间数据交换的功能称为通讯协议,通讯协议分硬件层协议和软件层协议。
硬件层协议决定数据如何传输问题,主要解决数据在物理媒介上的传输方式。比如要在设备1向设备2发送0x66,0x66的二进制数为0110 0110,这8个二进制数从设备1传输到设备2,其中涉及到1怎么传,0怎么传的问题,这就是硬件层要解决的问题。
硬件层协议目前常用的有RS-232、RS-485、SPI、[IIC](https://so.csdn.net/so/search?q=IIC&spm=1001.2101.3001.7020)等。比如RS-232规定,线上的电压为x伏都表示传输的是0,y伏传输的则是1。还有要选择多少条线传输数据,选择什么材质的线传输输入,也属于硬件层协议约束的。硬件层协议也叫接口协议
软件层协议指通讯双方在软件编码方面约定的通讯规则,比如说一个人说中文,另一个人也要说中文,两人才能进行交流;常见的软件层协议有Modbus协议、TCP/IP协议、GPRS等;而Modbus协议可以通过串口、RS-485、以太网等来传输。
可以这样理解:两个用中文(软件协议)交流的人,可以通过面对面、打电话、发短信等不同的方式(硬件协议)来通信
一、RS-485通讯协议
MCU管脚输出TTL电平,TTL电平是当MCU管脚输出0电平时,一般情况下电压是0V,当MCU管脚输出1电平时,电压是5V。
因TTL电平的是由一条信号线,一条地线产生,信号线上的干扰信号会跟随有效信号传送到接收端,使得有效信号受到干扰,
485通讯实际上是把MCU出来的TTL电平通过硬件层的一个电平转换芯片进行转换,把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给电平转换芯片输入低TTL电平时,电平转换芯片会使得B的电压比A的电压高,反之,A的电压比B的电压高。这样来看,485协议规约A,B两条电平线上差值为多少表示0或者1,所以说RS-485是硬件层协议。
485协议的接收端可能是另一个MCU,MCU管脚也只接受TTL电平,电平转换芯片过来的是两条线(A,B)的电压,所以需要对此两条线差分电压转换为TTL电平。
常用的电平转换芯片是MAX485。把TTL信号转为485信号,实质是一个集成芯片,无任何程序代码,纯粹硬件逻辑。同理,将485电平转为TTL也是如此。现在很多芯片把接收和转换都集成到一块IC,但是注意,转换器和接收器依旧是没有同时工作的。也就是半双工通讯。
二、半双工通讯
单工通讯是指数据只能朝着一个方向传输的通讯方式。
半双工通讯则是指对于通讯两端,不能同时相对方法发送数据,必须错开时间段发送。在发送的同时不能接收数据,在接收状态时,不能发送数据。
RS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。
485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正在传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。理解为,软件层协议就好像交通规则,它能让数据有序传输。
三、RS-485介绍
电子工业协会(EIA)于1983年制订并发布RS-485标准,并经通讯工业协会(TIA) 修订后命名为TIA/EIA-485-A,所以TIA/EIA-485-A才是真正的名字,因为人们已经叫习惯RS-485了。
RS-485标准是为弥补RS-232通信距离短、速率低等缺点而产生的。RS-485标准只规定了平衡发送器和接收器的电平特性,而没有规定接插件、传输电缆和应用层通信协议,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米
RS-485标准与RS-232不一样,数据信号采用差分传输方式,使用一对双绞线,将其中一线定义为A,另一线定义为B。
1、传输方式以及电平逻辑
RS-485传输方式:半双工通信、(逻辑1:+2V ~ +6V 逻辑0:-6V ~ -2V)这里的电平指**AB 两线间的电压差
2、节点连接示意图
因为大多数MCU的信号都是TTL信号,且数据是通过串口发送和接收,是不符合RS-485标准的,所以要将数据放在485通信线上传输的话,就要将TTL信号转为RS-485的差分信号,然后在AB线上传输,到达节点后再将RS-485的差分信号转换为TTL信号,给节点的MCU进行数据处理

3、RS-485数据链路示意图

主机发送给从机或者从机发送给主机,都会占用到A和B线,所以RS-485多用在半双工模式。
主机的GPIO会控制RS-485收发器的DE管脚,设置发送模式,从UART TXD线向RS-485收发器的数据(D或DI)线发送一个字节,收发器将在A和B线上将单端UART位流转换为差分位流,数据离开收发器后,主机立即将收发器的模式切换为接收模式。
从机控制RS-485收发器的/RE管脚,设置为接收模式,接收主机发送的比特流,将其转换为单端信号,通过从机的UART RXD线接收,当从机准备好响应时,它按主机原来的方式进行发送,而主机变为接收。
4、拓扑结构
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点。
RS-485总线同I2C,也是主从模式,支持点对点单从机模式,也支持多从机模式,不支持多主机模式

四、485电路原理图
1、RS-485收发器
RS-485是差分传输,如果用单片机控制RS-485接口的设备,需要用到收发器,如下是一个MCU控制一个RS-485的图示。


单片机MCU的标准串行口通过RXD直接连接MAX485芯片的RO引脚,通过TXD直接连接MAX485芯片的DI引脚。
让该芯片处于发送模式还是接收模式的选择位是DE/!RE,一般情况下把这两个引脚接在一起,只用微处理器的一个引脚控制
R14是上拉电阻,R16下拉,默认状态下将A拉高,B拉低,如果不加电阻,那默认情况下是不稳定的,会对单片机的引脚造成干扰
可以在最后输出端加上TVS管,环境恶劣时可加,做保护作用,平时实验可以不加

2、芯片内部
收发器内部是一个接收器(上半部分)加一个发送器(下半部分)

RS-485收发器内部结构
其中:
- A和B为总线;
- A:发送器输出/接收器输入反相
B:发送器输出/接收器输入反相
- R为接收器输入;
- RE为接收器使能信号;(低电平有效)
- DE为发送器使能信号;(高电平有效)
- D/DI为发送器输出;
对于使能信号,字母上面加一横的为低电平有效(如上图RE),不加的为高电平有效(如DE)。
如果单片机MCU输出的信号TNOW2为高电平,则芯片处于发送模式(发送器/驱动器),差分输出A和B遵循数据输入DI处的逻辑状态;
当DI为高电平时,导致A转为高,B转为低。定义为VOD=VA-VB的差分输出电压为正,也就是逻辑1(AB间的电压差为+2V ~ +6V);
当DI为低电平时,输出状态反转,B变高,A变低,VOD为负 ,为逻辑0(AB间的电压差为 -6V ~ -2V);
当DE低时,两个输出都变成高阻抗。在这种情况下,与D处的逻辑状态是不相关的。

4、接收功能真值表
如果单片机MCU输出的信号TNOW2为低电平,则芯片处于接收模式(接收器),如果为高电平,则关闭接收模式;
AB间的电平大于+200mv时,RO引脚输出逻辑1;
AB间的电平小于-200mv时,RO引脚输出逻辑0;
当AB间的电平处于-200mv ~ +200mv之间时,则表示不稳定

五、共模干扰问题
RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以。
长距离布线会有信号衰减,而且引入噪声和干扰的可能性更大,在线缆A和B上的表现就是电压幅度的变化,但是,采用差分线的好处就是,差值相减就会忽略掉干扰依旧能输出正常的信号,把这种差分接收器忽略两条信号线上相同电压的能力称为共模抑制。
如果在传输过程中遇到干扰,那A、B两根线的电压都会发生变化,可能本来A是5V,B是2V,被干扰成了A是8V,B是5V,但由于485通信检测的是两根线之间的电压差,所以AB间的电压差并没有发生改变,仍然是3V,所以接收器检测到的仍然是正确的信号
像串口和RS232这些单端的通信方式,因为只有一根信号线和一根地线,并会规定某个电平状态表示一种逻辑,如5V表示1,0V表示0,当在传输过程中发生干扰时,5V可能变成了2V,这时候就没法判断到底是1还是0了,导致传输的数据不正确

浙公网安备 33010602011771号