我们嵌入式系统的总线接口可以分为两类,一类是并行接口,另一类是串行接口。
并行通信就是用多个数据线,每条数据线表示一个位来进行传输数据,串行接口就是一根数据线可以来一位一位地传递数据。
从上图也可以看出,并行通信的优点就是传输效率高,缺点就是占用的数据线比较多。而串行通信的优缺点是和并行通信相反的,优点是省数据线,缺点是传输速率较低。
并行通信用的不是很多(跟串行通信相比),我们就记几个总线知道它们是并行的就行:IEEE488,SCSI,MXI。
串行将数据一位一位传输,也就是每一位数据都占一段固定的时间长度。
通信模式上分为三种:单工,半双工,全双工。
单工就是只能是A给B传输数据,而B不能给A传输数据,也就是数据是单向流动的。
半双工就是A和B可以相互发送数据,但是不能同时发送,也就是A给B发的时候B不能给A发,而B给A发的时候A不能给B发,因为数据线就一条,两边同时发会让信号混在一起。
全双工就是A和B在任何时候都可以给对方发送数据,一般是拥有多条数据线的时候才能实现。
通信方式上分为两种:同步和异步。
同步通信对硬件的要求比较高,因为需要双方的时钟信号一致(同频同相),但是传输速率高,因为不需要过多的控制位去控制双方同步。同步通信可以将多个字符聚集成一个字符块,在字符块的开始和结尾加上同步字符,这和异步差不多,区别在于同步通信传输的字符块可以有多个bit,而异步通信则是较少的bit组成一个字符块,可以参考我们之前说过的UART,我们常用的配置是8位数据位,一位停止位,无校验位,也就是说一个字符块只有一个Byte。
异步通信的数据是一帧一帧传输的,每帧数据需要包含起始位,数据位,校验位(不一定要),停止位,因此每次发送数据,实际上发送的内容中只有中间的数据位才是有用的数据,因此跟同步相比,数据传输的速率较低。但是好处就在于对硬件的要求低,我们用软件模拟都行。不需要同步时钟,还是拿UART举例,我们用串口通信的时候只需要通信双方共地,然后连接RX和TX即可对吧,不需要同步时钟。
关于接口我们再介绍一下RS家族(Recommand Standard,推荐标准):
RS-232,由美国电子工业协会提出的一种串行通用接口标准。在这个规定中规定了25条线,但是实际上我们只用九条线,也就是DB-9的插接件。
可能小伙伴一听到这个RS-232就懵逼了,但是实际上我们都见过(应该吧)。
在实验室里还蛮常见的,一些看起来很屌的仪器用的通信接口用的都是这些。
我们就拿上面的图片来简单介绍一下这九根线分别是做什么的。
上图中有标号1、5、6、9,1和5之间大家脑补一下2~4,6和9之间大家脑补一下7和8。
1、CD,载波检测,用于通知是否处于在线状态。
2、RXD,接收数据线。
3、TXD,发送数据线。
4、DTR,数据终端就绪,高电平时表示可以传输数据。
5、SG,接地信号线。
6、DSR,数据设备就绪。
7、RTS,请求发送。
8、CTS,清除允许发送。
9、RI,振铃提醒。
虽然RS-232已经从原本的25条线被砍到9条线了,但是我们可以更极端一点,只连接RXD,TXD和SG(共地)就可以进行最简单的通信了,就跟我们的串口通信一样了。
在RS-232的基础上还有RS-422和RS-485。
RS-422是RS-232的改进版,将原本的RXD和TXD替换成了差分信号,也就是平衡传输。
原本我们用一根TXD(RXD)就用来传输信号了,高电平就是逻辑1,低电平就是逻辑0,但是这种方式很容易受外界干扰使得传输出现误差。
差分信号则是使用两根线来传输信号,逻辑1就是其中一根数据线是+5V(举个例子,这边可以看成是+nV),另一根数据线是-5V,则两根数据线的电压差就是10V,这表示逻辑1。逻辑0则是两根数据线都是0V(也是举个例子,实际上两根数据线的电压差相差不多即可)。这样使用差分信号,那么就算干扰,也是两根数据线一起受到干扰,它们之间的电压差不会有很明显的改变,也就是传输更加可靠了。并且因为是全双工的,因此传输线路有两条,每条需要两根差分信号线,所以在极简的状态下只需要4根数据线即可(RXD-,RXD+,TXD-,TXD+)。
RS-485是建立在RS-422的基础上的,它们的差别首先是差分电压不一样,RS-485的差分信号的电压差更大,这意味着出现误差的概率进一步减小,因此RS-285的传输距离也就比RS-422更远了。并且RS-285是半双工的,因此所需的数据线只需要两条。
最后简单总结一下RS家族。
RS-232,一对一,全双工,传输距离小。
RS-422,一对多,全双工,使用差分信号。最多连接10个设备。
RS-485,多对多,半双工,使用差分信号。最多连接32个设备。
我们来看个选择题。我们知道RS-422和RS-485都是使用的差分信号,差分信号每条通道是两根差分信号线,因此RS-422最少是4根线,而RS-485最少只要2根线。