这里仅总结一下IO控制相关及这种总线等  ~持续更新 第二部的啊    whaosoft aiot http://143ai.com

一、SPI、UART、I2C通信的区别与应用

电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言。在电子产品中,这些语言称为通信协议。

之前有单独地分享了SPI、UART、I2C通信的文章,这篇对它们做一些对比。

串行 VS 并行

电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。

数据位可以通过并行或串行的形式进行传输。 在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:

  在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:

SPI通信

SPI是一种常见的设备通用通信协议。它有一个独特优势就是可以无中断传输数据,可以连续地发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有着限定位数。

在SPI设备中,设备分为主机与从机系统。主机是控制设备(通常是微控制器),而从机(通常是传感器,显示器或存储芯片)从主机那获取指令。

一套SPI通讯共包含四种信号线:MOSI (Master Output/Slave Input) – 信号线,主机输出,从机输入。MISO (Master Input/Slave Output) – 信号线,主机输入,从机输出。SCLK (Clock) – 时钟信号。SS/CS (Slave Select/Chip Select) – 片选信号。

SPI协议特点

实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。

工作原理

时钟信号:

每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。

设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。

片选信号:

主机通过拉低从机的CS/SS来使能通信。 在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。

如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:

MOSI和MISO:

主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据发送给主机,两者可以同时进行。所以理论上,SPI是一种全双工的通讯协议。

传输步骤

1. 主机输出时钟信号

2. 主机拉低SS / CS引脚,激活从机

3. 主机通过MOSI将数据发送给从机

4. 如果需要响应,则从机通过MISO将数据返回给主机

使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。

SPI优劣分析

优点

SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据。

缺点

SPI使用四根线(I2C和UART使用两根线),没有信号接收成功的确认(I2C拥有此功能),没有任何形式的错误检查(如UART中的奇偶校验位等)。

UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC。

UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。

UART通信

在UART通信中,两个UART直接相互通信。 发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:

UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。

当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。

UART通信工作原理

发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。

UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:

起始位:

UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。

数据帧:

数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。

校验位:

奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。

停止位:

为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。

传输步骤

  1. 发送UART从数据总线并行接收数据: 

  2. 发送UART将起始位,奇偶校验位和停止位添加到数据帧:

  3. 整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样:

  4. 接收UART丢弃数据帧中的起始位,奇偶校验位和停止位:

  5. 接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:

UART优劣分析

没有任何通信协议是完美的,但是UART非常擅长于其工作。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:

优点:

  • 仅使用两根电线

  • 无需时钟信号

  • 具有奇偶校验位以允许进行错误检查

  • 只要双方都设置好数据包的结构

  • 有据可查并得到广泛使用的方

缺点:

  • 数据帧的大小最大为9位

  • 不支持多个从属系统或多个主系统

  • 每个UART的波特率必须在彼此的10%之内

I2C通信

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。它结合了 SPI 和 UART 的优点,您可以将多个从机连接到单个主机(如SPI那样),也可以使用多个主机控制一个或多个从机。当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD时,这将非常有用。

SDA (Serial Data) – 数据线。

SCL (Serial Clock) – 时钟线。

I2C是串行通信协议,因此数据沿着SDA一点一点地传输。与SPI一样,I2C也需要时钟同步信号且时钟始终由主机控制。

工作原理

I2C的数据传输是以多个msg的形式进行,每个msg都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的ACK / NACK位:

启动条件:

当SCL是高电平时,SDA从高电平向低电平切换。

停止条件:

当SCL是高电平时,SDA由低电平向高电平切换。

读/写位:

一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。

ACK/NACK:

消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。

寻址:

由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 —— 寻址 。

主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。

读/写位:

地址帧的末尾包含一个读/写位。如果主机要向从机发送数据,则为低电平。如果是主机向从机请求数据,则为高电平。

数据帧:

当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。

传输步骤

1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。

2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:

3. 每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。

4. 主机发送或接收数据帧:

5. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:

6. 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。

单个主机VS多个从机

由于I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。使用10位地址并不常见,但可以提供1,024(210)个唯一地址。如果要将多个从机连接到单个主机时,请使用4.7K欧的上拉电阻将它们连接,例如将SDA和SCL线连接到Vcc:

多个主机VS多个从机

I2C支持多个主机同时与多个从机相连,当两个主机试图通过SDA线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送消息之前检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正在控制总线。如果SDA线高,则可以安全地发送数据。如果要将多个主机连接到多个从机,请使用4.7K欧的上拉电阻将SDA和SCL线连接到Vcc:

优劣分析

与其他协议相比,I2C可能听起来很复杂。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:

