STM32 芯片集成了专门用于 SPI 协议通讯的外设。
通讯引脚:SPI 硬件架构从 MOSI、MISO、SCK 及 NSS 线展开;STM32 芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚。
SPI1是APB2上的设备,最高通信速率36Mbtis/s,SPI2、SPI3 是 APB1上的设备,最高通信速率18Mbits/s。
SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,如果想使用 SPI3 接口,则程序必须禁用这几个IO 口的下载功能。
了解stm32 SPI架构,主要了解的是寄存器之间运作的联系。
控制寄存器(CR1/CR2):
整体控制逻辑负责协调整个SPI 外设,控制逻辑的工作模式通过控制寄存器(CR1/CR2)的参数改变,基本的控制参数包括SPI 模式、波特率、LSB 先行、主从模式、单双向模式等。数据帧长度可以通过控制寄存器 CR1的DFF 位配置 成 8 位及 16 位模式。
通过配置控制寄存器CR的CPOL 位、CPHA位,可以把 SPI 设置成4 种 SPI 模式之一。
SCK 线的时钟信号,由波特率发生器根据控制寄存器 CR1中的 BR[0:2]位控制,该位是对 fpclk时钟的分频因子,对 fpclk的分频结果就是 SCK 引脚的输出时钟频率。 fpclk频率是指 SPI 所在的 APB 总线频率,APB1 为 fpclk1,APB2 为 fpckl2。
数据寄存器(DR):写 SPI 的数据寄存器 DR,可以把数据填充到发送缓冲区;读数据寄存器DR,可以获取接收缓冲区中的内容。
数据移位寄存器:
SPI 的 MOSI 及 MISO 都连接到数据移位寄存器上。
当向外发送数据的时候,数据移位寄存器以发送缓冲区为数据源,把数据一位一位地通过数据线发送出去。
当从外部接收数据的时候, 数据移位寄存器把数据线采样到的数据一位一位地存储到接收缓冲区中。
状态寄存器(SR):在外设工作时,控制逻辑会根据外设的工作状态修改状态寄存器(SR),只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态。控制逻辑还根据要求,负责控制产生 SPI 中断信号、DMA 请求及控制 NSS 信号线。实际应用中,一般不使用 STM32 SPI 外设的标准NSS 信号线,而是使用普通的 GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。
下面是CPOL=1、CPPHA=1时的主模式示例(双线全双工),CPOL=1 时, SCK 在空闲状态时为高电平;CPHA=1 时,数据信号在 SCK 的偶数边沿被采样。(配置控制寄存器CR的CPOL 位、CPHA位)
首先控制 NSS 信号线,产生起始信号;
把要发送的数据写入到数据寄存器DR中,该数据会被存储到发送缓冲区;
数据移位寄存器:通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中。
(状态寄存器 SR中有TXE标志位、RXNE标志位)
TEX标志:TXE标志位置 1,表示传输完一帧,发送缓冲区已空。TXE 标志位为 1 时,若还要继续发送数据,则再次往数据寄存器DR写入数据即可。
RXNE标志:RXNE 标志位被置 1,表示当接收完一帧数据,接收缓冲区非空。RXNE标志位为1时,通过读取数据寄存器 DR可以获取接收缓冲区中的内容。
假如使能了 TXE 或 RXNE 中断,TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数。可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA 方式收发数据寄存器 DR中的数据。