串行通信接口协议简介:UART、SPI、I2C

一、通信协议中的常见概念

1. 串行通信和并行通信

  • 串行通信(Serical Communication):数据通过单根线一位一位的传输。
  • 并行通信(Parallel Communication):通过多根线同时将数据的所有位一次传输完。
    字母“C”的二进制编码为01000011,使用串行通信传输和使用并行通信传输的示意图如下:
    串行通信

    并行通信
  • 2. 全双工通信和半双工通信

  • 全双工通信:在一个信号载体上允许数据在两个方向上同时传输。举例:电话通信。
  • 半双工通信:在一个信号载体上允许数据在两个方向传输,但不能同时传输。举例:对讲机。
  • 3. 同步通信和异步通信

  • 同步通信:发送方发送数据后,需要等待收到接收方发回的响应后再发送下一个数据包。同步通信是阻塞模式。
  • 异步通信:发送方发送数据后,不需要等待接收方发回的响应就可以发送下一个数据包。异步通信是非阻塞模式。
  • 4. 不同通信协议的特点

    协议 串行/并行 全双工/半双工 同步/异步
    SPI 串行 全双工 同步
    UART 串行 全双工 异步
    I2C 串行 半双工 同步

    二、SPI

    SPI(Serial Peripheral Interface,串行外围接口)是Motorola公司首先在其MC68HCXX系列处理器上定义的接口,是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD转换器上,以及数字信号处理器和数字信号解码器之间。

    1. 信号线

    SPI有四根信号线:

  • MOSI:Master Output Slave Input,主机向信号线上输出数据,从机读取。
  • MISO:Master Input Slave Output,从机向信号线上输出数据,主机读取。
  • SCLK:Serial Clock,串行时钟信号。由主机产生并发送给从机。
  • SS/CS:Slave Select,片选信号。通常是低电平有效,由主机输出,在主设备连接多个从设备时用来控制与哪个从设备通信。

    如果主机连接多个从设备时,则每个从设备上都需要有一个片选引脚接入到主设备机中,当我们的主设备希望和某个从设备通信时,需要将对应从设备的片选引脚电平拉低。同时,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的优点:

    1. 支持全双工通信,独立的MISO、MOSI可以同时发送和接收数据。
    2. 通信简单。
    3. 数据传输速率快,比I2C快几乎两倍。
    4. 无起始位和停止位,因此数据可以持续传输不会中断。

    SPI的缺点:

    1. 没有指定的流控制,没有应答机制确认是否接收到数据,与I2C相比在数据可靠性上有一定的缺陷。
    2. 使用四根线,I2C、UART只使用两根线。
    3. 没有任何形式的错误检查,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的优点:

    1. 只需要使用两根信号线即可完成传输。
    2. 异步通信,无需时钟信号。
    3. 具有奇偶校验位以允许进行错误检查。

    UART的缺点:

    1. 数据帧的大小最大只允许9位。
    2. 不支持多个从属系统或多个系统。
    3. 每个UART的波特率必须在彼此的10%之内。

    四、I2C

    I2C(Inter-Integrated Circuit,集成电路总线)是由Philips公司1982年开发的一种简单、双向二线制同步串行总线。它是多主控总线,总线上的每一个设备都有一个独一无二的地址,且都可以作为主设备控制总线。

    1. 信号线

    I2C总线上两个设备之间只需要两个设备即可完成通信,一根是时钟线SCL(Serial Clock),一根是数据线SDA(Serial Data)。

    I2C总线上会挂载多个设备,任意两个设备之间都可以进行通信,但同一时刻只能有两个设备之间通信,且数据只能单向传输(半双工)。总线上的设备都是平等的,但I2C规定将发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。主设备需要向从设备产生并发送时钟信号。

    2. 通信过程

    I2C协议的通信流程大概如下:

  • ① I2C总线处于空闲状态。I2C总线上的每个设备都有一个7位的地址。
    空闲状态下,SDA和SCL两根信号线都处于高电平状态。
  • ② 主设备发送一个START信号,其它设备收到后开始监听总线以准备接收数据。当START起始信号产生后,I2C总线就处于被占用的状态。
    START信号具体是:先将SDA线从电平切换到低平,再将SCL从高电平切换到低电平。如下图。
  • ③ 主设备发送一个8位的数据帧(IIC规定数据帧大小必须为8位)。该数据帧的前7位是希望通信的从设备的地址,后1位是读写操作位,用于确定主设备是向从设备发送数据还是从从设备接受数据,0代表写,1代表读。
  • ④ 所有从设备都能接收到主设备发送的数据帧,收到后将其中的地址位与自己的地址进行匹配,判断自己是否是目标设备。如果是目标设备,则向总线发送一个应答信号ACK作为回应;否则进入等待状态,等待STOP信号的来临。
    从设备的应答分为两种:ACK表示从机正确收到数据或地址+读写位,NACK表示从机未应答,工作异常
    主机每次发送完数据后,都会等待从设备的应答信号ACK。如果从设备发送应答信号ACK,则SDA会被拉低(0);如果没有应答信号NACK,则SDA会输出为高电平(1),这过程会引起主设备发生重启或者停止。
  • ⑤ 主设备收到应答信号后便和从设备建立起联系,开始传送或接收数据。如果读写位设置为写,则主设备传送数据,从设备接收并给出应答;如果读写位设置为读,则从设备传送数据,主设备接收并给出应答。
  • ⑥ 数据传送完毕后,主设备发送一个STOP信号,向其它设备宣告释放总线、所有设备回到初始状态。
    STOP信号具体是:先将SDA线从低电平切换到高电平,再将SCL线从高电平拉到低电平。如下图。
  • 3. 优缺点

    I2C的优点:

    1. 只需要两根信号线就可以完成传输。
    2. 支持多个主机和从机。
    3. 硬件结构比UART更简单。
    4. 相比于UART,没有严格的波特率要求,但主设备需要生成总线时钟。

    I2C的缺点:

    1. I2C的传输速率比不上SPI,是为了与低速设备通信而发明的。
    2. 数据帧大小限制为8位。
    3. 只能进行半双工通信。
    物联沃分享整理
    物联沃-IOTWORD物联网 » 串行通信接口协议简介:UART、SPI、I2C

    发表评论