RS485是最常见的一种远距离可靠传输和组网的UART串口信号接口协议。与同样传输UART串口信号的RS422协议相比,RS485使用半双工通信,即只有一个信道,在同一时刻要么从A到B,要么从B到A传输信号;而不能同时双向传输信号。因此理论上说,每个RS485接口芯片就都需要一个“收发切换”信号,以控制该接口芯片当前是发送还是接受信号。在单片机系统中就往往需要一个额外的GPIO来控制收发状态的切换。这本来是显而易见的道理,我已经见惯不怪了,但有一天突然看到市面上有供PC或工控机使用的UART-RS485转换器,我迷惑了:它是如何通过PC输出的UART实现RS485收发切换控制的呢?

显然,这不是通过PC软件控制收发的,那就一定有硬件电路实现了“RS485自动收发切换”功能。我查阅了网络,发现还真有一些公开电路,我根据自己对这些公开电路优缺点的分析,也自创了一种RS485自动收发切换电路,与广大网友共享。

以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng

一、常见RS485接口电路(无自动收发切换功能)

各大半导体公司都有自己的RS485收发器,且解法基本相同,这里给出典型的收发器解法。

图1

使用RS485协议组网通信的工程项目中,往往采用图1所示的电路作为每个网络节点的接口电路。所有节点的差分信号线对:RS485_A/RS485_B,则被短路到一起进行通信。由于网络中所有节点的通信信号RS485_A/RS485_B全部被短接在一起,因此每个时刻只能有一个通信节点处于发送状态,而其他节点的RS485_A/RS485_B信号只能处于高阻态,否则两个处于发送状态的节点将发生“撞车”,而无法通信。

为实现上述功能,RS485接口芯片提供了写使能管脚DE和读使能管脚#RE。为节约单片机管脚,两者的逻辑是相反的:DE为高电平有效,低电平无效;#RE为低电平有效,低电平无效。如图1所示,它们可以被短接在一起由一个GPIO控制。每个节点的单片机在认为该自己占据RS485_A/RS485_B总线发送数据时,将USART_EN信号拉高,从而使接口芯片退出高阻态,控制差分信号的电平。

二、RS485自动收发切换电路

本文的目的,是总结常见的自动收发切换信号USART_EN信号产生电路,从而为省去其占用的GPIO,以节约单片机资源并为PC等不具备GPIO的设备提供收发控制。

1、低成本自动收发切换电路

下图所示的是网络中可以查阅得到的最常见RS485收发自动控制电路。

图2

图2电路设计非常精巧,其原理为:1、但UART发送管脚USART_TX输出低电平时,三极管Q1截止,接收使能#RE和发送使能DE同时被R6拉高,接口芯片进入发送状态。此时会将连接到发送信号管脚DI上的低电平发送除去,从而在差分输出RS485_A/RS485_B上得到逻辑低电平对应的输出。2、当USART_TX管脚发送高电平时,三极管Q1导通,接收使能#RE和发送使能DE同时被拉低,接口芯片进入接收状态,A、B两个管脚为高阻态。但此时连接到RS485_A/RS485_B上的其他网络节点,却会因为电阻R2和R3(4.7KΩ)的上下作用,将RS485_A/RS485_B上的高阻态理解为高电平。因此,图2虽未直接将USART_TX的信号发送到RS485_A/RS485_B上,但却在逻辑上同时起到了发送数据和自动控制收发状态切换的作用。

图2中的电路,几乎不需要增加附加成本(小功率NPN三极管非常便宜,且不占PCB面积),应该是大部分PC或工控机使用的UART-RS485转换器所使用的原理,被很多老工程师奉为经典。

但我窃以为这个电路有着明显的缺点,在对成本不敏感的高可靠性工控产品中未必是最佳选择。原因如前所述:图2输出的高电平不是由接口芯片直接驱动的,而是在接口芯片进入高阻态后,由上下拉电阻R2和R3产生的。正常情况下一般RS485接口芯片驱动能力可轻松达30mA以上(表1为MAX485的驱动能力),从而保障了RS485接口电路的驱动距离、负载数和强干扰环境下的可靠性。

表1 MAX485驱动能力

但图2所示电路高电平的短路驱动能力(Driver Short-Circuit Current)仅为VCC/(R2+R3)。为了保证输出低电平时系统的总体功耗,R2和R3又不可能太低,如图2所示仅为4.7KΩ,显然无法完全发挥RS485接口的驱动和抗干扰能力

2、自创的高性能自动收发切换电路

我自己反复分析图2电路的优缺点后,也未能找到更有效的解决方案。一觉醒来,发现上述电路的本质问题是单片机和接口电路交互的信息熵不足的问题:接口电路需要单片机高速自己1)高阻接收,2)驱动发送高电平,3)驱动发送低电平三种不同可能的信息熵;但单片机如果只使用USART_TX一个GPIO向接口电路发送信息,则只能表述1bit,两种不同可能的信息熵。因此这个问题是不可能完整解决的,只能牺牲掉某种性能才能换取部分实现所需的功能。图2的电路就是牺牲了区分高阻态和发送高电平的性能,实现了收发的自动切换。

