前言
本文是学习火哥的STM32教程所做的学习笔记。
SPI协议简介
SPI协议是由摩托罗拉公司提出的通信协议(Serial Peripheral interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
SPI物理层
SPI通讯设备之间的常用连接方式见图:
SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为SS,它们的作用介绍如下:
-
SS(Slave Select):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下皆称为NSS。每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。
-
SCK(Serial Clock):时钟信号线,用于通讯数据同步。
它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
-
MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。
主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
-
MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。
主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
SPI协议层
SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步性等环节。
-
SPI基本通讯过程
先看看SPI通讯的通讯时序,见图:
-
通讯的起始和停止信号
- 标号①处,NSS信号线由高变低,是SPI通讯的起始信号.NSS是每个从机各自独占的信号线,当从机在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
- 在图中的标号⑥处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
-
数据有效性
SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。MSB先行或LSB先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定, 一般都会采用图中的MSB先行模式。 -
CPOL/CPHA及通讯模式
- 时钟极性CPOL是指SPI通讯设备处于十分空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、NSS线为高电平时SCK的状态)。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时,则相反。
- 时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。
- NSS信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。
- CPHA=0,MOSI和MISO数据线的有效信号在SCK的奇数边沿保存不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。
- NSS信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。
- CPHA=1,MOSI和MISO数据线的有效信号在SCK的偶数边沿保存不变,数据信号将在SCK偶数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。
如图由于CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式0”与“模式3”。