简介
SPI 协议是由摩托罗拉公司提出的通讯协议 ,即串行外围设备接口(Serial Peripheral Interface),是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率
较高的场合。
特色:
- 全双工,同步通信
- 提供高速的传输(>=100MHZ)
- 可提供一对多的接线,但同一时间只能与一个从机通信,其余从机的MISO必须设定为高阻抗输出(High Impedance)
- 高位先行(MSB First)
- 通过设置CPOL与CPHA,加上弹性的主频(时钟频率)和位元变化(数据帧可变),可应对多样的装置需求
引脚说明
SPI通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换。SPI是一个环形结构,通信时需要至少4根线(事实上在单向传输时3根线也可以),即3条总线及片选线。3条总线分别为 SCK、MOSI、MISO,片选线为 SS ,它们的作用介绍如下:
- SSx(x Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MIS O 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每 个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以 SPI 通讯以 NSS 线置低电平为开始信号,以NSS 线被拉高作为结束信号。
-
SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。时钟信号决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
-
MOSI (Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
-
MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。需要注意的是,在下图的信号线中,只有MISO的信号来源于多个从机,其余信号线的信号都由一个主机发出,因此SPI规定,当从机未被选中时,MISO引脚输出高阻抗,防止干扰主机与被选中的从机的通信;同时,输出高阻抗这一特性也会影响到SPI在实际传输上的一些动作。
时序解析
基于时钟极性与时钟相位的采样设置
SPI接口有四种不同的数据传输时序,取决于CPOL(Clock Polarity 时钟极性)和CPHA(Clock Phase 时钟相位)这两位的组合,在实际应用中要根据主从设备的时序要求选择正确的时序。
时钟极性 CPOL 是指 SPI 通讯设备处于空闲(IDLE)状态时,SCK 信号线的电平信号 (即 SPI 通讯开始前、NSS 线为高电平时 SCK 的状态)。CPOL=0 时,SCK 在空闲状态时为低电平,CPOL=1 时,则为高。
时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样。
CPHA=0 时的 SPI 通讯模式
CPHA=1 时的 SPI 通讯模式
SPI模式 | CPOL | CPOA | 空闲时SCK电平 | 采样时刻 |
0 | 0 | 0 | 低电平 | 奇数边沿(上升沿) |
1 | 0 | 1 | 低电平 | 偶数边沿(下降沿) |
2 | 1 | 0 | 高电平 | 奇数边沿(下降沿) |
3 | 1 | 1 | 高电平 |
偶数边沿(上升沿) |