我考虑还可以使用牺牲部分发送时间的方式,实现收发的自动切换:在单片机和RS485接口之间增加一个可重复触发的单稳态触发器。

如图3所示,UART帧协议总是由一个低电平码元构成的起始位作为一个字节的开始,而空闲时USART_TX总是停留在高电平。

图3

将USART_TX连接到可重复触发单稳态触发器的输入端,而单稳态触发器的输出则连接到RS485接口电路的发送使能管脚DE这样单稳态触发器将在USART_TX开始发送数据之后的一段时间内,控制接口电路一直保持在发送状态,并在这段时间内保持接口电路最佳的驱动能力

图4

这样做的缺点在于:单稳态触发器不仅会被起始位的低电平触发,还有可能被随后的数据位中的0重复触发,从而造成本节点接口电路超时占用RS485_A/RS485_B总线。可将单稳态触发器的亚稳态持续时间设置为11个UART码元的时间,这样保证了发送数据0xFF这样全高电平的字节时,后续的数据域和停止位时段都保证接口电路占用总线,获得最佳驱动能力。另外也使得当数据域中有低电平码元的情况下,接口电路占用总线的时间最短。

至于上述电路的实现思路,可以选择低成本的单片但问题触发器74HC122,如图5所示通过阻容的数值来确定亚稳态时间的长度。

图5 74HC122构成的单稳态触发器

另一种实现上述思路的方法,是使用可编程逻辑器件(PLD)来实现单稳态触发器。对于板子上已经有GAL、CPLD或FPGA的系统而言,这几乎是不需要成本的,但对于没有这些PLD器件的系统而言,这将增加系统的成本和功耗。以下给出我的Verilog HDL代码。

 1 module RS485_DIR_CTL(        input usart_tx,
2 input clk,
3 output rs485_ctl
4 );
5 parameter DLY_NUM = 8_000;//最长延迟的时钟数,由10个最长码元确定,现设置为1ms左右(8MHz时钟)
6 reg[14:0] cnt;
7 always@(posedge clk or negedge usart_tx)
8 begin
9 if(!usart_tx)
10 cnt[14:0] <= 15'd0;
11 else begin
12 if(cnt[14:0] < 15'd20_000)
13 cnt[14:0] <= cnt[14:0] + 15'd1;
14 else
15 cnt[14:0] <= cnt[14:0];
16 end
17 end
18 assign rs485_ctl = (cnt[14:0] < DLY_NUM);
19 endmodule

其设计思路是usart_tx有低电平就将控制管脚切换到发送状态,直到TXD恢复高电平一段时间。为了保证输出切换及时,usart_tx被设计成了异步复位信号,通过调整DLY_NUM可以调整单稳态计数器的亚稳态持续时间,从而调整控制接口输出的时间长度。Quartus II综合后电路如下图所示。

图6

计数所需时钟则可由单片机或其他时钟电路提供,我这里使用了STM32的PA8脚的MCO时钟输出功能,配置代码如下:

1     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PA8
2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
3 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
4 GPIO_Init(GPIOA, &GPIO_InitStructure);
5 RCC_MCOConfig(RCC_MCO_HSE); // MCO选择输出频率

3、带有自动收发切换功能的RS485接口芯片

美信公司(现已被ADI收购)有一款自动换向的RS485芯片MAX13487。我猜测其原理无外乎我上面提到了两种,但其价格较高,且采购渠道不是特别顺畅,与上面提到的两种方法相比不具有可比性,我这里就不展开叙述了。

图7 MAX13487/MAX13488

三、总结

低成本、非工业环境可选择图2所示的低成本方案一,但其将在高电平期间降低抗干扰能力和带载能力。不差钱,不考虑货期,且无需国产化需求的项目,可选图7所示的美信产品方案三。系统中已经有GAL、CPLD或FPGA的产品,选择PLD实现的方案二是0成本的最佳方案;系统中没有PLD,又想获得高可靠性、带载能力和低成本的可以选择图5所示74HC122小规模集成电路实现的方案二。

本文提出的方案二的缺点在于少量增加节点占用RS485总线的时间,但每帧数据最长增加总线占用时间仅为10个码元时长,而这对于常见RS485组网通信系统几乎是可以忽略不计的。

RS485自动收发切换电路 [原创www.cnblogs.com/helesheng]的更多相关文章

  1. 国产CPLD(AGM1280)试用记录——做个SPI接口的任意波形DDS [原创www.cnblogs.com/helesheng]

    我之前用过的CPLD有Altera公司的MAX和MAX-II系列,主要有两个优点:1.程序存储在片上Flash,上电即行,保密性高.2.CPLD器件规模小,成本和功耗低,时序不收敛情况也不容易出现.缺 ...

  2. STM32的SPI口的DMA读写[原创www.cnblogs.com/helesheng]

    SPI是我最常用的接口之一,连接管脚仅为4根:在常见的芯片间通信方式中,速度远优于UART.I2C等其他接口.STM32的SPI口的同步时钟最快可到PCLK的二分之一,单个字节或字的通信时间都在us以 ...

  3. 给初学者的STM32(Cortex-M3)中断原理及编程方法介绍 [原创www.cnblogs.com/helesheng]

    本人编著的<基于STM32的嵌入式系统原理及应用>(ISBN:9787030697974)刚刚在科学出版社出版.这本书花费了半年以上的时间,凝聚了笔者作为高校教师和嵌入式工程师的一些经验, ...

  4. LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]

    LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序.但作为一种图形化的开发语言,使用LabVIEW开发涉及算法和流程控制的大型应 ...

  5. 为树莓派添加一个强实时性前端[原创cnblogs.com/helesheng]

    树莓派是最近流行嵌入式平台,其自由的开源特性以及低廉的价格,吸引了来 自全球的大量极客和计算机大咖的关注.来自各大树莓派社区的幕后英雄,无私地在这个开源硬件平台上做了大量的工作,将其打造成了世界上通用 ...

  6. 用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng]

    工业测试与控制系统中,经常需要对未知信号的频率进行测试.对于10MHz以下的信号,用单片机(MCU)定时器完成这项任务显然是最常见和最佳的选择.目前性价比最高的单片机STM32拥有功能强大且数量众多的 ...

  7. 电池和Adapter切换电路改进实验(转)

    源:电池和Adapter切换电路改进实验 目的:很多单电池的机器在大负载的情况下,如把背光开到最亮,运行3D游戏,此时拔DC电源很容易出现机器死机,或花屏现象: 原因:Q5的导通时间不够,希望通过G极 ...

  8. 自动配置/切换/查看JDK环境变量

    最近老是需要几个版本的JDK切换工作,于是网上收集资料整理,自己写了一个:自动配置/切换/查看JDK环境变量的批处理脚本.顺带3个JDK版本分别是:jdk1.6.0_43,jdk1.7.0_80,jd ...

  9. Linux-485收发切换延迟的解决方法

    [前言] 本文引用各种资料甚多,而引用出处标明并不详细,若有侵权,请联系删除. 转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10381616.html ...

