本文为大家介绍 SPI 通信协议的基础知识。
文章目录
前言
一、SPI协议的概念
SPI(Serial Peripheral Interface)协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种 高速全双工的通信总线。采用主从模式架构,支持多从机模式应用。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行 方式进行通信以交换信息。
SPI总线可直接与各个厂家生产的多种标准外围器件相连,包括FLASH、 RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。
二、SPI总线架构
SPI 协议通常使用四根信号线进行通信,分别是SCK,MOSI,MISO,CS。但是,在特定情况下只使用三根信号线,这被称为“三线SPI”或“3线SPI”。在这种配置下,SS信号线被省略,通常是因为只有一个从设备需要与主设备通信。
SPI信号线 :
-
SCK(Serial Clock):时钟信号线,由主设备产生,用于同步数据传输。
-
MOSI(Master Output Slave Input):主设备输出,从设备输入的数据线。
-
MISO(Master Input Slave Output):主设备输入,从设备输出的数据线。
-
CS(Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、 CS,以下用 NSS 表示。
当有多个 SPI 从设 备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,而每个从设备都有独立的这一条 CS 信号线, 本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线
。
三线 SPI ,单主机单从机:
三、SPI通讯时序
1. 起始,停止 信号
起始信号:
在图中的标号 1 处,NSS 信号线由高变低
,是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信 号线,当从机检在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
停止信号:
在图中的标号 6 处,NSS 信号由低变高
,是 SPI 通讯的停止信号。表示本次通讯结束,从机的选中状态被取。
2.CPOL(时钟极性)/CPHA(时钟相位)
SPI 一共有四种通讯模式,它们的主要区 别是:总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性CPOL”和 “时钟相位 CPHA”的概念。
-
时钟极性
CPOL
:是指 SPI 通讯设备处于空闲状态时, SCK 信号线的电平信号(即 SPI 通讯开始 前、 NSS 线为高电平时 SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平
,CPOL=1 时,则相反。 -
时钟相位
CPHA
:是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将 会在 SCK 时钟线的“奇数边沿” 被采样。当CPHA=1 时,数据线在 SCK 的“偶数边沿” 采样
。
四,SPI框架结构
1. 硬件结构:
2. 相关寄存器:
-
SPI控制寄存器1(SPI_CR1)
-
写数据寄存器 SPI_TX ,将数据写入 spi 设备。
-
读数据寄存器 SPI_RX , 将数据从 spi 设备中读出。
-
Shift register 是移位寄存器。
发送数据时,用于将数据一位一位的发送出去。
接收数据时,用于将数据一位一位的接收到 移位寄存器中。 -
状态寄存器 (SPI_SR)
-
读取数据时,先将数据一位一位的放入移位寄存器 Shift register中。再通过状态寄存器SR的RXNE位 去检测 读取寄存器RX的状态。如果 Rx_buff 是空,则可以将数据读取到 Rx_buff 中,就可以将数据读取出来。
-
发送数据时,先通过状态寄存器SR的TXE位 去检测 发送寄存器TX的状态。如果 Tx_buff 是空,则可以将数据放到 Tx_buff 中,再将数据放入移位寄存器 Shift register中,就可以将数据发送出去。
五, I2C 总线 和SPI 总线比较
相同点:
-
串行通信:
I2C 和 SPI 都是串行通信协议,允许在数字设备之间以串行方式传输数据。 -
同步通信:
I2C 和 SPI 都是同步通信协议,需要时钟信号来同步数据传输。 -
主从结构:
两种协议都支持主从结构,主设备控制通信并提供时钟信号,而从设备响应并提供数据。 -
多设备支持:
.两种总线都支持连接多个设备,尽管 SPI 通常更适合连接较少数量的设备。
不同点:
-
线数:
I2C 使用两根线(数据线 SDA 和时钟线 SCL),而 SPI 通常使用四根线(MOSI、MISO、时钟和片选)。 -
速度:
通常情况下,SPI 比 I2C 更快,因为 SPI 通常可以使用更高的时钟频率。 -
传输方式:
.I2C 使用两根线共享数据和时钟信号,而 SPI 使用分开的数据和时钟线,使得 SPI 可以实现全双工通信。 -
片选机制:
在 SPI 中,片选信号由主设备控制,并用于选择与之通信的从设备。而在 I2C 中,地址机制用于选择从设备。 -
硬件复杂性:
由于 SPI 使用更多的线路和片选机制,它通常比 I2C 在硬件上更复杂,需要更多的引脚和硬件支持。 -
应用场景:
由于 SPI 速度更快、更适合高速数据传输,因此通常用于连接高速外围设备,如存储器、传感器等。而 I2C 通常用于连接低速外围设备,如温度传感器、EEPROM 等。
总结
下一篇文章为大家介绍 串口 UART 通信协议。