迅维网

查看: 13891|回复: 9
打印 上一主题 下一主题

[原创][单片机]RS-485半双工延时问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-8-25 12:06:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 重庆 来自 重庆

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
2008-03-16 yzz163 发表于 ouravr.com
http://www.ourdev.cn/bbs/bbs_con ... o=1&bbs_id=1031

现转过来,希望对搞 单片机 485通讯的朋友有用。

    学习485总线时,遇到延时问题,困扰很久。通过学习知道了485半双工收发时必须延时,以保证系统的稳定性、可靠性。好多资料都介绍了485 防静电、抗干扰电路。惟独没提 每一帧收发停止位(或第9位)的延时和 半双工总线收发切换延时 问题。
    我觉得在半双工状态下 485 帧的收发和 总线的收发状态切换延时问题 对485总线长期稳定的工作有很大影响。彻底搞懂这个问题 对了解误码产生、数据丢失、总线的稳定性、可靠性都有重要意义。

以下来源laoguo 21ic的文章 整理后:

1、每一帧收发停止位(或第9位)的延时问题
    在RS-485半双工通讯中,一般以单片机的TI,RI信号作收发切换控制信号,发送时,检测TI是否建立起来,当TI为高电平后关闭发送功能转为接收功能,接收时,检测RI是否建立起来,当RI为高电平后,接收完毕,又可以转为发送。因此,必须控制端RE*,DE的信号的有效脉宽应该大于发送或接收一帧信号的宽度。




    从上面的时序图可知:单片机在串行口发送数据时,只要将8位数据位传送完毕,TI标志即建立,但此时应发送的第九位数据位(若发送地址帧时)和停止位尚未发出。如果在这时关闭发送控制,势必造成发送帧数据不完整。
    接收数据时也同样如此,单片机在接收完8个数据位后就建立起RI信号,但此时还未接收到第九位数据位(若接收地址帧时)和停止位。所以,接收端必须延时大于2位数据位的时间(1位数据位时间=1/波特率),再作应答,否则会发生总线冲突。
    总之,发送和接收控制信号应该足够宽,以保证完整地接收一帧数据,任意两个单机的发送控制信号在时间上完全分开,避免总线争端。

注:延时T秒的取值
(1) 传送地址帧时,T>2X(1/波特率),可以选取T=2.5X(1/波特率)。
(2) 传送数据帧时,T>1X(1/波特率),可以选取T=1.5X(1/波特率)。

实际的软件流程:


问题:(【5楼】以解决)
    可看到软件流程并没有在 每一帧收发停止位(或第9位)后实现延时,而是在(数据包的)最后一个字节(帧)上延时。这样能保障数据帧的正确(完整性)和稳定性吗?

2、半双工总线收发切换延时问题
   为了可靠的工作,在485总线状态切换时需要做适当延时,再进行数据的收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时1ms左右的时间,再发送有效的数据,一包数据发送结束后再延时1ms后,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。

问题:
    这里的 1ms是如何计算的? 485总线收、发状态切换时需要做适当延时,是指 485芯片的收发切换需要延时还是 485总线电缆固有的特性?

本贴被 yzz163 编辑过,最后修改时间:2008-03-17,00:03:12.

购买记录

购买人数1价格购买时间
 会员0元2022-11-17 13:01

查看所有购买记录


2#
发表于 2009-8-25 12:09:10 | 只看该作者 来自: 重庆 来自 重庆
转一篇:智能控制收发器(整理)


    用内置微处理器实现收发使能的智能控制。
    具体方法:微处理器在检测到UART的通信起始位后(低电平),打开发送使能,允许串行数据发送至RS-485/RS-422 通讯网络。微处理器根据所设定的波特率延时至UART停止位发送一半时,例如11位格式时,延时10.5T(T=1/fBAUD),然后开始检测是否有下一个起始位到来,在时间T内若有下一个起始位到来则保持发送状态。否则,将关闭发送使能结束数据发送,重新开始检测UART的起始位。
    U3采用Microchip公司的 PIC12C508A,其中 GP0 GP1 GP4和GP5四个引脚设定对应于16 种常用波特率300 600 1200至38.4Kbps等8 种,以及900 1800 至 115.4Kbps等8种的延时时间。GP3对应于10位或11位串行数据格式,GP2为TXD输入用来检测UART何时发送和停止数据,GP1为复用输出引脚用来控制MAX3491的发送使能控制端,GP0也为复用输出引脚用来控制MAX3491的接收使能。

