二十五、SPI协议介绍
SPI 协议介绍
什么是 SPI 协议
SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在微控制器和外部设备之间进行数据传输。它由一个主设备(通常是微控制器 MCU)和一个或多个从设备组成,即一主多从模式。它通常用于短距离、高速、全双工的通信,它在许多嵌入式系统和电子设备中被广泛应用,如存储器芯片、传感器、显示器驱动器、无线模块等。
在 SPI 协议中,主设备是通信的发起方和控制方,而从设备则是被动接收和响应主设备的命令和数据。主设备通过时钟信号来同步数据传输,同时使用多个双向数据线来实现数据的传输和接收。
SPI 协议是一种全双工通信方式,意味着主设备和从设备可以同时发送和接收数据。它还使用一种选择信号(通常称为片选或使能信号),用于选择与主设备进行通信的特定从设备。
- 主设备通过 MOSI 线向从设备发送数据。在每个时钟周期中,主设备将一个位发送到 MOSI 线上,从设备在下一个时钟周期中读取该位。
- 从设备通过 MISO 线向主设备发送数据。在每个时钟周期中,从设备将一个位发送到 MISO 线上,主设备在下一个时钟周期中读取该位。
- 数据传输可以是全双工的,即主设备和从设备可以同时发送和接收数据。
- 数据传输的长度可以是可变的,通常以字节为单位。
- 数据传输可以是单向的,即主设备只发送数据或只接收数据。
- 数据传输可以是多主设备的,即多个主设备可以与多个从设备进行通信。
SPI的硬件接口
SPI 主要使用 4 根线,时钟线(SCLK),主输出从输入线(MOSI),主输入从输出线(MISO)和片选线(CS)。
通信线 | 说明 |
---|---|
SCLK | 时钟线,也叫做 SCK。由主机产生时钟信号。 |
MOSI | 主设备输出从设备输入线,也叫做 SDO。意为主机向从机发送数据。 |
MISO | 主设备输入从设备输出线,也叫做 SDI。意为主机接收从机的数据。 |
CS | 片选线,也叫做 NSS。从机使能信号,由主机控制。当我们的主机控制某个从机时,需要将从机对应的片选引脚电平拉低或者是拉高。 |
主设备是通过片选线选择要与之通信的从设备。每个从设备都有一个片选线,当片选线为低电平时,表示该从设备被选中。(也有一些设备以高电平有效,需要根据其数据手册确定)。主设备通过控制时钟线的电平来同步数据传输。时钟线的上升沿和下降沿用于控制数据的传输和采样。SPI 的主从接线方式需要对应,主从机设定后身份固定。
SPI 的模式选择
SPI 协议定义了多种传输模式,也称为 SPI 模式或时序模式,用于控制数据在时钟信号下的传输顺序和数据采样方式。SPI 的传输模式主要由两个参数决定:时钟极性 (CKPL) 和相位 (CKPH)。 时钟极性 (CKPL):时钟极性定义了时钟信号在空闲状态时的电平。
CKPL = 0:时钟信号在空闲状态时为低电平。
CKPL = 1:时钟信号在空闲状态时为高电平。
时钟相位 (CKPH):相位定义了数据采样和更新发生在时钟信号的哪个边沿上。
CKPH = 0:数据采样发生在时钟的第一个边沿,数据更新发生在第二个边沿。
CKPH = 1:数据采样发生在时钟的第二个边沿,数据更新发生在第一个边沿。
以下是常见的 SPI 模式:
模式 0(CKPL=0,CKPH=0):
- 时钟极性(Clock Polarity)为 0,表示时钟空闲状态为低电平。
- 时钟相位(Clock Phase)为 0,表示数据在时钟信号的第一个边沿(时钟上升沿)进行采样和稳定。
模式 1(CKPL=0,CKPH=1):
- 时钟极性为 0,时钟空闲状态为低电平。
- 时钟相位为 1,数据在时钟信号的第二个边沿(时钟下降沿)进行采样和稳定。
模式 2(CKPL=1,CKPH=0):
- 时钟极性为 1,时钟空闲状态为高电平。
- 时钟相位为 0,数据在时钟信号的第一个边沿(时钟下降沿)进行采样和稳定。
模式 3(CKPL=1,CKPH=1):
- 时钟极性为 1,时钟空闲状态为高电平。
- 时钟相位为 1,数据在时钟信号的第二个边沿(时钟上升沿)进行采样和稳定。
选择 SPI 模式的决策通常取决于从设备的规格要求和通信协议。不同的设备可能采用不同的模式,所以在与特定从设备通信之前,必须了解从设备所需的 SPI 模式。如果没有明确指定 SPI 模式,通常可以根据从设备的规格手册或通信协议选择最常见的模式 0 或模式 3 进行尝试。此外,还需要注意 SPI 模式时钟的频率限制,以确保主设备和从设备之间的时钟频率匹配。
软件SPI与硬件SPI
SPI 与 IIC 类似,都分有软件 SPI 和硬件 SPI,软件 SPI 部分不再讲解,本章节着重讲解硬件 SPI。STM32F407 具有多个硬件 SPI(串行外设接口)模块,用于实现与外部设备的高速串行通信。每个硬件 SPI 模块都具有独立的寄存器和控制信号,可以配置为主模式或从模式。
使用硬件 SPI 的优势:
支持中断和 DMA: 硬件 SPI 可以与中断控制器和 DMA 控制器配合使用,实现数据的高效处理和传输。
硬件缓冲区: 硬件 SPI 具有内部缓冲区,可以在主机和外设之间进行数据中转,提高数据的传输效率。
高速传输: 硬件 SPI 使用硬件模块进行数据传输,速度通常比软件实现的 SPI 更快。
SPI 协议的优劣势
【优势】
简单易实现: SPI 协议的硬件和软件实现相对简单,通信过程清晰明了,易于理解和调试。这使得 SPI 协议在嵌入式系统中得到广泛应用。
高速传输: SPI 协议可以实现高速的数据传输。由于 SPI 是点对点的通信协议,数据直接在主设备和从设备之间传输,无需地址和冲突检测,发送与接收分别在不同的信号线上,因此具有较高的传输速度。
灵活性强: SPI 协议允许主设备与多个从设备进行通信。主设备可以通过选择从设备的片选信号来与特定设备通信,从而实现多设备的串行通信。
【劣势】
信号线长度有限: 由于 SPI 协议没有特定的规范限制信号线的长度,较长的信号线可能会引入稳定性和传输速度方面的问题。在长距离通信时需要考虑信号传输的可靠性。
信号线数量多: SPI 协议在每个从设备之间都需要一条单独的控制线,因此对于连接大量设备的系统来说,所需的信号线数量会相对较多。
无手握通信: SPI 协议没有提供像 I2C 协议那样的“握手”机制,即从设备无法主动向主设备发送数据请求。因此,对于需要主动主设备交互的应用场景来说,SPI 可能不太适合。
SPI协议的应用领域
SPI 是一种常见的串行通信接口,广泛应用于数字和模拟电子设备之间的通信。它具有简单、高效和灵活的特点,因此与 I2C 一样,在各种领域都被广泛采用。
在存储器和闪存芯片领域,SPI 协议被用于与存储器芯片(如 EEPROM、SRAM)和闪存芯片(如 SD 卡、SPI Flash)进行通信。通过 SPI 协议,这些芯片可以与主控制器进行数据交换,实现数据的高速读写和存储。
SPI 协议在显示器和液晶屏领域也有广泛的应用。许多液晶显示器和 OLED 显示器使用 SPI 协议传输图像数据和控制信号。
还有传感器领域、通信领域等,需要注意的是,SPI 协议是一种点对点的通信协议,一般通过主从架构进行通信,其中一个设备充当主设备,其他设备充当从设备。