STM32入门之SPI协议
一、SPI协议简介
SPI(Serial Peripheral Interface,串行外设接口)是由Motorola公司开发的一种高速、全双工、同步通信总线协议。它通过四根专用信号线实现主设备(Master)与从设备(Slave)之间的数据传输,广泛应用于微控制器与各种外设之间的通信场景。SPI因其高效性、低延迟和简单易用的特性,成为连接传感器、存储器、ADC/DAC转换器、LCD驱动器等外设的主流接口。
二、SPI物理层架构
SPI采用主从方式工作,一般有一个主设备和一个或多个从设备。SPI需要至少4根线,分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCK (SCLK)(时钟)、CS(片选)。
- MOSI(Master Out Slave In):主设备向从设备发送数据的信号线。
- MISO(Master In Slave Out):从设备向主设备发送数据的信号线。
- SCK (SCLK) (Serial Clock):由主设备生成的同步时钟信号,控制数据传输的节奏。
- CS/SS(Chip Select):片选信号线,用于选择特定从设备参与通信。
主设备通过CS/SS信号线拉低某个从设备的选通信号,启动与其通信。数据传输过程中,MOSI和MISO线同时进行双向数据交换,SCK确保双方时序同步。
三、协议层
SPI主设备通过拉低目标从设备的片选线(低电平有效)启动通信,随后通过SCK生成时钟信号,主导整个通信流程。
1. 通信的起始和停止信号
CS/SS 信号线由高变低,是 SPI 通讯的起始信号。CS/SS 是每个从机各自独占的信号线,当从机在自己的 CS/SS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。CS/SS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
2. 数据传输
SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会MSB先行模式(高位数据先传)。
SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。
3. SPI通信模式
SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。
SPI的通信流程严格依赖于时钟信号的极性(CPOL)和相位(CPHA)配置,二者共同决定了数据采样的具体时序。
CPOL定义了时钟信号在空闲状态下的电平(高或低),而CPHA则规定了数据采样发生在时钟信号的上升沿或下降沿。
- CPOL=0,空闲时SCK为低电平。
- CPOL=1,空闲时SCK为高电平。
- CPHA=0,每个周期的第一个时钟沿采样。
- CPHA=1,每个周期的第二个时钟沿采样
SPI通信模式 | CPOL | CPHA | 说明 |
0 | 0 | 0 | 空闲时SCLK为低电平,在每个周期的第一个时钟沿采样。 |
1 | 0 | 1 | 空闲时SCLK为低电平,在每个周期的第二个时钟沿采样。 |
2 | 1 | 0 | 空闲时SCLK为高电平,在每个周期的第一个时钟沿采样。 |
3 | 1 | 1 | 空闲时SCLK为高电平,在每个周期的第二个时钟沿采样。 |
模式0:空闲时SCLK为低电平,在每个周期的第一个时钟沿采样,也就是SCLK由低电平到高电平的跳变沿,所以数据采样是在上升沿(准备数据),数据发送是在下降沿。
模式1:空闲时SCLK为低电平,在每个周期的第二个时钟沿采样,也就是SCLK由高电平到低电平的跳变沿,所以数据的采样是在下降沿(准备数据),数据发送是在上升沿。
模式2:空闲时SCLK为高电平,在每个周期的第一个时钟沿采样,也就是SCLK由高电平到低电平的跳变沿,所以数据的采样是在下降沿(准备数据),数据发送是在上升沿。
模式3:空闲时SCLK为高电平,在每个周期的第二个时钟沿采样。也就是SCLK由低电平到高电平的跳变沿,所以数据的采样是在上升沿(准备数据),数据的发送是在下降沿。
4. SPI寻址方式
当主设备要和某个从设备进行通信时,主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平,根据从机而定)表示选中该从设备。
5. SPI典型通信过程
SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑‘1’,低电平表示逻辑‘0’;一个字节传送完成后无需应答即可开始下一个字节的传送; SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送。
四、STM32 SPI外设
STM32 SPI内部结构
STM32F103系列微控制器的 SPI 接口提供两个主要功能,支持 SPI 协议或 I2S 音频协议。默认情况下,选择的是 SPI功能,可通过软件将接口从 SPI 切换到 I2S。STM32F103系列微控制器SPI主要由通信引脚、波特率控制、收发控制和数据存储转移4部分构成。
1. 通信引脚
通常SPI通过4个引脚与外部器件相连:
MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCK:串口时钟,作为主设备的输出,从设备的输入
NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。
2. 波特率控制
波特率发生器用来产生SPI的SCLK时钟信号。波特率预分频系数可以是2、4、8、16、32、64、128或256。通过设置波特率控制位(BR)可以控制SCLK时钟的输出频率,从而控制SPI的传输速率。
3. 收发控制
收发控制主要由若干个控制寄存器组成,如SPI控制寄存器(Control Register)SPI_CR1、SPI_CR2和SPI状态寄存器(Status Register)SPI_SR等。
- SPI_CR1寄存器主控制收发电路,用于设置SPI协议,例如时钟极性、时钟相位和数据格式等。
- SPI_CR2寄存器用于设置各种SPI中断使能,例如使能TXE的TXEIE和使能RXNE的RXNEIE等。
- SPI_SR寄存器中的各个标志位可以查询SPI当前的状态。
4. 数据存储转移
数据存储转移主要由移位寄存器、接收缓冲区和发送缓冲区构成。移位寄存器直接与SPI的数据引脚MISO和MOSI连接,一方面将从MISO收到的一个个数据位根据数据格式和数据顺序经串并转换后转发到接收缓冲区,另一方面将从发送缓冲区收到的数据根据数据格式和数据顺序经并串转换后一位一位地从MOSI上发送出去。
STM32 SPI主模式
STM32F103微控制器的SPI工作在主模式下,即作为SPI主设备,产生SCLK时钟信号。在这种配置下,MOSI是数据输出,MISO是数据输入。
(1)配置步骤
a.设置SPI串行时钟波特率:SPI_CR1寄存器的BR[2:0]位。
b.设置SPI协议通信模式:SPI_CR1寄存器的CPOL和CPHA位。
c.设置SPI数据格式:SPI_CR1寄存器的DFF位和LSBFIRST位。
d.设置NSS工作模式:
NSS作为输出:当置位SPI_CR2寄存器的SSOE位或调用库函数SPI_SSOutputCmd时,开启主模式下的NSS输出(NSS输出低电平)。此时,当其他SPI设备的NSS引脚与其相连,会收到低电平,即片选成功,成为从设备。
NSS作为输入:硬件模式下,在整个数据帧传输期间应把NSS引脚连接到高电平。软件模式下,需将SPI_CR1寄存器的SSM位和SSI位设置为1。此时,NSS引脚被释放出来可以另作他用。例如,可以用来作为普通GPIO引脚驱动从设备的片选信号。
e.设置SPI_CR1寄存器的MSTR位和SPE位:只有当NSS引脚被连接到高电平,这些位才能保持置位。
(2)数据发送过程
当写入数据至发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。
(3)数据接收过程
MISO引脚上的数据位随着时钟信号SCLK被一位一位地依次传入移位寄存器。在SCLK最后一个采样时钟边沿后,SPI_SR寄存器中的RXNE标志位被置位,移位寄存器中接收到的数据被全部传送到接收缓冲区。此时,如果SPI_CR2寄存器中的RXNEIE位被置1,则会产生中断。当读取SPI数据寄存器SPI_DR时,会返回这个接收缓冲区的数值,并且清除SPI_SR寄存器中的RXNE位。