RS485

RS485接口组成的半双工网络,一般是两线制,多采用屏蔽双绞线传输,这种接线方式为总线式拓扑结构在同一总线上最多可以挂接32个结点。我们知道,最初数据是模拟信号输出简单过程量,后来仪表接口是RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,随后出现的RS485解决了这个问题。为此本文通过问答的形式详细介绍RS485接口。

一、什么是RS-485接口?它比RS-232-C接口相比有何特点?

答:由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点:

(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。

(2)传输速率较低,在异步传输时,波特率为20Kbps。

(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。针对RS-232-C的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:

1)RS-485的电气特性:逻辑“1”以两线间的电压差为+(2-6)V表示;逻辑“0”以两线间的电压差为-(2-6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。

2)RS-485的数据最高传输速率为10Mbps

3)RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。

4)RS-485接口的最大传输距离标准值为4000英尺,实际上可达3000米,另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。

5)因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。

二、RS-485串行接口标准

由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信。

而采用四线连接时只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。

RS-485最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

RS-485需要2个终接电阻,其阻值要求等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输总线的两端。

三、RS-485的网络安装注意要点

RS-485可支持32个节点,多节点构成网络。网络拓扑一般采用终端匹配的总线型结构,不支持环形或星形网络。在构建网络时,应注意如下几点:

1、采用一条双绞线电缆作总线,将各个节点串接起来,从总线到每个节点的引出线长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。所示为实际应用中常见的一些错误连接方式(a,c,e)和正确的连接方式(b,d,f)。a,c,e这三种网络连接尽管不正确,在短距离、低速率仍可能正常工作,但随着通信距离的延长或通信速率的提高,其不良影响会越来越严重,主要原因是信号在各支路末端反射后与原信号叠加,会造成信号质量下降。

2、应注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。下列几种情况易产生这种不连续性:总线的不同区段采用了不同电缆,或某一段总线上有过多收发器紧靠在一起安装,再者是过长的分支线引出到总线。

总之,应该提供一条单一、连续的信号通道作为总线。

四、RS-485传输线上匹配的一些说明

对RS-485总线网络一般要使用终接电阻进行匹配。但在短距离与低速率下可以不用考虑终端匹配。那么在什么情况下不用考虑匹配呢?理论上,在每个接收数据信号的中点进行采样时,只要反射信号在开始采样时衰减到足够低就可以不考虑匹配。

一般终端匹配采用终接电阻方法,RS-485应在总线电缆的开始和末端都需并接终接电阻。终接电阻一般在取120Ω。相当于电缆特性阻抗的电阻,因为大多数双绞线电缆特性阻抗大约在100~120Ω。这种匹配方法简单有效,但有一个缺点,匹配电阻要消耗较大功率,对于功耗限制比较严格的系统不太适合。

另外一种比较省电的匹配方式是RC匹配,利用一只电容C隔断直流成分可以节省大部分功率。但电容C的取值是个难点,需要在功耗和匹配质量间进行折衷。

还有一种采用二极管的匹配方法,这种方案虽未实现真正的“匹配”,但它利用二极管的钳位作用能迅速削弱反射信号,达到改善信号质量的目的。节能效果显著。

五、RS-485的接地问题

电子系统接地是很重要的,但常常被忽视。接地处理不当往往会导致电子系统不能稳定工作甚至危及系统安全。RS-485传输网络的接地同样也是很重要的,因为接地系统不合理会影响整个网络的稳定性,尤其是在工作环境比较恶劣和传输距离较远的情况下,对于接地的要求更为严格。

六、采用RS485接口时,传输电缆的长度如何考虑?

在使用RS485接口时,对于特定的传输线经,从发生器到负载其数据信号传输所允许的最大电缆长度是数据信号速率的函数,这个长度数据主要是受信号失真及噪声等影响所限制。最大电缆长度与信号速率的关系曲线是使用24AWG铜芯双绞电话电缆(线径为0.51mm),线间旁路电容为52。5PF/M,终端负载电阻为100欧时所得出。当数据信号速率降低到90Kbit/S以下时,假定最大允许的信号损失为6dBV时,则电缆长度被限制在1200M。在实用时是完全可以取得比它大的电缆长度。当使用不同线径的电缆。则取得的最大电缆长度是不相同的。

