谷谷小师妹 发表于 2023-5-16 00:17:25

【避坑指南】产品批量后,发现大约有1%通信不良,深入理...

【避坑指南】产品批量后,发现大约有1%通信不良,深入理解RS485的使能延迟和传输延迟



本文介绍RS485的使能延迟和传输延迟引发的通信故障,涉及软件和硬件领域,至少有90%的工程师都忽略,本文将深入探讨。


01问题描述系统由一台HMI和一台PLC组成,两者通过RS485进行通信,在产品批量后,发现大约有1%的产品通信不良,主要表现是丢包,并且随着数据的速率提高,丢包越严重,现场已排查:1)信号质量OK;2)波特率误差在标准内,小于3%3)驱动能力OK,没有发生信号畸变;图1 :系统通信图02知识扫盲RS485芯片的有两个重要的参数:使能延迟和传输延迟。我们知道RS485通信是半双工通信,因此同一时间只有一个方向可以传输数据,RS485芯片同一时间只能处于发送模式或者是接收模式,在空闲的时候,需要处于接收模式。方向的控制一般由软件进行控制较多。图2:485 总线示意图
2.1 使能延迟主芯片需要发送数据时,需要先发送DE/RE为高再发送数据信号D,但是由于RS485芯片原来处于接收模式,突然收到主芯片命令需要切换到发送模式,由于芯片内部的逻辑内部固有的延迟,切换需要时间。以TI的TI-SN65LBC184为例,见下图,图中意思是,将芯片的TX固定为3V,然后在DE、RE引脚上输入一个高电平,当输入上升50%后为基线,测量出输出A总线上电平到2.3V需要的时间,这个时间tPZH就是使能延迟。该芯片数值为3.5uS。换个说法就是,芯片从接收模式,切换到发送模式,需要经过3.5uS才能有驱动能力输出。如果换向后总线马上送出数据而不延迟,有3.5uS时间总线AB是没有驱动能力的,还是处于高阻状态,串口协议起始标志是TX由高到低跳变,如果不考虑改值,将会损失该占空比。图3:手册对使能延迟和传输延迟的定义
2.2 传输延迟主芯片发送数据时,从TX上升到50%,测试输出A上升到50%需要的时间,就是传输延迟。该芯片的值是1.3uS。图4:手册对使能延迟和传输延迟的定义

03原因分析经过分析,主要原因是软件工程师忽略了芯片的使能延迟,数据发送太早。具体的理解如下。以TI的TI-SN65LBC184为例,芯片的使能延迟(切换时间)为3.5uS,软件以DE为基准,假设软件延迟1uS后再发数据,波特率为115200bps,一位低电平宽度为8.68uS,此时低电平损失为:3.5uS-1uS=2.5uS,损失率为2.5/8.68=28.8%,由于串口是以每一帧的起始位开始计时,这将会导致波特率误差出错,关于波特率误差,可以参考之前的文档《深入理解波特率误差》。使用示波器的余晖模式(知道余晖模式是什么意思的评论区互相发一发)经过实测,软件工程师发送数据比方向引脚延迟最短只有1uS,导致了第一位起始位的低电平脉宽严重不足,导致对方PLC采样起始位时候出现了偏差,这种情况会随着波特率的提高,脉宽损失率会越严重。图5:数据发送太早,导致起始位损失04解决方案主要原因是由于软件工程师在配置方向DE和数据D之间的匹配上出现了问题,通过余晖模式可以看到,发送延时时间误差非常大,在1uS~10uS之间摇摆,如果延迟时间小于芯片要求的3.5US,就很有可能导致对方的设备采样低电平起始位出错。解决方案有2个:1)更换使能延迟更小的RS485芯片,例如同时TI的芯片,TI-SN65LBC184的使能延迟是3.5uS,同系列的SN65LBC176A使能延迟只有22nS,基本可以做到无缝切换。2) 软件修改发送数据D延迟,并且延迟时间需要大于芯片要求的使能延迟,使用余晖模式观察1小时以上,不允许出现小于芯片使能延迟的情况。上述案例,将D比DE延迟到稳定的4us,通信不再出错。05总结上述问题由于时发送起始位时数据提早引起的问题,还有一种情况:数据帧发送结束后,方向DE切换为接收模式的时间也要考虑,如果方向比数据提早,最后一位数据将会无法发出去,如果方向比数据延迟太多,对方的设备收到数据后马上回复,会因为己方没有切换到接收模式而导致数据丢失。我们的建议是,针对发送结束后两者的配合条件是,发送结束后,方向DE和数据D延迟的时间T:0≤T<8t,其中t为一位数据的宽度,如115200的t为8.68us。为何大于等于0即可,同样是因为有使能延迟的存在,从发送模式切换到接收模式,芯片也有延迟,例如TI-SN65LBC184是3.5uS。也就是即使数据和方向同步,也不用担心方向比数据早,至少会晚3.5us后才会切换到接收模式。当然有些芯片使能延迟非常小,是ns级别,此时可以考虑稍微增加1~2uS的延迟。为何需要小于10t,主要有两个原因考虑:一是大部分的方向DE都是软件控制,串口驱动在软件内部优先级较低,很难做到精准的时间控制,10t对软件要求较小,比较容易实现。二是RS485通信基本追求的不是速率,一问一答之间的回复时间并不是很快,对方收到数据后,对方的串口优先级也不是最高,收到数据后还需要进行处理,处理完成后才会回复数据。10t基本是一帧数据,目前还没有发现那个品牌的设备RS485的回复时间小于一帧数据需要的时间,也就是10t。当然,如果软件做到小于10t有难度,可以根据实际情况要求,但是肯定要小于1ms,否则兼容性将会很差。本文原创作者:创易栈啊甘,感谢啊甘的精彩分析!

页: [1]
查看完整版本: 【避坑指南】产品批量后,发现大约有1%通信不良,深入理...