前言
最近在研究单总线串口通信,整理了一下,写成这篇文章。
有纰漏请指出,转载请说明。
学习交流请发邮件 1280253714@qq.com
单总线串口通信分析
单总线串口通信使用单根信号线来同时实现数据的发送和接收,以及设备的识别和通信控制。这种通信方式相对于1-wire协议(DS18B20、DHT11)来说,没有复杂的时序控制,软件上不需要太复杂的处理方式(如果MCU内部集成硬件串口的话)。单总线串口通信,一般为应对短距离(3M内)低速率(9600、115200)通信;同时,相比传统的RX对TX,能够做信号的隔离、防静电,且支持一主多从通信方式;且只需少量的器件就实现单总线通信,省去RS485芯片的成本。另外,这种通信方式由于用开关管做信号处理,做了电平转换,所以可以兼容5V和3.3V的设备进行通信。
类似于RS485,这种单总线串口需要定义主从机,以避免总线上数据的混乱。同时,设备之间需要进行共地,以减少由于地电位差引起的共模干扰。同时,需要注意的是,这种通信方式一定会出现自发自收的情况,所以需要软件设置发送数据时禁止接收,或者是协议上定义设备地址信息,当收到本设备数据时进行丢弃(可能唯一的好处是能够校验发出的数据与接收的数据是否一致)。
方案1:
总结
TX为高,总线为低,对方接收RX为高
TX为低,总线为高,对方接收RX为低
该电路中,数据通过TXD发出,当TXD发出高电平信号时,三极管Q6导通接地,此时
总线上为低电平,当TXD发出低电平信号时,三极管Q6截止,由于上拉电阻的存在,此时
总线为高电平信号;同理,RXD接收数据时,总线为高电平时RXD为低电平,总线为低电平时RXD为高电平;Q1、Q2两个三极管在电路中类似非门,发出的数据和接收的数据经过三极管后将被取反,因此,总线上读出的数据是被取反后的数据,但是由于主机和从机都使
用了电路,实际接收到的数据是被取反了两次的数据,取反两次的数据和原数据保持一致。
正常情况下,该电路会出现自发自收的情况,导致通信不正常。所以需要在发送时禁止接受中断,发送完再打开;或者通过通信协议,判断接收到不属于己方接收的数据时进行丢弃。
正常状态下,总线空闲时是高电平;此时假如三极管打开,总线被拉低,导致无法接收数据,所以数据发完要将TXD设置为低电平。
这种电路也做了电平转换,也就是3.3V和5V单片机的系统都能适配这套电路。但是要注意,总线只能有一方做上拉。
方案2:
总结
TX为高,总线为高,对方接收RX为高
TX为低,总线为低,对方接收RX为低
该电路中,数据通过TXD发出,当TXD发出高电平信号时,Q18导通,Q17截止,由于上拉电阻的存在,此时总线上为高电平,当TXD发出低电平信号时,Q18截止,Q17导通,此时总线为高电平信号;同理,RXD接收数据时,总线为高电平时RXD为高电平,总线为低电平时RXD为低电平;这套电路结构,使得发出的数据和接收的数据相同,因此,总线上读出的数据也与发送的数据相同。
正常情况下,该电路会出现自发自收的情况,导致通信不正常。所以需要在发送时禁止接受中断,发送完再打开;或者通过通信协议,判断接收到不属于己方接收的数据时进行丢弃。
这种电路也做了电平转换,也就是3.3V和5V单片机的系统都能适配这套电路。但是要注意,总线只能有一方做上拉。
方案3:
总结
TX为高,总线为低,对方接收RX为高
TX为低,总线为高,对方接收RX为低
该电路中,数据通过TXD发出,当TXD发出高电平信号时,Q20截止,此时总线上为低电平,当TXD发出低电平信号时,Q20导通,此时总线为高电平信号;同理,RXD接收数据时,总线为高电平时RXD为低电平,总线为低电平时RXD为高电平;Q20、Q21在电路中类似非门,发出的数据和接收的数据经过三极管后将被取反,因此,总线上读出的数据是被取反后的数据,但是由于主机和从机都使用了该串口转总线电路,实际接收到的数据是被取反了两次的数据,取反两次的数据和被取反之前的数据保持一致。
正常情况下,该电路会出现自发自收的情况,导致通信不正常。所以需要在发送时禁止接受中断,发送完再打开;或者通过通信协议,判断接收到不属于己方接收的数据时进行丢弃。
这种电路做了电平转换,也就是3.3V和5V单片机的系统都能适配这套电路。这里双方不管是上拉3.3V还是5V都可以进行适配。