七、如何实现RS-485/422多点通讯

RS-485总线上任何时候只能有一发送器发送。半双工方式,主从只能一个发。全双工方式,主站总可发送,从站只能有一个发送。

八、RS-485接口通讯时,在什么条件下需要采用终端匹配?电阻值如何确定?如何配置终端匹配电阻?

在长线信号传输时,一般为了避免信号的反射和回波,需要在接收端接入终端匹配电阻。其终端匹配电阻值取决于电缆的阻抗特性,与电缆的长度无关。

RS-485一般采用双绞线(屏蔽或非屏蔽)连接,终端电阻一般介于100至140Ω之间,典型值为120Ω。在实际配置时,在电缆的两个终端节点上,即最近端和最远端,各接入一个终端电阻,而处于中间部分的节点则不能接入终端电阻,否则将导致通讯出错。

九、RS-485网不知道最远站点是哪一个,应该如何接匹配电阻呢?

会出现这种情况,是由于用户组成RS-485网时,没有遵循站点至总线的连线应尽可能短的原则。如果总线布线遵循这一原则,就不存在不知道哪个站点是最远的问题。而且要注意,这样的布线,系统将会工作得不好。

十、RS-485接口为何在停止通信时接收器仍有数据输出?

由于RS-485在发送数据完成后,要求所有的发送使能控制信号关闭且保持接收使能有效,此时,总线驱动器进入高阻状态且接收器能够监测总线上是否有新的通信数据。但是由于此时总线处于无源驱动状态(若总线有终端匹配电阻时,A和B线的差分电平为0,接收器的输出不确定,且对AB线上的差分信号的变化很敏感;若无终端匹配,则总线处于高阻态,接收器的输出不确定),容易受到外界的噪声干扰。当噪声电压超过输入信号门限时(典型值±200mV),接收器将输出数据,导致对应的UART接收无效的数据,使紧接着的正常通讯出错;另外一种情况可能发生在打开/关闭发送使能控制的瞬间,使接收器输出信号,也会导致UART错误地接收。

解决方法:

1)在通讯总线上采用同相输入端上拉(A线)、反相输入端下拉(B线)的方法对总线进行钳位,保证接收器输出为固定的“1”电平;

2)采用内置防故障模式的MAX308x系列的接口产品替换该接口电路;

3)通过软件方式消除,即在通信数据包内增加2-5个起始同步字节,只有在满足同步头后才开始真正的数据通讯。

十一、影响RS-485总线通讯速度和通信可靠性的三个因素

1、在通信电缆中的信号反射

在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射,如图1所示。

这种信号反射的原理,与光从一种媒质进入另一种媒质要引起反射是相似的。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻从理论上分析,在传输电缆的末端只要跨接了与电缆特性阻抗相匹配的终端电阻,就再也不会出现信号反射现象。

但是,在实现应用中,由于传输电缆的特性阻抗与通讯波特率等应用环境有关,特性阻抗不可能与终端电阻完全相等,因此或多或少的信号反射还会存在。

引起信号反射的另个原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。

信号反射对数据传输的影响,归根结底是因为反射信号触发了接收器输入端的比较器,使接收器收到了错误的信号,导致CRC校验错误或整个数据帧错误。

十二、RS-485总线的负载能力和通讯电缆长度之间的关系

在设计RS-485总线组成的网络配置(总线长度和带负载个数)时,应该考虑到三个参数:纯阻性负载、信号衰减和噪声容限。纯阻性负载、信号衰减这两个参数,在前面已经讨论过,现在要讨论的是噪声容限(NoiseMargin)。RS-485总线接收器的噪声容限至少应该大于200mV。前面的论述者是在假设噪声容限为0的情况下进行的。

在实际应用中,为了提高总线的抗干扰能力,总希望系统的噪声容限比EIARS-485标准中规定的好一些。因此,在选定了驱动器的RS-495总线上,在通信波特率一定的情况下,带负载数的多少,与信号能传输的最大距离是直接相关的。

在总线允许的范围内,带负载数越多,信号能传输的距离就越小;带负载数据少,信号能传输的距离就发越远。