优点

  • 仅使用两根电线

  • 支持多个主机和多个从机

  • 每个UART的波特率必须在彼此的10%之内

  • 硬件比UART更简单

  • 众所周知且被广泛使用的协议

缺点

  • 数据传输速率比SPI慢

  • 数据帧的大小限制为8位

二、RS232,RS485,RJ45,Modbus协议详解

设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。

注意到这里有三个必须满足的条件:

第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。

第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。这一点决定了插头组合的电平规范。

第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。这一点决定了电源的工作性质。

这三点其实就是电源插头组合在物理层面上的规范性协议。

再看通信接口。在有关计算机信息交换的ISO/OSI模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。

这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。注意:起始位和停止位可以合并。

再看通信接口和通信网络的工作制问题。

当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也即对讲机的通话型式,这叫做半双工。

RS422接口和RS232接口是全双工接口,而RS485则是半双工接口。

对于半双工接口,显然需要有通信的发起者,所以RS485接口和网络一定具有主站和若干从站,并且从站的数量也有规定。一般地,从站的数量是32个。

RS485主站与从站的关系问题,看似只是通信工作制的不同,其本质是通信各方对通信总线控制权的合理分配。

我们再看总线连接问题。

我们还是以电源为例。我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。只要满足电源的功率要求,显然这是可行的。

如果我们用同样的方法来引出RS485的通信线,是否可行呢?答案是否定的。我们必须从通信主站先引一条线到第一个通信子站,再从第一子站引第二条线到第二子站,如此循环直到最后一个子站。在通信线的终端,还要配一个终端电阻。在这条通信线路上,任何一点如果发生断路,则后续的通信链路上的通信也就断了。这种接线方法形象地被称为菊花瓣连接方法,或者链形连接方法,而电源的接线方法则被称为星形连接方法。

我们发现,从电气接线来看,链路是并联的。但从通信来看,链路是菊花瓣的,属于一个接一个的有秩序的连接。

现在我们可以总结一下了:

RS485的总线网络接线方式必须是链形菊花瓣的接线方式,并且属于半双工的通信方式;RS232是点到点的接线方式,属于全双工通信。不管是RS232接口,还是RS485接口,它们必须符合物理层的通信规约。

再看MODBUS-RTU通信协议:

有了物理层通信接口,是不是就能通信呢?答案是否定的。物理层通信接口只是使得通信双方具备通信条件而已。但若双方说的话谁都听不懂,或者通信双方的说话方式及语法结构不相符,显然这也无法通信。

在OSI模型中,物理层之上是数据链路层。MODBUS-RTU协议就是数据链路层协议,只要通信双方都采用了MODBUS-RTU协议,则能确保通信语言是双方都能听得懂的语句格式。

注意这里的词汇“语句”。物理层定义的是字节,相当于语言中的字,数据链路层则把字节组织成语句,也即帧。帧规定了通信双方所用语句的语法结构。

MODBUS也是主从式的。和物理层的总线控制是一样的,这里的主从关系,就是对通信总线的控制权做了规定。主站先下达命令,占用总线;接着把总线空置,交给从站去写回应码;从站完成后,再把总线还给主站。

现在我们来看看ISO的HDLC规定的帧结构,也即通信语句的语法结构,如下:

在MODBUS通信协议下,不同的命令功能码它的帧结构不尽相同。对于读寄存器命令,MODBUS的主站帧结构是:2个字节的地址码,1个字节的功能码,2个字节的数据地址码,2个字节的CRC校验码;MODBUS的从站回应帧结构是:2个字节的功能码,1个字节的回应区字节总数,N个字节的回应数据,2个字节的CRC校验码。

虽然物理层协议与数据链路层协议不同,但数据链路层协议的执行必须建立在通信双方物理层连接已经符合要求,并且已经可以无障碍地实现信息交互的基础上。

这个规则在ISO/OSI模型的七层协议中必须完全彻底地得到执行。在ISO/OSI模型中,通信双方的低层次协议必须为上层协议建立透明的无故障的连接和信息交换关系。也就是说,各层次的上下级关系必须是绝对的。

从数据链路层再往上,就是网络层了。它的任务是构成现场总线的信息交换网。

网络层的功能包括:把通信帧打包成数据分组,然后把数据分组发送给对方。

由于通信双方的网络结构可能不同,于是对于同种网就需要用网桥来连接,而异种网则需要用网关来连接。

网络之间的信道可能有多条。数据分组在发送时有多种路径可以选择。负责选择路径的元件称为路由器。路由器不但决定了真实的数据交换网络路径,还可以构建虚拟的网络路径,还要决定数据分组的发送秩序。因此,路由器是网络层中最复杂最关键的装备。

