SPI和IIC
对SPI和IIC进行总结
二者的对比
| 特点 | SPI | IIC |
|---|---|---|
| 线数 | 4线 | 2线 |
| 通信类型 | 全双工 | 半双工 |
| 拓扑结构 | 主从式,片选一对一 | 主从式,地址寻址,一对多 |
| 速度 | 快 | 慢 |
时序
对于两种协议,最大的区别在于:
- 开启关闭条件
- 动作时间点和相位
- 数据格式
开启条件
SPI: CS↓ -> 后续的两个时钟边沿是两条数据变化和读取的时间点
图1: CS下降后,数据在SCK上升沿被采样。(CPOL=0, CPHA=0)
图2: CS下降后,数据在SCK下降沿被采样。(CPOL=1, CPHA=1)
IIC: 当SCL为高电平时 SDA↓ -> 紧接着SCL下降,在SCL为低电平的半个周期内SDA完成数据的跳变。
图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是更复杂的。