本贴被 yzz163 编辑过,最后修改时间:2008-03-16,18:55:39.

回复 支持 反对

使用道具 举报

3#
发表于 2009-8-25 12:10:57 | 只看该作者 来自: 重庆 来自 重庆
两个自动转换(零延时)电路:

输出1时,485芯片不工作,总线仍然处于接收状态,靠上拉电阻保证差分电路输出1。


零延时电路图:


零延时电路波形图:
和上面电路比,输出1时,485芯片也有短时(RC延时)输出。




他们如何保证 “控制端RE*,DE的信号的有效脉宽应该大于发送或接收一帧信号的宽度” 的?  
------------------------
这个已经理解了,这两个电路没有使用 单片机来切换,所以不存在发送最后一个帧需要延时的问题。

但是这个问题依然存在:
为了可靠的工作,在485总线状态切换时需要做适当延时,再进行数据的收发。
------------------------------------
这两个电路在状态切换时都没有按这个要求来延时。

本贴被 yzz163 编辑过,最后修改时间:2008-03-17,00:01:51.

    可看到软件流程并没有在 每一帧收发停止位(或第9位)后实现延时,而是在(数据包的)最后一个字节(帧)上延时。这样能保障数据帧的正确(完整性)和稳定性吗?
-------------------------------
又查了些资料,第一个问题有了新的思路:(具体理解的是否正确,还需要看波形来验证)
    对于一个数据包来说,单片机发第一帧(字节)到最后帧之间的数据帧时,单片机都能正确的发出停止位(或第9位),因为这期间没有使用中断里的TI,RI信号作切换。直到最后一个帧才会用TI,RI信号来切换 485。也就是 最后一个帧(字节)才需要延迟 停止位(或第9位)的时间。

    从本质上说,在发送/接收 数据包的 最后一个帧(字节)时,需要延时 等待 停止位(或第9位)的完整发送/接收。 也就是应当在 最后一个帧发送/接收后,在软件里写入延时代码 控制485芯片。

回复 支持 反对

使用道具 举报

4#
发表于 2009-8-25 18:18:24 | 只看该作者 来自: 重庆 来自 重庆
Maxim带有自动方向控制的半双工RS-485收发器


    MAX13487E/MAX13488E半双工RS-485收发器。该系列器件带有AutoDirection功能,发送数据时可自动使能驱动器。这一特性省去了驱动使能控制信号。

21ic的文章,可惜看不到图三

高手的艰难颠簸----Q118.RS-485总线的方向控制如何实现?要注意什么?
http://blog.21ic.com/more.asp?id=10746

3 换向控制  

总的来看,真正传输数据前先打开驱动器的条件不应改变,只有这样才能保证数据可靠地传输(按常规就是这样做的)。现在的问题是:打开驱动器的时间总是要占用时间的,要求还必须是低电平,高电平不起任何作用。同时,直接用数据打开驱动器是不可取的,这样做有损坏数据的危险。因此,可以这样说,设计思路上与使用I/O口先打开DE再发送数据的思路是一样的。为了达到不需要I/O干预,那么就需要使用专门的开启代码机制解决吧。

通过线与让I/O控制先送出开启电平来开启驱动器比之由数据线先送一个字节开启代码相对简单,虽然电路稍为复杂一些,但不对接收方识别提出要求。线与的方法优点是之一占用时间少又类似常规机制;第二个优点是节省光耦,即在线路采用光隔离措施时能与数据线共用一个光耦。但必须在发送真正的数据前及时退出。为了及时准确控制,感觉用单稳态触发器为好。图3的电路,影响时间常数的主要因素是数据速率。速率高,时间常数要小些,速率低,时间常数要大些。调试相对难是这个电路的不一定的不足。不过,要注意这个电路的两个时间常数并不相同,原因是C2要经过Q4的发射结放电,而C1不存在这样的问题。该电路的不足还有收发控制电平不是数字信号而是模拟信号。

图一:


可惜看不到图三。

回复 支持 反对

使用道具 举报

