一、RS485 通信简介
RS485 是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准,经通讯工业协会(TIA)修订后命名为 TIA/EIA-485-A。
RS485 是一种工业控制环境中常用的通讯协议,其中RS 是 Recommended Standard 的缩写。
RS485 是 半双工异步 串行通信。
特点
支持多节点:一般最大支持 32 个节点。
传输距离远:最远通讯距离可达1200米。
抗干扰能力强:差分信号传输。
连接简单:只需要两根信号线(A+和B-)就可以进行正常的通信。
差分信号传输
RS485 通信采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。
在差分信号中,逻辑0和逻辑1是用两根信号线(A+和B-)的电压差来表示。
逻辑 1:两根信号线(A+和B-)的电压差在 +2V~+6V 之间。
逻辑 0:两根信号线(A+和B-)的电压差在 -2V~-6V 之间。
连接方式
在 RS485 通信网络中,通常会使用 485 收发器来转换 TTL 电平和 RS485 电平。
节点中的串口控制器使用 RX 与 TX 信号线连接到 485 收发器上,而收发器通过差分线连接到网络总线。
串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。
发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上。
接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。
通常在这些节点中只能有一个主机,剩下的全为从机。
在总线的起止端分别加了一个 120 欧的匹配电阻。
具体连接图如下所示:
二、RS485 通信电路图(SP3485)
SP3485 芯片是一款非常经典的+3.3V低功耗半双工RS485收发器,数据传输速率高达10Mbps。
单片机串口通信一般是TTL电平,如果需要RS485 通信,就需要RS485芯片在中间转换一下。
因为RS485通信是半双工通信,就是发送数据的时候不能同时接收数据,所以我们选择SP3485做RS485收发器。
SP3485 芯片引脚
SP3485 芯片的引脚图如下所示:
引脚说明如下:
引脚 | 名称 | 功能 |
1 | RO | 接收器输出----接RX |
2 | RE | 接收器输出使能(低电平-接收使能) |
3 | DE | 驱动器输出使能(高电平-发送使能) |
4 | DI | 驱动器输入----接TX |
5 | GND | 接地 |
6 | A | 驱动器输出/接收器输入(同相) |
7 | B | 驱动器输出/接收器输入(反相) |
8 | VCC | 芯片供电+3.3V |
RS485 电路图----普通收发
RS485 普通收发电路图原理:
RS485_EN 为高电平,逻辑为1,发送使能,接收禁止。
RS485_EN 为低电平,逻辑为0,发送禁止,接收使能
在编写驱动程序 时:
在发送数据前,给RS485_EN 置高电平。
在发送数据后,给RS485_EN 置低电平。
RS485 电路图----自动收发
RS485 电路图如下图所示:
RS485 自动收发电路比RS485 普通收发电路增加了一个三极管开关电路,是由电阻R8、电阻R9 和 NPN三极管Q1 组成。
R9是限流电阻:最好选择4.7K,也可以选择10K。
R8是上拉电阻:可以选择4.7K或者10K。
NPN三极管Q1:高电平导通,低电平截止。
接收数据
接收数据引脚是 RS485_RX,在接收数据过程中,RS485_TX引脚一直保持高电平,NPN三极管Q1导通,RE和DE的引脚是低电平,发送禁止,接收使能,进入接收状态。
发送数据
发送数据引脚是 RS485_TX,应该 RS485_TX 发送1,AB发送1;RS485_TX 发送0,AB发送0。
当 RS485_TX 发送1时:NPN三极管导通,RE和DE的引脚是低电平,发送禁止,接收使能,进入接收状态,SP3485芯片的AB引脚进入高阻状态,因为R4把A拉高,R5把B拉低,所以,AB传输的是1。所以,当RS485_TX发送1时,AB引脚发送1。
当 RS485_TX 发送0时:NPN三极管不导通,RE和DE的引脚是高电平,进入发送状态,SP3485芯片会把DI上的电平反应到AB引脚上输出,因为DI已经接地,所以AB引脚会传输0。所以,当RS485_TX发送0时,AB引脚发送0。
1. 传统的串口转RS485设计
传统的485应用电路如下所示(懒得画了,找个现成的,此图截取自安富莱电子),RS#、DE分别是控制接收和发送,具体来说<img><img> RE#: 0接收使能,1接收禁止;
DE: 1发送使能,0发送禁止;
RS#、DE是反向逻辑,因此我们常将RS#、DE连在一起,当MCU要发送数据的时候,就将RS#/DE引脚拉高,当MCU发送完成后,就将引脚拉低,来等待外部485数据。
对于上图的R2和R4,用于钳住485接口的默认电平,是一定要焊接的,不焊接会导致485接口抗干扰能力变差,若不焊接会导致485侧有风吹草动(如用镊子碰了RS485接口),串口都会收到异常数据。
R3用于阻抗 匹配,一般用于远距离或抗干扰,平时的时候一般会选择120欧姆,或者不焊接,这个要看实际情况,但是在pcb设计的时候一定要预留位置。
这种设计的优势:这是485芯片厂商推荐的电路画法,稳定可靠,不需要增加硬件成本,且RS485的驱动能力比较高。
缺点:MCU除了提供RX、TX引脚外,还需要提供一个GPIO引脚,用于控制接收和发送,增加了编程的控制RS#、DE环节考量。
同时还需要注意,有的485芯片在你使能发送的时候,会自动拉低RO引脚,等到在使能接收的时候,在拉高RO引脚然后等待接收,因此有的mcu会收到字节0X00,常用的解决办法是mcu在发送数据的时候,mcu失能串口接收,等发送完成后,使能485芯片接收引脚后,在重新mcu使能串口接收。
2. 自动收发串口转RS485设计
正是因为传统的串口转RS485设计增加了一个GPIO的消耗,因此网上有了一个取巧的设计,设计图如下:
这个图的R46和R47是绝对不可缺的。对于R48,若mcu的RX没有上拉输入功能,那这个电阻也是不可以少,终端120欧电阻一般不添加。
为什么R46和R47是绝对不可缺的,我们先分析一下它的工作原理:
当tx为高电平,RS#/DE引脚为低,此时RE#有效,此时485A和485B由于上下拉电阻的作用,485A为高,485B为低,485芯片处于发送高电平状态或者处于接收状态。
当tx为低电平,RS#/DE引脚为高,此时DE有效,485芯片处于发送状态,因为DI引脚接地,因此485芯片输出低电平。
现在会发现,当tx为高的时候,485输出电平是由485的AB相的上下拉电阻来完成的,串口的收发恰好可以和485的高低电平对应上,因此这个自动收发串口转RS485设计是可以使用的。
为什么说RX的上拉电阻R48不可缺少,公司曾将设计过这样一个电路,如下: 在描述一下这个电路板,这个rx和tx在pcb上的走线大约10厘米左右,应该对数据的传输也有些影响,但我认为距离不是主要因素,设计才是主要原因。
这个uart_rx没有接上拉电阻,当我用示波器 分别触碰tx和rx的测试点,然后mcu发送数据,tx线电平如下:
<img>
发现很正常,也很规整,完全没有问题,但是当tx发送数据的同时,rx测试点竟然也有了电平变化,如下图:<img>这将导致我mcu发数据的时候会同时收到数据,有的时候收到的和发送的一致,有的时候是乱码。 经过分析,我发现了问题,后来我在mcu配置的时候,将RX的GPIO配置成了上拉输入,后再测试,rx测试点波形如下:<img>发现还是有电平变化,但是很窄,因此也不会被串口误识别有输入,串口输入误判问题得到解决。 因此对于自动收发型电路,rx引脚的上拉电阻很重要,不可缺少,当然若MCU的rx支持上拉,这个电阻也可以忽略。
同时这个也进一步证明了这种自动收发型的RS485设计不适合高速的串口通信,同时抗干扰能力也比传统的差,至于是不是和你的项目 需要自己去验证。
3. 自动收发串口转RS485设计优缺点
优点:最主要是节省IO,同时还捎带的降低了程序编写的工作量。
缺点:
通信速度慢:
三极管有电容效应,导致关断时间较长,导致RS#/DE从低到高电平变化出现比较大的斜坡.同时485输出高电平,是依靠上下拉来完成的,会导致上升沿不够迅速,因此上下拉的阻值选择也是影响速度的关键。
驱动能力弱:
由于当tx为高,485电平是由其上拉电阻完成的,因此弱提高驱动能力,就要减小电阻,由于485芯片驱动能力有限,电阻太小会导致tx为低的时候,485芯片无法将485总线拉低,因此总线上所有上拉电阻的并联值不应该小于375欧。还用当接入120欧的终端电阻的时候,AB两相的电压差由终端电阻和上下拉分压得到,会导致AB两相的电压差变小,因此自动收发串口转RS485设计不太适合添加终端电阻。
推荐阅读: