什么是SPI
SPI 的全称是:Serial Peripheral Interface。是一种高速、全双工、主从结构、同步串行通信协议规范,由摩托罗拉(现 NXP)在 1980 年代提出,主要用于短距离板级设备间通信(如:MCU 连接传感器、存储器、屏幕等)。如下图所示,是 SPI 总线典型的连接关系,图中有 1 个主机和 3 个从机,其中,我们把控制发送节奏的一方叫做Master,把被动通信的一方叫做Slave
SCK
全称:Serial Clock 作用:由主设备 (Master) 产生并输出的时钟信号。
功能:为整个通信过程提供同步时钟节拍。数据位的采样和切换都严格发生在 SCK 的边沿。
方向:Master (m) → Slave (s)。
细节:一些 SPI 接口的芯片,时钟信号名称不一定叫 SCK,可能叫 CLK、SCLK 等,请以芯片手册实际情况为准,为了统一口径,我们这里统一叫做 CLK
MOSI
全称:Master Out / Slave In
作用:主设备发送数据到从设备的数据线。
方向:Master (m) → Slave (s)。对于主设备而言是输出,对于从设备而言是输入。
注意:一些 SPI 接口的芯片,该信号名称不一定叫 MOSI,可能叫 SDI 或者其它的什么,请以芯片手册实际情况为准。
MISO
全称:Master In / Slave Out
作用:从设备发送数据到主设备的数据线。
方向:Slave (s) → Master (m)(只有当该从设备被选中时有效)。对于主设备而言是输入,对于从设备而言是输出。
注意: 一些 SPI 接口的芯片,该信号名称不一定叫 MISO,可能叫 SDO 或者其它的什么,请以芯片手册实际情况为准。
SS
全称:Slave (Chip) select
作用:主设备用来选择和使能特定从设备的信号线,即实现 "片选" 功能 实现:通常低电平有效。当某个从设备的 SS / CS 线被主设备拉低时,该从设备被激活,准备与主设备通信。未被选中的从设备必须将其 MISO(输出)线置于高阻态,以避免总线冲突。
方向:Master (m) → Slave (s)。
数量:每个从设备都需要一个独立的 SS / CS 线。这是 SPI 支持多从机的主要方式(非总线仲裁)。
SPI的最大优点
SPI相比于Usart和I2C到底有什么优点呢?最大的有点就是SPI的速度快
SPI复用GPIO
经过前面对Usart,I2C的学习我们知道SPI复用GP IO是再平常不过的事情。那具体怎么复用的呢?
从图中可以看出,SPI复用了四个GPIO引脚,NSS,SCK,MOSI是复用推挽输出(区别于I2C的开漏模式),MISO则类似于浮空输入。
那复用哪个GPIO是由我们决定的吗?
经过前面的学习,我们知道肯定不是。是由意法半导体决定的。想要知道SPI会复用哪些个引脚,我们应该去找意法半导体提供的数据手册。
以STM32F103ZET6中的 SPI1 为例
如图所示,SPI在一般情况下会复用PA4,PA5,PA6,PA7,。当然这些引脚可以被多个片上外设复用,当这些引脚被复用时,会启用重映射功能,让SPI复用其他引脚。
关于片选
NSS有几个?
默认有一个 NSS,但是 NSS 的逻辑非常简单,可以完全用GPIO Pin取代,只要对应的 GPIO 针脚输出低电平,就可以选中某个从机,那么原则上,一个 MCU 可以挂接很多个从机。这也就是为什么官方参考手册上说SPI 是三线制的原因,因为 NSS 可选可调可扩展
当然,用哪个GPIO Pin是由硬件工程师决定的。
未被选中的从机要保持高阻态
电气角度看,高阻态相当于断开连接。如果未被选中的从机不处于高阻态,万一它的 MISO 强行输出高电平,而当前被选中的从机也正要输出低电平,总线上就会发生短路,或者信息干扰
SPI的极简收发过程
说是极简,所以我们先记住两个准则:1SPI收发数据是边沿触发的(在下面的例子中,我们假设上升沿发送,下降沿接收)
2SPI是全双工的,本质是在交换数据,所以即使你只想读,也要发一些垃圾数据过去,不然无法读数据
过程图
发送数据
接收数据
时钟极性
时钟极性 (Clock Polarity - CPOL) 定义了时钟信号在空闲状态(无数据传输时)时的电平:
- CPOL = 0:时钟空闲时为低电平,如下图所示。
- CPOL = 1:时钟空闲时为高电平,如下图所示。
时钟相位
第一边沿和第二边沿
在理解时钟相位之前,我们先来理解两个概念:第一边沿和第二边沿。
第一边沿:一个有效时钟周期开始时的第一个电平跳变边沿
第二边沿:紧跟第一边沿发生的、方向相反的第二个电平跳变边沿
时钟相位
时钟相位 (Clock Phase - CPHA) 定义了数据在时钟信号的哪个边沿被采样(读取、捕获),哪个边沿允许数据变化 (发送),决定了数据位保持稳定和切换的精确时刻。
CPHA = 0:数据在时钟的第一边沿被采样 (读取),在第二边沿改变数据位 (发送)
CPHA = 1:数据在时钟的第一边沿改变数据位 (发送),在第二边沿被采样 (读取)
CPHA 相位规则速记: CPHA=0:0 相当于嘴巴,读书用嘴巴
CPHA=1:1 相当于一支笔,用来写东西