常用的三种通信协议串口通信、SPI和IIC

文章目录

  • 常用的三种通信协议串口通信、SPI和IIC 
    一、通信分类 
    1.1.同步通信和异步通信 
    1.2.单工通信、半双工通信和全双工通信 
    1.3.串行通信与并行通信 
    二、串口通信 
    2.1.UART 
    2.2.RS232通信 
    2.3.RS485通信 
    三、SPI通信 
    四、IIC通信 

一、通信分类

1.1.同步通信和异步通信

发送方和接收方按照同一个时钟节拍工作就叫同步。发送方和接收方没有统一的时钟节拍、而各自按照自己的节拍工作就叫异步。
同步通信:
通信双方按照统一节拍工作,所以配合很好;一般需要发送方给接收方发送信息同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的节奏。同步通信用在通信双方信息交换频率固定,或者经常通信时。

异步通信:
在双方通信的频率不固定,传递的数据没有固定时间间隔约定,可以是不定时长的“空闲位”。异步通信时接收方不必一直在意发送方,发送方需要发送信息时会首先给接收方一个信息开始的起始信号,接收方接收到起始信号后就认为后面紧跟着的就是有效信息,才会开始注意接收信息,直到收到发送方发过来的结束标志。

1.2.单工通信、半双工通信和全双工通信

对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。
单工通信:
发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的。如下图a所示
半双工通信:
可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。如下图b所示
全双工通信:
通信的任意时刻,线路上存在A到B和B到A的双向信号传输。 全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送,全双工方式无需进行方向的切换。如下图c所示

1.3.串行通信与并行通信

按数据传送的方式,通讯可分为串行通讯与并行通讯。

串行通信:

是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。
并行通信:
是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。

并行可以同时发送多位数据所以速度比串行的速度要快很多,但并行要的数据线也更多相对成本会更高,而且并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能。

二、串口通信

串口通信属于全双工,串行通信,有同步和异步通信。
USART:通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换,既可以同步通信也可以异步通信。
UART:通用异步收发器(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能(时钟同步),只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

2.1.UART

8051、STM32等MCU芯片的内部都集成了UART,两个MCU进行串口通信时,可将一个MCU的TX、RX引脚分别与另一个MCU的RX、TX引脚相连

UART进行串口通信使用TTL电平。5V工作电压的MCU,使用0 ~ 0.5V表示逻辑0,2.5V ~ 5V表示逻辑1;3.3V工作电压的MCU,使用0 ~ 0.5V表示逻辑0,2.5V ~ 3.3V表示逻辑1。

UART串口通信是异步,全双工,串行通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、校验位、停止位。

1.起始位、数据位、奇偶校验位、停止位
串口通信时,收发是一个周期一个周期进行的,每个周期传输n个二进制位。这一个周期就叫做一个通信单元,一个通信单元由:起始位+数据位+奇偶校验位+停止位组成的。
起始位:表示发送方要开始发送一个通信单元,起始位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。
数据位:是一个通信单元中发送的有效信息位,是本次通信真正要发送的有效数据,串口通信一次发送多少位有效数据是可以设定的(可选的有6、7、8、9,一般都是选择8位数据位,因为一般通过串口发送的文字信息都是ASCII码编码,而ASCII码中一个字符刚好编码为8位)。
校验位:是用来校验数据位,以防止数据位出错的。
停止位:是发送方用来表示本通信单元结束标志的,停止位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。常见的有1位停止位、1.5位停止位、2位停止位等,一般使用的是1位停止位。
2.波特率
波特率,指的是串口通信的速率,也就是每秒钟可以传输多少个二进制位,单位为bit/s。譬如,每秒钟可以传输9600个二进制位,它传输所用的时间

也就是传输一个二进制位需要的时间是1/9600秒,也就是104us。
串口通信的波特率不能随意设定,而应该是在一些值中去选择。一般最常见的波特率是9600或115200(低端单片机如51常用9600,高端单片机和嵌入式SOC常用115200)。波特率不能随意指定,主要是因为:通信双方必须事先设定相同的波特率才能成功通信,如果发送方和接收方按照不同的波特率通信则根本收不到。

2.2.RS232通信

RS232标准使用+5 V ~ +15 V表示逻辑0,-5V ~ -15 V表示逻辑1。相比TTL电平,RS232电平提高了串口通信的抗干扰能力,增大了串口通信的距离。台式PC一般都带有RS232标准接口,MCU按RS232标准进行串口通信时,需加max232电平转换芯片

2.3.RS485通信

RS485标准使用差分电平表示逻辑0或1,当A与B的电压差为+2v ~ +6v 时表示逻辑1,当A与B的电压差为-2v ~ -6v时表示逻辑0。RS485为半双工通信,即通信节点不能同时进行数据的接收和发送。相比RS232电平,RS485电平使串口通信的抗干扰能力更强,通信距离更远。MCU按RS485标准进行串口通信时,需加max485电平转换芯片

此外串口通信除了UART、RS232、RS485,类似的还有Modbus协议,可以参考这篇文章:详解Modbus通信协议—清晰易懂

三、SPI通信

SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。

SPI总线包括4条逻辑线,定义如下:

MISO:Master input slave output 主机输入,从机输出(数据来自从机);

MOSI:Master output slave input 主机输出,从机输入(数据来自主机);

SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;

SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

需要注意,对于这几个SPI线的名称,不同的厂商可能不有不同的命名

MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
SS也可以是CE,CS或SSEL;
SCLK也可以是SCK;

时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);数据的采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)。

整体的传输大概可以分为以下几个过程:
主机先将NSS信号拉低,这样保证开始接收数据;
当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。
主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

四、IIC通信

IIC协议仅需要一个SDA和SCL引脚。SDA是串行数据线的缩写,而SCL是串行时钟线的缩写。这两条数据线需要接上拉电阻。
2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
1、开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
2、结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
3、应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。 CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号, CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号, 都可以不要。
IIC 总线时序图:

更加详细的讲解可以参考这篇文章:IIC原理超详细讲解—值得一看