来源:弱电工程师的圈子

围观 442

随着ARM处理器应用的范围的不断深入,根据需求的不同ARM提供的外设也越来越丰富,常用的通信接口有RS232、RS485、CAN、以太网等。RS485总线凭其传输距离远、抗干扰能力强、价格低廉等优点在各种工业场合得到广泛的应用。设计使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建具有电源隔离、电气隔离、总线保护的RS485总线接口,通过对嵌入式Linux系统RS232驱动程序的修改,使的在通过该修改后的串口驱动程序发送数据时,自动控制IO来实现RS485通信的方向控制,从而简化了RS485通信的控制流程,Linux下RS485通信程序通过对该串口的读写,实现与RS485总线上的其他设备通信。

1通信接口的硬件设计

S3C2440处理器片内集成了丰富的外设资源,可以方便的实现嵌入式应用中的各种接口通信。设计中用到了Samsung-ARM9-S3C2440,其片内集成的3个UART,在设计中UART0用于嵌入式Linux操作系统的控制台(console)接口,UART1作为RS232接口与其他RS232接口设备通信,UART3用作RS485的数据通信接口。由于ARM9处理器的IO电平与RS485的电气标准不同,RS485采用差分信号负逻辑,+2~+6V表示“0”,-6~-2V表示“1”。为了达到RS485总线的电气特性标准,所以必须要外接电平转换芯片[1,3-5],同时考虑工业应用环境恶劣等因素,需要考虑RS485总线的电源隔离、电气隔离、总线保护等因素,设计中用到广州周立功的RSM485模块。

RSM485隔离收发器模块,是集成电源隔离、电气隔离、RS485接口芯片,总线保护器件于一身。该模块采用灌封工艺,具有很好的隔离特性,隔离电压高达2500VDC,最多支持400个节点,最高通信波特率115200。

图1为系统中利用S3C2440中的UART2实现半双工的RS485总线的原理图,在同一时刻里数据只能往一个方向传输。其中的引脚CON为接收、发送控制脚,现在将其与S3C2440的IO引脚相连,由该引脚的电平控制芯片数据的方向。要发送数据时将其置0,接收数据时将其置1。

基于ARM9与LINUX的RS485总线的通信接口设计
图1S3C2440-485接口

2软件设计

2.1RS485通信设计

图2中首先打开驱动部分针对RS485通信修改过的串口2,设置其串口参数,此时串口2处于RS485总线接收模式,然后向总线上第一个设备节点发送数据读取指令,完成select函数调用图1S3C2440-485接口初始化后,select函数根据用户设定的超时时间,等待设备返回数据,若select函数返回异常,则重新进行初始化,若在设定时间内,未接受到从设备的数据,select函数返回超时,则重设下一从设备节点等待超时时间,并发送下一设备数据读取指令,重新进入select等待设备返回数据;若在设定时间内,接到从设备返回数据,则从串口接收缓冲读取数据,并完成用户协议数据解析,完成一次主从设备的数据通信,然后轮询到下一设备。

基于ARM9与LINUX的RS485总线的通信接口设计
图2RS485通信软件流程

2.2RS485驱动设计

设计中使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建而成,其驱动程序与RS232驱动程序相比多了一个通信方向控制引脚的控制,所以在Linux操作系统中,完全可以借助内核的串口驱动添加方向控制IO相关代码即可实现[4,6,7]。在linux2.6.32内核源码中,串口驱动相关代码在文件linux-2.6.32.2/drivers/seria/samsung.c中,为了实现RS485的通信,修改部分主要包括3个部分:

(1)在串口驱动的初始化代码中加入RS485通信方向控制IO口设备的初始化工作,关键代码片段为:

if(port-》line==2){//如果初始化的是串口2

s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP);//将GPG2,设为输出功能

s3c2410_gpio_setpin(S3C2410_GPH0,0);//设为高电平,使串口启动时处于接收数据状态。

RS485方向控制IO口初始化使用到了2个内核函数(在arch/arm/plat-s3c24xx/gpio.c),其函数原型为:

voids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunc-TIon)