OSI模型中,把物理层+数据链路层+网络层合并称为现场总线,其通信接口就是8针的RJ45水晶头。显见,RJ45与RS232/RS485/RA422完全不是一回事。

网络层的数据分组是数据帧的组合。通俗地说,数据分组是一篇短文,或者是一页待传递的数据组合单元。

网络层在发送数据分组时,其路由问题和接收组合问题见下图:

我们看到网络层在通信时先由路由器确定路由路径,然后把分组发送到对方。对方接收到分组后,把分组按前后秩序组合起来,再解包为实际文档。

指的注意的是:由于网络层有了路由器,因此网络层支持星形网络结构。

现在我们来关注一下ISO/OSI的7层模型,如下:

需要明确的是:从网络层再往上,各层之间发送的信息单位已经是完整的报文了。OSI模型也规定了报文的语法结构,限于篇幅给予忽略。

值得注意的是:RS232/RS485/RS422通信接口以及它们的定义,是非常明确的。包括管脚的电平,管脚的功能定义,以及接口在信息发送和接收信息时的数据流时序关系,这些都必须准确和严格,否则就无法执行信息交换。

当PLC与某电力仪表交换信息,并且这些电力仪表符合RS485/MODBUS-RTU通信规范。我们要做什么事呢?

第一、我们按菊花瓣结构的通信链路要求去接线,将PLC的通信接口与N个电力仪表接口连接起来。最后一个电力仪表的末端要配100欧的终端电阻。

第二、我们把这N个电力仪表按地址递增的原则确定各自的地址,例如01H、02H、1FH等等。这里的H表示是16进制,1F表示16+15=31。

第三、我们在PLC编程软件中设定好电力仪表规定的通信速率。

第四、我们在PLC编程软件中按电力仪表的数据区地址码设定好MODBUS通信码,以及各个子站的循环关系。

注意:这里的MODBUS通信码满足PLC的IEC 61131-3编程模块要求,一般的PLC梯形图没有此功能。梯形图满足IEC 61131-1要求,但不满足IEC 61131-3要求。

第五、在PLC的内存中开辟专用数据区,存放从电力仪表读取到并处理后的信息,以便让更高层的总站来读取信息。此数据区有一个名称,叫做数据点表,有时也简称通信协议。

最后,当然就是开机测试了。其中的内容很多,限于篇幅不再介绍。

我们来看一个在RS485网络上用MODBUS-RTU读取数据的例子,如下:

某电力仪表,地址是01H。在电力仪表内存第2000的位置上,放置了三相电流和三相电压等6个数据,每个数据占用两个字节,共12个字节。

此电力仪表的通信速率是9600bps。什么意思呢?bps表示一个0/1,也就是比特,这说明每秒钟这条总线上可以发送9600个比特。我们已经知道一个字节有8个数据位,1个起始位,1个奇偶校验位,刚好10位或者10个比特,所以,如果电力仪表的通信速率是9600bps,那么1秒钟就可以发送:9600/10=960个字节。

我们还知道,主站的读数据的帧结构(下行帧)中,有1个字节的地址,1个字节的功能码,2个字节的内存地址,2个字节的数据数量,2个字节的CRC校验码,总共有8个字节,所以主站发送读数据MODBUS通信帧占用的时间是:8X10/9600=8.33毫秒。

对于本例,我们知道MODBUS-RUT读数据的命令是0X03H,也即03命令。注意这里的写法:0X是字头,中间的03是命令,最后的H表示是16进制。

具体通信帧的是:01 03 07 D0 00 06 C5 45,其中0X01H是地址,0X03H是命令,0X07D0H是内存地址2000,0X0006H表示读取连续6个字,也即内存中的电流和电压参数,0XC545H是01 03 07 D0 00 06的CRC校验码。

那么电力仪表的回应帧(上行帧)的帧结构是:1个字节的地址,1个字节的功能码,1个字节的数据区字节数,12个字节的数据,2个字节的CRC校验码,总共17个字节,占用时间是:17X10/9600=17.7毫秒。

具体的仪表回应通信帧是:01 03 0C 00 64 0064 0064 00 DC 00 DC 00 DC D6 F5,其中0X01H和0X03H的意义同前,0X0CH表示上传数据区有12个字节,0X0064H表示A相电流为100A,后面的两组为B相和C相电流,均为100A,0X00DCH表示A相电压为220V,其后两组为B相和C相电压,均为220V,最后0XD6F5H为CRC校验码。

从主站发起下行通信帧,再等待10毫秒让从站回应,再接收到从站发还的上行通信帧,总历时为:

如果有31个相同的仪表等待主站一一访问,则主站从访问第一个仪表开始,到最后回应完毕,总历时:

这里的1.12秒就是在通信速率为9600bps下这31台仪表的读数据循环周期,且忽略了主站再次发送下行通信帧的等待时间,实际时间会略微再长一些。

