RS485接口是串口的一种,常常用在一些工业控制中,485通信是半双工的通信,一条总线最多可连接256个485设备。
RS485信号速率最高可以到10Mbps,传输距离最大能到1000多米
485接口包含一对差分信号A和B,如下图所示

RS485标准规定,对于发送端,发送逻辑1时总线上A的电压大于B的电压,且压差在2V-6V之间,

发送逻辑0时总线上A的电压小于B的电压,且压差在-2--6V之间时

对于接收端,当总线上A的电压大于B的电压,且压差大于200mV时,表示接收到逻辑1

当总线上A的电压小于B的电压,且压差小于于-200mV时,表示接收到逻辑0.

常用的485收发器芯片有SP3485,它可以将3.3V的数字电平信号转换成485信号。SP3485的引脚信号定义大家可以看下。

其中RO为数字信号接收输出引脚,DI为数字信号发送输入引脚,RE为接收输出使能,低电平有效,DE是输出使能,高电平有效,VCC接3.3V。
这个是SP3485发送的真值表

这个是SP3485接收的真值表。

SP3485典型电路大家可以看下,RE和DE是接到了一起的。UART RX和UART TX为MCU的串口信号,分别接到SP3485的RO和DI。

当控制信号为高电平时,为发射使能。
当TX为高电平时,输出的A电压大于B电压(也就是输出485的逻辑1),
当TX为低电平时,输出的A电压小于B电压(也就是输出485的逻辑0),

当控制信号为低电平时,接收使能。
TX的电平不会对A和B信号造成影响,这时TX一般是一个高电平。
当485总线上A电压-B电压大于200mV时,RX为高电平,接收到逻辑1
当A电压-B电压小于-200mV时,RX为低电平,接收到逻辑0

总线空闲时控制信号应该为低电平,使485收发器芯片处于接收状态。如果A和B都处于高阻,其状态是不确定的,可能会导致RX上接收到错误的随机数,所以这个电路中A信号一般加上拉电阻,B信号一般下拉电阻。

A和B之间的120欧电阻的作用是消除485总线上的信号反射,一般在485总线的两端加就可以了,不用每个设备节点都加。
这个电路除了需要UART串口的TX和RX信号外,还需要一个额外的控制信号,
下面的电路就是在上面电路的基础上进行改进的,是485的自动收发电路,不需要控制信号就可以完成485信号的发送和接收。

与上面电路有所不同的是自动收发电路的RE和DE信号接到一起,由TX控制其电平,TX为高电平时,RE和DE为低电平;TX为低电平时,RE和DE为高电平。DI是接到一个固定的低电平。
当TX为低电平,Re和DE就为高电平,发射使能,RX为一个高阻状态,RX电平由外部上下拉决定,一般RX为高电平。DI为低电平,所以输出的A电压小于B电压(也就是输出了485的逻辑0)
当TX为高电平,Re和DE就为低电平,接收使能,A和B本来应该是高阻的状态,又因为A有上拉电阻,B有下拉电阻,所以A电压大于B电压(也就是输出了485的逻辑1),这时RX是高电平

TX不发送数据时,TX默认为高电平,Re和DE就为低电平,接收使能,
当485总线上A电压-B电压大于200mV时,RX为高电平,
当485总线上A电压-B电压小于-200mV时,RX为低电平。

对于485接口的ESD和浪涌防护,一般会在信号线上加TVS管,然后也可以在信号线上加上PTC自恢复保险丝。