5#
发表于 2009-8-25 18:21:45 | 只看该作者 来自: 重庆 来自 重庆
另一段关于延时的问题的讨论:

    只是我们讨论这些问题可能要将传输速率限制在一个合适的水平以下。如果是在115.2K,数据的单bit位宽约8uS,而TXD通过74HC05的延迟约为25ns,MAX485的控制延迟约为70ns,这样合计造成单个bit的信号损失为(25+70)/8000=1.18%, 一般UART是对一个比特进行16次采样的,这1%的损失应该不会对其中任何一次造成影响。另外以上的计算可能是实际情况的2倍,因为对于一个0比特,虽然在下降沿部分造成了损失,但是因为前述两个延迟同时也作用于上升沿,这就会延长0电平时间,减少了0电平的宽度损失。
    这是我的计算方法,还请大家指正。

郁闷的AVR与485的通信问题  
http://www.ouravr.com/bbs/bbs_co ... wox&bbs_id=9999

(关于 延时 的整理)
1、使用 AVR的发送中断标志,解决办法:在每一包数据的最尾加一个0xFF

    AVR的发送中断标志是数据移出发送缓冲就产生了中断,数据还没有真的发送出去.  
如果此时后面的数据没了,把485置为接收状态就会出现最后一个数据发不出去的现象,在此条件下, 用超时来判断最后一个数据是否发出去,对于不同的波特率,时间也不一样,而且,对于"0"响应的设备时,用超时就有可能收不到部分数据.没办法只好在每一包数据的最尾加一个0xFF确保所有数据都发出去.  

2、使用 AVR的发送完成中断。(可能是AVR特有功能)
    当整个数据帧移出发送移位寄存器,同时发送缓冲器中又没有新的数据时,发送结束标志TXC 置位。TXC 在传送结束中断执行时自动清零,也可在该位写"1” 来清零。TXC 标志位对于采用如RS-485 标准的半双工通信接口十分有用。在这些应用里,一旦传送完毕,应  
用程序必须释放通信总线并进入接收状态。  
    当UCSRB 上的发送结束中断使能位TXCIE 与全局中断使能位均被置为"1” 时,随着TXC 标志位的置位, USART 发送结束中断将被执行。一旦进入中断服务程序, TXC 标志位 即被自动清零,中断处理程序不必执行TXC 清零操作。

    donkey 知秋的回答:不知道是我的232-485的转换器的问题还是别的什么问题,即使用了发送完成中断,也还是要延时5us才行,否则偶尔会出错.  

    这里的 "偶尔会出错" 也是 延时 问题,为何 延时 能排除 "偶尔会出错",原因(理论根据)是什么?


本贴被 yzz163 编辑过,最后修改时间:2008-03-22,15:51:15.

回复 支持 反对

使用道具 举报

6#
发表于 2009-8-25 18:22:39 | 只看该作者 来自: 重庆 来自 重庆
今天调了232/485电路,都未延时,开了3小时,每秒发/收一个包(9600bps,8/30字节,不定长),无错误。
用下面两个图 直接把原来的程序(232下的上、下位机)未做任何修改搞成 485了。

上位机用的图:



下位机用的图:

回复 支持 反对

使用道具 举报

7#
发表于 2009-8-25 18:26:46 | 只看该作者 来自: 重庆 来自 重庆
半双工总线收发切换延时问题 1ms。有好多帖上说用1ms延时,通讯就稳定了,不用则出现误码。不知究竟为何?

总结下:
    1、总线上不间断(长时间连续)的发送数据会产生累积误差(不同晶振频率的误差)。所以用延时(暂停通信一段时间)来消除波特率的误差,避免数据错误。
    2、485器件在收、发状态转换时,需要转换时间来过渡到稳定状态。

回复 支持 反对

使用道具 举报

8#
发表于 2009-8-26 23:31:41 | 只看该作者 来自: 广东深圳 来自 广东深圳
yzz163对这个也有研究啊?高人,有没研究过PLD?

回复 支持 反对

使用道具 举报

9#
发表于 2009-8-27 08:49:46 | 只看该作者 来自: 江苏常州 来自 江苏常州
工作稳定是485线路的第一要求,而且485线路长,周围环境复杂

回复 支持 反对

使用道具 举报

10#
发表于 2009-10-18 21:03:45 | 只看该作者 来自: 重庆 来自 重庆
有没研究过PLD?
--------------------
没有。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复