相信,看到这里,大家对MODBUS-RTU下的通信帧应当有了较为深刻的认识。

提醒大家:一个字有两个字节。一般地,字节只能用来表达8个开关量。但对于模拟量,则要用字来表达。例如电流1250A,16进制下是04E2H,要用2个字节才能表达完整。也因此,各种电力仪表中,模拟量都是用字来表达的。

以下是MODBUS的部分常用功能码,也即命令码:

以下是PLC在读取双投开关ASCO控制器的数据点表的下行和上行通信帧范例:

几个相关的问题解释一下:

1)有些现场总线,用令牌解决了总线的控制权问题。

大家很容易想到,如果从站有紧急事项需要主站来服务,可是MODBUS规定了轮询规则,等到自己的时候,可能会太迟了。于是许多现场总线就发明了一个特殊的东西,叫做令牌。令牌很短,只有一个字节,它可以很快地在总线上传递。令牌在各站点中传递,谁拿到令牌,谁就是主站,就可以发布信息。如果本站没有事情需要发布,就把令牌交给下一个站点,由此解决了总线占用问题。

2)当链路发生断路时,为了避免出现通信中断,可采用双主站措施。双主站(PLC的两个主站RS485接口)之间用握手线连接,平时主用RS485开通,而辅助RS485浮空。浮空的RS485虽然接在总线上,但它处于高阻态等效于完全脱离。当发生断路时,从站确认后立即开通通信,从链路两头进行连接通信。

有时,还采取环状通信措施。限于篇幅,不做介绍。

3)MODBUS可工作在网络层,此时协议变为MODBUS-TCP,但还是符合主从结构。

4)MODBUS协议是美国莫迪康公司发明的,该公司的宗旨是:MODBUS协议为不收费的公开协议。后来莫迪康公司被施耐德公司收购了,施耐德公司继承了莫迪康公司的做法,MODBUS是不收费的公开协议。既然MODBUS已经成为施耐德的协议,施耐德把它延伸到网络层,构建了网络层的MODBUS-TCP协议,以及内部专用的MODBUS-PLUS协议。限于篇幅,对于这两个协议的描述此处从略。

5)关于RS232和RS485的区别

学过模电和数电的人都知道差分电路。差分电路具有共模抑制比,能够消除共模误差。RS485接口就具有此特征。因此RS232接口的传输距离仅为十几米,而RS485/RS422接口的传输距离为1200米。

我们从图中看到,虽然RS232和RS485接口的外形是一致的,但它们的性能和信息交换模式不同,因此抗干扰能力也不同。

6)当距离很长的时候,RS485接口还可以接入光纤,但需要配备1对光纤转换器。之所以要1对,是因为其中一只用于电转光,而第二只则用于光转电。光纤收发器中间的通信介质就是光缆或者光纤。(注意哦,光纤是光缆的芯线,不要以为是两种东西)

光纤分为单模和多模。单模的光纤较细,光在传输过程中反射较少,因而失真小,其传输距离可达15km以上;多模的光纤较粗,光在传输过程中反射较多,因而失真大,其传输距离为1.5km。

7)CRC校验码是二进制不借位的除法,用以做接收信息是否出错的检验。

注意这里的f(x)就是除去CRC校验码的MODBUS通信帧,除数是CRC16。帧中的CRC是运算后的余数。

主站在发送帧之前,把帧先做CRC计算,再把CRC运算的余数附在帧尾发送给从站。从站接收到帧后,先对帧除去CRC的部分做CRC运算来检验是否正确,若不正确,从站要求主站重发。

同理,当从站发送信息给主站时,主站也根据CRC来检查数据的正确性。若发现错误,则要求从站重发。

8)关于MODBUS-RTU、MODBUS-ASC和MODBUS-TCP

如果MODBUS中字节表达数据的方式采取BCD码,则被称为MODBUS-RTU;如果MODBUS中字节表达数据的方式采取ASCII码,则被称为MODBUS-ASC;如果MODBUS运行在网络层上,则被称为MODBUS-TCP。

ASCII码的内容如下:

MODBUS在实际使用中,大多数都采用BCD码,因此MODBUS-RTU得到广泛应用。

BCD码如下:

值得注意的是:在协议使用中,数据帧中的数值都是用16进制数来表达的。例如100A电流写成0X64H,而380V电压则写成0X17CH。

9)关于RS485网络使用的双绞通信线和接地

我们知道,两条平行的线缆之间会有分布电容,而分布电容会削弱信号的强度。为了消除分布电容,通信线的两条平行线需要按一定长度互相旋转对绞,这种线被称为双绞线。双绞线的对绞长度有规范,它与通信速率密切相关。在实际使用时,要按通信速率来选择合适的双绞线。