随机推荐

  1. CF1682E Unordered Swaps

    鸽着,我不知道为什么对? 题意: 思路: code: #include<bits/stdc++.h> using namespace std; const int N=5e5+5; int ...

  2. JNPF移动办公解决方案

    市场背景 随着办公自动化系统的普及,电子化.数据化的办公方式已进入越来越多的企业和政府单位,信息化的办公系统在企事业内部编织起一套高效.畅通的信息互联体系,极大推动了企事业单位生产力的发展.但与此同时 ...

  3. Python列表解析式的正确使用方式

    先来逼逼两句: Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法.在本文中,将会展示列表解析式 (List Comprehension).我们将讨论如何使用它?什 ...

  4. Python在函数中使用列表作为默认参数

    在学习中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作为函数的默认参 ...

  5. 飞鱼CRM

    直接放干货吧,今日头条飞鱼CRM的PHP调用方法,点我跳转. 很简单的两个方法,加密时重要的是有一个空格,必须要有,这个也是坑了我很长时间的一个坑. 接下来具体说一下飞鱼CRM系统接口加密的方法. & ...

  6. 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...

  7. 『现学现忘』Git后悔药 — 29、版本回退git reset --mixed命令说明

    git reset --mixed commit-id命令:回退到指定版本.(mixed:混合的,即:中等回退.) 该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本. 但是 ...

  8. 虚拟机启动时报’A start job is running for /etc/rc.local .. Compatibility错误。

    虚拟机启动时报'A start job is running for /etc/rc.local .. Compatibility错误. 问题已经存在很长时间了,但是不影响ssh登录,遂置之未理. 经 ...

  9. DTCC 干货分享:Real Time DaaS - 面向TP+AP业务的数据平台架构

      2021年10月20日,Tapdata 创始人唐建法(TJ)受邀出席 DTCC 2021(中国数据库技术大会),并在企业数据中台设计与实践专场上,发表主旨演讲"Real Time Daa ...

  10. RS485 MODBUS RTU通信协议

    1.RS485接口标准 RS485由RS232和RS422发展而来,弥补了抗干扰能力差.通信距离短.速率低的缺点,增加了多点.双向通信能力,即允许多个发送器连接在同一条主线上,同时增加了发送器的驱动能 ...