zoukankan      html  css  js  c++  java
  • RS-485半双工延时问题

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

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

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

    1

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

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

    实际的软件流程:
    1

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

    2、半双工总线收发切换延时问题

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


    ------------------------------------------------------------------------------------------------------------------------------------------


    两个自动转换(零延时)电路

    http://www.ouravr.com/bbs/bbs_upload19801/files_9/ourdev_230635.jpg
    输出1时,485芯片不工作,总线仍然处于接收状态,靠上拉电阻保证差分电路输出1。
    1

    零延时电路图:
    http://www.ouravr.com/bbs/bbs_upload19801/files_9/ourdev_230999.jpg
    1
    零延时电路波形图:
    和上面电路比,输出1时,485芯片也有短时(RC延时)输出。
    1


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

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

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

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

    Maxim带有自动方向控制的半双工RS-485收发器 
     

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

    ----------------------------------------------------------------------------------------------------------------------

    今天调了232/485电路,都未延时,开了3小时,每秒发/收一个包(9600bps,8/30字节,不定长),无错误。 
    用下面两个图 直接把原来的程序(232下的上、下位机)未做任何修改搞成 485了。 

    上位机用的图:
     


    下位机用的图:


    ----------------------------------------------------------------------------------

    半双工总线收发切换延时问题 1ms。有好多帖上说用1ms延时,通讯就稳定了,不用则出现误码。不知究竟为何? 

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

  • 相关阅读:
    Linux下彻底卸载LibreOffice方法
    Docker查看关联容器的卷宗在本机的存储位置
    Ubuntu技巧之清理系统中无用的软件包
    进入一个docker容器
    Status Code:405 Method Not Allowed
    ubuntu安装docker
    今天犯的一个低级错误
    Eclipse中Ctrl+Shift+f快捷键无效的解决方式
    hdu 4742 Pinball Game 3D(三维LIS&cdq分治&BIT维护最值)
    linux下vi编辑文件
  • 原文地址:https://www.cnblogs.com/alan666/p/8312261.html
Copyright © 2011-2022 走看看