双绞线的外层有屏蔽层。屏蔽层必须单点接地,不得在线头线尾同时接地,防止地电流流过引起干扰。在实际布线时,采取各线段独立接地,切忌采用所有线段的屏蔽层前后连接统一接地的做法。

10)关于菊花瓣的通信链路连接方式

绝对的菊花瓣链形网络是不存在的。事实上,我们用菊花瓣链形接线方法构建的通信网络中,各个节点是接线端子,由接线端子通过双绞线连接到各个子站,这些双绞线就构成了类似的星形结构,我们不妨把这种接线方式称为链形网络下的准星形接线。

在工程实践中证明,准星形接线的长度不得超过70cm。一旦超过,则可能出现通信不稳定状态。

事实上,70cm也成为行业中的一条不成文的质检规范。

100欧终端电阻在通信速率低时可加可不加,但当通信速率较高时(高于19.2kbps),建议一定要加。例如PROFIBUS下的RS485网络,终端电阻已经植入终端设备中,只需拨动开关即可加入或者撤离。

终端电阻的用途是吸收反射波。

我们在两棵树间紧紧地绑上一根绳子,接着敲击绳子的某一侧,我们会看到有传导波向另一端传去,并能看到反射波。如果敲击的频率适当,则在绳子中间出现波的不动点,这叫做驻波。

对于通信来说,不管是反射波还是驻波,将严重影响通信质量。终端电阻用于吸收反射波,并且可提升最终子站的电平水平。

RS485和MODBUS这两个概念,都需要通过实践去掌握它们,单单凭着阅读文本,很难理解和掌握。如果这篇小文能给大家的实践活动带来益处,我会感到分外欣慰。

三、RS485切换方向的方法及优劣势

RS485作为常见的总线之一,几乎每个工控设备都在用,我们也对其熟悉不过了。我们都知道RS485双半双工通信,其CPU内部的根源是串口通信,串口通信是区分发送TX和接收RX的,在同一对差分信号线上同时传输TX、RX,就是进行方向的控制,方向的控制时机不对,数据传送是要出问题的。

例如下图1、图2中,CPU端的TX信号发送完毕后约100uS后方向引脚 拉低,切换到接收状态,但是在TX信号发送完毕后60uS从机就回复了的RX信号,由于此时还是处于RS485芯片还是处于发送状态,此时的接收数据将会被忽略,在系统层面就是体现为数据接收丢包。

图1 RS485 接口电路

有些读者会可能回想,只要从机回复数据晚一些,不要这么快速回复,就不存在这个问题了。但是从机一般都是客户的机器,我们几乎不可能要求别人更改回复时间。例如三菱的Fx3U PLC作为从机时,从主机发送数据结束到从机回复数据,只用了60uS,部分控制板,甚至回复时间在10uS以内。

研究RS485的方向切换的目标就是:RS485总线空闲时要处于接收状态,如果有主机发送数据,则置高方向引脚,发送完成及时切换到接收状态。

1、RS485方向切换的方案1:使用反相器自动切换

大部分的低成本RS232-RS485转换器采用了这种方法。具体的实现方法是:把串口的发送信号TX作为反相器的输入,反相器的输出则用来控制RS485收发器的收发控制引脚,同时在RS485收发器的A/B输出端加上上拉/下拉电阻,具体电路如图3所示。

图3 使用反相器自动切换电路

在空闲状态下,串口的发送信号TXD为高电平,经过反相器后输出低电平,使485芯片处于接收状态,而RS485总线由于上下拉电阻的作用处于A高B低的状态。当发送数据时,TXD信号线上的低电平比特位控制485芯片进入发送状态,将该比特发送出去。而高电平比特位则使485芯片处于接收状态,由于RS485总线上下拉电阻把总线置于A高B低的状态,即表示发送了高电平。

简单说,这种电路,就是发送低电平时,485芯片是 发送状态,而发送高电平时,485芯片属于接收状态。

优势:

只需要增加一个反相器就可以实现,无需软件的干预,反相器可以使用一个三极管即可以实现,成本十分低廉(几分钱);

劣势:

由于上下拉电阻不可能选值太小,否则会影响正常发送的数据电平。所以这种换向模式在发送高电平时的驱动能力,并且,理论上我要求方向引脚要比数据先切换方向,但是由于方向引脚经过了反相器,达到芯片的时间变长了,比数据晚到,所以速率太高的情况容易丢包。如果需要驱动多个从设备,就会显得力不从心,并且驱动能力太弱,只能短距离传输;并且传输速度不能太快,一般使用9600bps。

2、RS485方向切换的方案2:使用软件控制方向

