【嵌入式】IIC和SPI的比较

SPI和IIC

对SPI和IIC进行总结

二者的对比

特点 SPI IIC
线数 4线 2线
通信类型 全双工 半双工
拓扑结构 主从式,片选一对一 主从式,地址寻址,一对多
速度

时序

对于两种协议,最大的区别在于:

  • 开启关闭条件
  • 动作时间点和相位
  • 数据格式

开启条件

SPI: CS↓ -> 后续的两个时钟边沿是两条数据变化和读取的时间点

wavedrom-2

图1: CS下降后,数据在SCK上升沿被采样。(CPOL=0, CPHA=0)

wavedrom
图2: CS下降后,数据在SCK下降沿被采样。(CPOL=1, CPHA=1)

IIC: 当SCL为高电平时 SDA↓ -> 紧接着SCL下降,在SCL为低电平的半个周期内SDA完成数据的跳变。

wavedrom-3
图3: SDA↓触发,脉冲谷跳变数据

关闭条件

SPI:CS↑

IIC: 在当SCK为高电平时 SDA↑

动作时间点和相位

SPI: 两个数据线总是在SCL边沿进行跳变和数据锁存

IIC: SDA在SCL脉冲谷进行跳变,SCL上升沿锁存数据,脉冲顶SDA保持不变

整体来看,SPI的SCL与数据线相差半个时钟周期的相位,IIC则为同相

数据格式

SPI通过CS指定外设,并在首帧数据中发送访问地址,该地址中最高位通常包含R/W位。传输多帧数据时,中间无确认位。

IIC通过一个握手过程与外设建立通信,对于读和写有不同的时序。在这里,将IIC的数据分为3种,每帧数据8+1位(包括ACK),结构如下:

  • 外设片选地址:[7<-device addr->1, R/W, ACK]
  • 寄存器地址:[7<-reg addr->0, ACK]
  • 数据:[7<-data->0, ACK]
  • STOP: SCL高电平时, SDA↑
  • START: SCL高电平时, SDA↓

读和写的时序如下:

  • 写:START -> 外设片选地址 -> 寄存器地址 -> 数据 -> … -> STOP
  • 读:START -> 外设片选地址 -> 寄存器地址 -> Repeat Start -> 外设片选地址 -> 数据 -> … -> STOP

可以看到,IIC是更复杂的。