此函数的功能是设置引脚的功能,参数pin是要设置的引脚,对应着是GPH0也即是S3C2410_GPH0引脚,参数funcTIon是要设置引脚的功能,设置中用到的是输出功能,所以该值是S3C2410_GPH0_OUTP.

voids3c2410_gpio_setpin(unsignedintpin,unsignedintx)

此函数的功能是设置引脚的输出值,参数pin是要设置的引脚,参数x是要设置引脚的输出值0或者1.

(2)在串口数据开始发送前,将方向控制IO置0,使的RSM485处于发送状态,关键代码片段如下:

if(port-》line==2){s3c2410_gpio_setpin(S3C2410_GPH0,1);//设为低电平,使串口启动时处于接收数据状态。

udelay(30);//等待方向IO控制脚状态稳定}

在设置方向控制IO口状态后,加入一定延时,等待方向IO控制脚状态稳定,避免出现由于方向控制状态不稳定导致发送数据出错。

(3)在串口数据发送完成后,自动进入到数据接收模式,关键代码片段为:

if(port-》line==2){

while(!(rd_regl(port,S3C2410_UTRSTAT)&0x04));//等待串口发送完成,这句千万不能少

s3c2410_gpio_setpin(S3C2410_GPH0,0);}

由于S3C2440处理器自带串口带有硬件缓冲区,串口驱动中,数据发送完成是指数据已有驱动程序全部写入到发送缓冲中,但此时串口数据并为正在发送出去,所以必须等待数据完全发送完成后,再将方向控制IO口置1。

2.3Linux下RS485通信编程

RS485驱动程序修改完成后,可以像操作串口一样操作RS485接口。在嵌入式Linux系统下,串口的设备文件位于/dev目录下,可以使用文件打开、读写函数[2,8,9]直接操作RS485设备。设备打开和读写部分关键代码片段为:

intfd=open(Dev,O_RDWR|O_NOCTTY);//打开设备……

nread=read(fd,s1_buf,64);//读取设备数据……

write(fd,send_buff,6);//写入发送数据

在设计中,ARM9作为RS485通信的主控设备与个从设备进行通信,主控设备从每个从设备读取数据时,主设备先向该设备发送数据读取命令,然后设备等待从设备返回数据。所以在实际应用中,因合理设置等待从设备返回数据的等待时间。在设计中使用select函数来实现等待延时,关键代码为:

switch(select(max_fd,&fds,NULL,NULL,&TImeout))//select使用

{case-1:break;//select错误,退出程序

case0:Find_endp(&pth_endp_line1);

send_buff[1]=pth_endp_line1.index+1;

send_buff[4]=send_buff[1]+1;

write(fd1,send_buff,6);

TImeout.tv_sec=time1;

timeout.tv_usec=time2;break;//超时,再次轮询

default:if(FD_ISSET(fd1,&fds))//串口1数据

{nread=read(fd1,s1_buf,64);

if(nread》=20)

{i2c_led_set(8,1);

Value_t=myrount(Value_t,100);

Value_h=myrount(Value_h,100);

Value_p=myrount(Value_p,100);

Value_pt=myrount(Value_pt,100);

}}}//endswitch

3实验结果及应用

基于ARM9与LINUX的RS485总线的通信接口设计
图3RS485接口应用

设计成功应用到环境参数采集系统中,系统中主要有采集节点、采集终端、数据服务器组成,如图3所示。采集节点负责完成气压、温度、湿度参数的采集;采集终端通过RS485总线从分个采集节点读取采集数据,并通过以太网将采集数据上报到数据服务器;数据服务器完成数据的存储,并为其他形式的应用提供应用接口。在设计中主设备循环轮询RS485总线上所有设备,每间隔1s主控设备ARM发送1次数据读取指令,读取指令中包含了从设备识别码,符合识别码的从设备立即返回采集数据。如果数据出错主设备将丢弃该数据包,等待下一次轮询,所以在通信程序设计时未考虑数据包错误重发机制。设计达到预期目标。尽管偶尔有误码出现,但设计中避免了涉及linux内核复杂代码的的修改,仍不失为有实用价值的设计方法。

来源: 快易购

围观 611
订阅 RSS - RS485