市面上大部分的内置RS485的产品基本都是采用此类的方案,如下图4中的RS_EN引脚。具体的 实现方式是:在空闲器件,RS_EN 为低电平,MCU处于接收状态,在准备发送数据之前,MCU会拉高RS_EN,U1处于发送状态,发送完毕之后,RS_EN重新处于低电平,U1处于接收状态。

图4 使用软件控制方向切换

此类方案的关键是软件需要掌握好RS_EN引脚的高低电平的时机,假设发送完数据后,没有及时切换到接收状态,而此时从机又回复数据,此时就会引起丢包,就会出现文章开头图2中的情形。不幸的时,软件工程师的水平参差不齐,特别是在运行操作系统(Linux、WIndows等)以后,想要十分准确控制方向引脚的高低电平已经十分困难。

优势:

无需增加任何的硬件成本,且RS485的驱动能力不受影响。

劣势:

依赖于软件控制方向引脚,如果运行复杂的操作系统,控制引脚的优先级不够高,或者软件的优化的不够好,都会导致方向引脚的切换不及时,到时数据的丢包。并且,是否丢包还取决于从机的回复时间,测试过程不一定能够测试出来。

3、RS485方向切换的方案3:使用触发器控制方向

为了克服反相器换向的缺点,出现了一种由RS触发器控制的自动换向技术,如图5所示。这个电路的关键是反相器和RS触发器之间的由二极管、电阻、电容组成的充放电电路。在空闲状态下,485芯片仍处于接收状态。

当TXD信号线上发送数据的低电平起始位时,反相器输出高电平,通过二极管为电容迅速充电,使RS触发器R端为高电平,S端为低电平,触发器输出高电平,把ISL3152E置于发送状态;当TXD信号线转换为高电平时,反相器输出低电平,电容通过电阻缓慢放电,使得R端暂时仍处于高电平状态,加上S端的高电平状态,使触发器的输出保持前面的高电平状态,485芯片仍处于发送状态。电容经过一段时间放电后,R端电压转变为低电平,则触发器输出低电平,把485芯片置回接收状态。

通过选择电阻和电容值,我们可以控制放电速度,使得一个低电平的起始位足以在整个字节发送。此类方案参数一致性非常差,实际使用的都是技高人胆大的。

图5 使用触发器切换方向

优势:

无需软件干预切换方向,驱动能力强(取决于RS485芯片)。

劣势:

  • 增加的器件较多;

  • 不同的波特率需要匹配不同的RC参数

  • 温度、老化、一致性等问题,会导致RC参数变化,从而导致切换时间错乱导致丢包。

4、RS485方向切换的方案4:max13487芯片

为了克服软件参与的方向控制不确定性,美信公司发布了宣称首款支持芯片自动换向的RS485芯片,如下图6,对比其他的RS485芯片,MAX16487的/RE引脚有两个用于:

  • /RE为低电平时,打开RO方向的接收数据。

  • /RE为高电平时,芯片进入自动方向切换模式。

一般使用我们将/RE连接高电平,即自动换向模式。

图6 MAX13487 内部框图

由于美信没有公布内部的逻辑原理,只描述内部有一个状态机,我们只能外部猜测其工作原理:

  • 空闲模式下,数据流方向为RO方向;此为状态1;

  • 当串口端有数据发送时,由于起始位为低电平,经过逻辑功能D后,A<B,经过COM

  • 逻辑功能且反相后,RI为高电平。此状态为数据发送状态2。

  • 经过一系列的逻辑运算(以RI、DI为输入,但是不知道其内部的原理);状态机检测到数据发送完毕,芯片变成接收状态1。

优势:

由芯片自动切换方向,无需软件干预切换方向,驱动能力强,通信速率高,MAX13488 宣称最高可以到16Mbps,与普通的RS485芯片性能一样。

劣势:

价格比普通的RS485芯片贵一倍以上。

5、RS485方向切换的方案5:周立功芯片RSM(3)485PHT

周立功公司将RS485的三个相关的功能模块:DC电源、隔离、RS485芯片三合一,封装在同一个芯片内部,由于没有内部的资料,我们无法获知其内部的逻辑功能。官方资料宣称最高速率可以达到500Kbps,对于一般的应用足以。

优势:

由芯片自动切换方向,无需软件干预切换方向,驱动能力强,通信速率高,DC电源、隔离、RS485芯片功能三合一,节省板卡空间。

劣势:

价格比分立器件搭建RS485电路贵,且一旦损害需要要整体更换。

图7 RSM(3)485PHT原理图

6、总结

上述我们提供了5种RS485自动切换方向的方法:分别是反相器法、软件控制法、触发器法、美信MAX13488芯片、周立功RSM(3)485PHT。

