串口总线电路设计及简单的软件通信协议
背景
在嵌入式设计中,有时我们会遇到串口总线的设计,此类设计通常出现在一些总线电机、总线舵机类的控制上。其根本是将全双工的串口通信转化为半双工的通信,目的是做到同一个串口可以控制多个从机设备,同时延长通信的距离。当然,从机也必须要有mcu和相应的硬件电路,才能正常进行通信。市面上有一些总线电机和舵机,用的即是此原理。
引言
本文着重于介绍如何通过纯硬件的方式设计电路实现串口全双工到半双工的转换,并且会简单介绍一些总线电机/舵机会用到的通信协议。若有谬误之处,恳请各位指正。
一、电路原理
常见的UART通信只需要三根引脚 ,分别是TX、RX、GND引脚,转化为总线,我们需要保证通信双方既能通过总线发送数据,也能通过总线读取数据,同时尽可能的避免通信上的冲突。这里我们以任意带有UART的单片机为例(不考虑部分单片机内置的单线半双工模式),通常情况下TX配置为推挽输出,RX为高阻输入。接下来介绍一些简单的方案
1.串口的TX能配置成开漏输出模式
这种情况下,只需要简单地在硬件上面将RX和TX引脚接在一起就行了,需要注意给总线接上拉电阻。具体通信时,当单片机TX向外发送数据时,需要注意在软件上屏蔽串口接收,否则就会出现TX发送的数据被自身的RX接收的情况
2.串口不能将TX配置成开漏输出模式(常见的STM32F1系列)
因为串口不能将TX配置为开漏,即默认推挽,如果将TXRX直接接在一起,通信双方连在总线上时,如果一方发送数据拉低总线,另一方的TX为推挽,直接导致短路烧坏芯片。因此可做如下处置。将RX连接到总线上面,TX通过一个电阻连接到RX上面,空闲时TX为高电平,可以起到对总线和RX拉高的作用。同样,该方案发送数据时也需要屏蔽数据接收。
3.纯硬件方案
上述两种方案均需要在软件上进行配置,过于麻烦。因此我们想设计一种纯硬件的电路,核心的问题就是(1)对RX屏蔽TX发送的信号(2)屏蔽TX的推挽输出。这样就不需要在软件上进行过多的配置。根据上面的分析,这里使用三态缓冲器设计电路满足这一需求。具体如下图所示:

其中~TX为TX反相的信号。
当串口空闲时,TX为高电平,~TX为低电平,U11A不导通,U11B导通,总线由R11上拉至高电平。当单片机开始向外发送数据时,TX为低电平,U11A导通,总线被拉低,数据正常传输,同时U11B不导通,对RX屏蔽了来自自身TX的信号。当总线上来了来自其他设备的数据被拉低时,RX也能正常接收到数据。
这里我们使用一款带有四个缓冲器的芯片来完成上述过程

芯片型号为SN74HC126DRE4,带有四个缓冲器,具体参数不过多介绍,请参考数据手册。介绍一下上图4个缓冲器的作用:缓冲器1始终导通,用于增强信号的驱动能力;缓冲器2相当于前面图中的U11B;缓冲器3相当于前面图中的U11A;缓冲器4的A脚接地,用于将TX的信号反相,然后接到缓冲器3的控制端。
具体原理前文中已经有了介绍,不再赘述。上图只是一种设计方法。当然对于TX信号的反相,也可以使用一个反相器来解决.....
二、软件通信方案
上述的总线串口通常应用于对一些总线电机/舵机的控制。本质上是单片机一对多的通信,通过上述的硬件原理介绍,不难发现这种设计方案在进行通信时具有广播和线与的特性,即单设备发数据所有都可以接收以及多个设备可以同时拉低总线。因此,接下来的软件协议着重于介绍如何避免多设备间通信的冲突。
1.控制时如何对单个从设备进行控制
对每个从设备进行编号,在做数据协议时,只读取与自己id所匹配的数据帧。控制端只需要在数据帧中加入需要控制的设备的id即可。那么如何对设备进行编号呢?可以专门设计一个数据帧,将在总线上的设备id设置为特定的编号,这样只需要保证每次总线上只有一个设备,就可以只对该设备进行编号,以此类推,就可以对多个从设备进行编号了。
2.如何接收多个从设备发送的数据
(1)最简单的方法肯定就是单片机采用轮询的方式,每次都只向一个从设备发送指令让从设备发送数据,这样每次同时只会有一个从设备发送信息。
(2)因为总线通信有广播的特性,单片机也可以对所有设备发送信息。从设备可以根据自己的编号计算延迟发送的时间,这样每个设备发送数据时不在同一时间,也可以避免总线上的设备冲突。但这样做的前提就是每个从设备都要正确编号,否则也会出问题。
特别鸣谢一篇文章,对于硬件电路更深入的解释,请参考该文章:https://oshwhub.com/article/half-duplex-convert
浙公网安备 33010602011771号