串行通信接口协议简介:UART、SPI、I2C
一、通信协议中的常见概念
1. 串行通信和并行通信
字母“C”的二进制编码为01000011,使用串行通信传输和使用并行通信传输的示意图如下:
串行通信
并行通信
2. 全双工通信和半双工通信
3. 同步通信和异步通信
4. 不同通信协议的特点
协议 | 串行/并行 | 全双工/半双工 | 同步/异步 |
---|---|---|---|
SPI | 串行 | 全双工 | 同步 |
UART | 串行 | 全双工 | 异步 |
I2C | 串行 | 半双工 | 同步 |
二、SPI
SPI(Serial Peripheral Interface,串行外围接口)是Motorola公司首先在其MC68HCXX系列处理器上定义的接口,是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD转换器上,以及数字信号处理器和数字信号解码器之间。
1. 信号线
SPI有四根信号线:
如果主机连接多个从设备时,则每个从设备上都需要有一个片选引脚接入到主设备机中,当我们的主设备希望和某个从设备通信时,需要将对应从设备的片选引脚电平拉低。同时,SPI协议还规定时钟信号必须由主机提供给从机,从机自身不能产生和控制时钟信号,没有时钟信号同步从机不能正常工作。
2. 传输方式
SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号,然后再进行数据传输。主机向MOSI信号线传送数据给从机,同时,从机也必须将一些内容通过MISO信号线返回给主机,也就是说,每隔时钟周期内,都在发生全双工数据通信。时钟信号的作用就是保证两个设备之间的传输始终是同步的。
即使只进行单向数据传输,也要保证主机和从机时刻都有数据交换,两者必须要互相发送一些东西,接收方只需要忽略即可。这种情况我们称为虚拟数据。
3. 时钟配置
SPI协议需要对时钟进行配置,一般配置下面三个参数:
时钟频率:理论上讲,时钟频率可以任何想要的速率,实际上会受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。
时钟极性:Clock Polarity,CPOL,表示SPI总线的极性。CPOL = 0,表示时钟空闲时是低电平;CPOL = 1,表示时钟空闲时是高电平。
时钟相位:Clock Phase,CPHA,表示SPI总线的相位。一个时钟周期会有2个跳变沿,SPHA决定了接收端在时钟信号的哪一个跳变沿对接收数据进行采样。CPHA = 0,表示从第一个跳变沿开始采样;CPHA = 1:表示从第二个跳变沿开始采样。
CPOL和CPHA可以组合出四种工作模式,可以根据不同器件的支持情况和自己的需求进行选择和配置。
4. 优缺点
SPI的优点:
- 支持全双工通信,独立的MISO、MOSI可以同时发送和接收数据。
- 通信简单。
- 数据传输速率快,比I2C快几乎两倍。
- 无起始位和停止位,因此数据可以持续传输不会中断。
SPI的缺点:
- 没有指定的流控制,没有应答机制确认是否接收到数据,与I2C相比在数据可靠性上有一定的缺陷。
- 使用四根线,I2C、UART只使用两根线。
- 没有任何形式的错误检查,UART有奇偶校验位。
三、UART
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种异步串行通信协议,负责处理数据总线和串行口之间的串/并、并/串转换。UART规定了数据帧的格式,通信双方只要采用相同的帧格式和波特率,就能在没有时钟信号进行同步的情况下,仅用两根数据信号线(Rx 和Tx)完成通信过程。
波特率:每秒传输多少符号。
比特率:每秒传输多少比特。
二进制一个符号所含信息量为1比特,因此二进制下波特率=比特率。 计算机处理的都是二进制数,在这个环境下波特率和比特率都一样。
1. 信号线
UART需要两根数据信号线,不需要时钟信号线。UART两端各有一个Tx和Rx,可以同时进行收发,进行全双工通信。
2. 帧格式
UART属于异步通信,没有时钟信号,因此接收端和发送端需要制定一个数据帧的格式,使得接收端知道何时读取、怎样读取数据。例如,UART在数据包中增加了起始位和停止位,当接收UART检测到起始位时,它将以特定的波特率的频率读取。两个UART必须以大约相同的波特率工作,发送与接收UART之间的波特率只能相差约10%。
UART数据包包括1个起始位,5 ~ 9个数据位(取决于UART),1个可选择的奇偶检验位,1 ~ 2个停止位。
起始位(Start Bit)
UART数据传输线通常在不传输数据时保持在高电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压转换时,他开始以波特率的频率读取数据帧中的位。
数据帧(Data Bits)
数据帧内包含正在传输的实际数据。使用奇偶校验位是5 ~ 8位,不使用最多可以是9位。如ASCII码(7位),扩展BCD码(8位)大多数情况下采用小端传输。
校验位(Parity Bit)
采用1位奇偶校验的方法检测传输过程是否有错误,可以检测出一位错误。
停止位(Stop Bit)
向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少两位的时间。它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢。
异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准。
小端传输:符合人的思维 低位存储在低地址 如0x0100 0001(A) 小端传输后看到的波形为 1000 0010
大端传输:符合直观视觉 地位数据存储在高位地址 如0x0100 0001(A) 大端传输后看到的波形仍为 0100 0001
3. 传输过程
4. 优缺点
UART的优点:
- 只需要使用两根信号线即可完成传输。
- 异步通信,无需时钟信号。
- 具有奇偶校验位以允许进行错误检查。
UART的缺点:
- 数据帧的大小最大只允许9位。
- 不支持多个从属系统或多个系统。
- 每个UART的波特率必须在彼此的10%之内。
四、I2C
I2C(Inter-Integrated Circuit,集成电路总线)是由Philips公司1982年开发的一种简单、双向二线制同步串行总线。它是多主控总线,总线上的每一个设备都有一个独一无二的地址,且都可以作为主设备控制总线。
1. 信号线
I2C总线上两个设备之间只需要两个设备即可完成通信,一根是时钟线SCL(Serial Clock),一根是数据线SDA(Serial Data)。
I2C总线上会挂载多个设备,任意两个设备之间都可以进行通信,但同一时刻只能有两个设备之间通信,且数据只能单向传输(半双工)。总线上的设备都是平等的,但I2C规定将发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。主设备需要向从设备产生并发送时钟信号。
2. 通信过程
I2C协议的通信流程大概如下:
空闲状态下,SDA和SCL两根信号线都处于高电平状态。
START信号具体是:先将SDA线从电平切换到低平,再将SCL从高电平切换到低电平。如下图。
从设备的应答分为两种:ACK表示从机正确收到数据或地址+读写位,NACK表示从机未应答,工作异常
主机每次发送完数据后,都会等待从设备的应答信号ACK。如果从设备发送应答信号ACK,则SDA会被拉低(0);如果没有应答信号NACK,则SDA会输出为高电平(1),这过程会引起主设备发生重启或者停止。
STOP信号具体是:先将SDA线从低电平切换到高电平,再将SCL线从高电平拉到低电平。如下图。
3. 优缺点
I2C的优点:
- 只需要两根信号线就可以完成传输。
- 支持多个主机和从机。
- 硬件结构比UART更简单。
- 相比于UART,没有严格的波特率要求,但主设备需要生成总线时钟。
I2C的缺点:
- I2C的传输速率比不上SPI,是为了与低速设备通信而发明的。
- 数据帧大小限制为8位。
- 只能进行半双工通信。