反相器法由于驱动能力太弱、速率太低,仅适用于要求不高的调试场合,工控场合慎选。

软件控制法对软件的要求较高,特别是带操作系统的芯片,软件控制的时机较困难。

触发器法由于参数一致性太差,只适合波特率恒定、速率不高的场合。

whaosoft aiot http://143ai.com

四、485接口EMC电路设计

原理图

1 RS485接口6KV防雷电路设计方案

上图,RS485接口防雷电路。

接口电路设计概述:

RS485用于设备与计算机或其它设备之间通讯,在产品应用中其走线多与电源、功率信号等混合在一起,存在EMC隐患。

本方案从EMC原理上,进行了相关的抑制干扰和抗敏感度的设计,从设计层次解决EMC问题。

2 电路EMC设计说明

(1) 电路滤波设计要点:

L1为共模电感,共模电感能够对衰减共模干扰,对单板内部的干扰以及外部的干扰都能抑制,能提高产品的抗干扰能力,同时也能减小通过429信号线对外的辐射,共模电感阻抗选择范围为120Ω/100MHz ~2200Ω/100MHz,典型值选取1000Ω/100MHz;

C1、C2为滤波电容,给干扰提供低阻抗的回流路径,能有效减小对外的共模电流以同时对外界干扰能够滤波;电容容值选取范围为22PF~1000pF,典型值选取100pF;若信号线对金属外壳有绝缘耐压要求,那么差分线对地的两个滤波电容需要考虑耐压;

当电路上有多个节点时要考虑降低或去掉滤波电容的值。C3为接口地和数字地之间的跨接电容,典型取值为1000pF, C3容值可根据测试情况进行调整;

(2) 电路防雷设计要点:

为了达到IEC61000-4-5或GB17626.5标准,共模6KV,差模2KV的防雷测试要求,D4为三端气体放电管组成第一级防护电路,用于抑制线路上的共模以及差模浪涌干扰,防止干扰通过信号线影响下一级电路;

气体放电管标称电压VBRW要求大于13V,峰值电流IPP要求大于等于143A;

峰值功率WPP要求大于等于1859W;

PTC1、PTC2为热敏电阻组成第二级防护电路,典型取值为10Ω/2W;

为保证气体放电管能顺利的导通,泄放大能量必须增加此电阻进行分压,确保大部分能量通过气体放电管走掉;

D1~D3为TSS管(半导体放电管)组成第三级防护电路,TSS管标称电压VBRW要求大于8V,峰值电流IPP要求大于等于143A;峰值功率WPP要求大于等于1144W;

3 接口电路设计备注

如果设备为金属外壳,同时单板可以独立的划分出接口地,那么金属外壳与接口地直接电气连接,且单板地与接口地通过1000pF电容相连;

如果设备为非金属外壳,那么接口地PGND与单板数字地GND直接电气连接。

PCB设计

1 RS485接口电路布局

上图,RS485接口滤波及防护电路布局。

方案特点:

(1)防护器件及滤波器件要靠近接口位置处摆放且要求摆放紧凑整齐,按照先防护后滤波的规则,走线时要尽量避免走线曲折的情况;

(2) 共模电感与跨接电容要置于隔离带中。

方案分析:

(1)接口及接口滤波防护电路周边不能走线且不能放置高速或敏感的器件;

(2) 隔离带下面投影层要做掏空处理,禁止走线。

2 RS485接口电路分地设计

方案特点:

(1)为了抑制内部单板噪声通过RS485接口向外传导辐射,也为了增强单板对外部干扰的抗扰能力,在RS485接口处增加滤波器件进行抑制,以滤波器件位置大小为界,划分出接口地;

(2)隔离带中可以选择性的增加电容作为两者地之间的连接,电容C4、C5取值建议为1000pF,信号线上串联共模电感CM与电容滤波,并与接口地并联GDT和TVS管进行防护;且所有防护器件都靠近接口放置,共模电感CM置于隔离带内,具体布局如图示。

方案分析:

(1)当接口与单板存在相容性较差或不相容的电路时,需要在接口与单板之间进行“分地”处理,即根据不同的端口电压、电平信号和传输速率来分别设置地线。“分地”,可以防止不相容电路的回流信号的叠加,防止公共地线阻抗耦合;

(2)“分地”现象会导致回流信号跨越隔离带时阻抗变大,从而引起极大的EMC风险,因此在隔离带间通过电容来给信号提供回流路径。

嵌入式分享~IO相关2 ##相关推荐

  1. 嵌入式分享~IO相关1 ##

    这里仅总结一下IO控制相关及这种总线等  ~持续更新 一. 单片机IO直接驱动继电器 上图是随便找到的两个不同型号的继电器.继电器就是个开关,这个开关是由它内部的线圈控制的,给线圈通电,继电器就吸合, ...

  2. 嵌入式分享~开关相关1 ##

    一.接近开关的功能原理和用途 (其实也可叫行程开关) 接近开关是一种无需与运动部件进行机械直接接触而可以操作的位置开关,当物体接近开关的感应面到动作距离时,不需要机械接触及施加任何压力即可使开关动作, ...

  3. linux嵌入式 控制io口,基于ARM9嵌入式的RS485总线接口设计,自动控制IO口实现通信方向控制...

    描述 随着ARM处理器应用的范围的不断深入,根据需求的不同ARM提供的外设也越来越丰富,常用的通信接口有RS232.RS485.CAN.以太网等.RS485总线凭其传输距离远.抗干扰能力强.价格低廉等 ...

  4. 与IO相关的等待事件troubleshooting-系列9

    Buffer Cache与IO相关的等待事件: 这种等待事件的产生原因是包含DBWR进程和IO Slaves的Buffer Cache操作. 'db file parallel write' , 'd ...

  5. java io运用_Java IO相关使用

    date: 2020-06-14 14:42:22 updated: 2020-08-21 17:35:45 Java IO相关使用 1. 文件 创建 File 对象的三种方式 一个路径名:File( ...

  6. vue如何获取年月日_好程序员web前端教程分享Vue相关面试题

    好程序员web前端教程分享Vue相关面试题,Vue是一套构建用户界面的渐进式框架,具有简单易用.性能好.前后端分离等优势,是web前端工程师工作的好帮手,也是企业选拔人才时考察的重点技能.接下来好程序 ...

  7. 嵌入式分享合集105

    一.智能灯光控制系统(基于stm32) 带你走进物联网的世界说一个整天方案哦 这次是基于stm32的 当然你可以用esp "智能光照灯"使用STM32作为系统的MCU,由于单片机I ...

  8. 嵌入式分享合集102

    一.嵌入式开发Bug定位解决 一.问题复现 稳定复现问题才能正确的对问题进行定位.解决以及验证.一般来说,越容易复现的问题越容易解决. 1.1 模拟复现条件 有的问题存在于特定的条件下,只需要模拟出现 ...

  9. 2003引脚功能电压_嵌入式篇-IO引脚

    IO引脚即输入输出引脚,可以说是数字电路中最为基础的部分.就像我们在学习一门新的语言,我们都会先去编写一个"hello,world"的程序一样,我们学习嵌入式往往做的第一个例程,就 ...

最新文章

  1. C++数值极限numeric_limits
  2. PHP的htmlspecialchars、strip_tags、addslashes解释
  3. ActiveMQ(为什么要使用消息中间件,JMS传输模型)
  4. 第一个WebService案例
  5. Emacs, Vi, Lisp, Logo, 小众语言集中营
  6. componentsJoinedByString 和 componentsSeparatedByString 的方法的区别
  7. P5135-painting【组合数学】
  8. 一些有用的javascript实例分析(二)
  9. 创业者自述:我的第一桶金是如何来的
  10. **print('人生苦短 我爱Python')**
  11. 【重难点】【Java集合 02】Set、List、Map 的区别、常见的线程安全的集合类、Collection 为什么只能在 Iterator 中删除元素
  12. python 自动登录网站_分析某网站,并利用python自动登陆该网站,下载网站内容...
  13. (转)快与慢(上):AI应用于投资领域的现状与未来
  14. C/C++:构建你自己的插件框架(1)
  15. 航空公司客户价值分析完整版
  16. 硬件机械测试项目及判据
  17. centos linux安装网卡驱动,如何在CentOS系统下安装网卡驱动
  18. NUAA 南航操作系统实验 代码部分
  19. STM32F103 GPIOA->CRL=0XFFF0FFFF配置端口方向
  20. 昌吉学院计算机工程系毕业后安排工作嘛,经济贸易分院成功举办昌吉学院与我院本科教学与学生工作对接会...

热门文章

  1. 用3D技术实现2D场景
  2. SGAT: a Self-supervised Graph Attention Network for Biomedical Relation Extraction
  3. 不为人知但堪称神器的5款软件,用过的人都爱不释手
  4. 五行中的土在哪个方位_五行之土
  5. SPI : Service Provider Interface
  6. Ubuntu16安装OpenJDK7
  7. 每日阅读2021.11.22
  8. c语言 调用动态链接库,LandyTan
  9. TL-WAR1200L,TP-LINK企业级路由器远程开机设置,手机开启windows电脑操作方法
  10. 用vb删除mysql数据库数据_学习VB编程第99天,如何正确使用delete删除数据