STM32-SPI

目录

1 SPI概述

1.1 接口

1.2 通信方法

1.3 STM32 SPI概述

2 功能详述

2.1 NSS引脚详解

2.2 时钟信号的相位和极性

2.3 数据帧格式

2.4 主/从模式的数据发送和接收过程

3 寄存器

SPI控制寄存器 1(SPI_CR1)

SPI控制寄存器 2(SPI_CR2)

SPI 状态寄存器(SPI_SR)

SPI 数据寄存器(SPI_DR)

SPI CRC多项式寄存器(SPI_CRCPR)

SPI Rx CRC寄存器(SPI_RXCRCR)

SPI Tx CRC寄存器(SPI_TXCRCR)


1 SPI概述

SPI是高速全双工同步串行通信接口,主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。

1.1 接口

SPI主要有四根线

MOSI、MISO、SCK、CS。

  • MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
  • MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
  • SCK:串口时钟,作为主设备的输出,从设备的输入
  • CS:片选引脚,一般由主设备控制。

1.2 通信方法

主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输,寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的读和写是同步完成的!如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

1.3 STM32 SPI概述

STM32有三个SPI模块。SPI1在APB1时钟下,SPI2和SPI3在APB2时钟下。大容量产品支持SPI协议和I2S音频协,默认工作在SPI方式。

  • 3线全双工同步传输
  • 带或不带第三根双向数据线的双线单工同步传输
  • 8或16位传输帧格式选择
  • 主或从操作
  • 支持多主模式
  • 8个主模式波特率预分频系数(最大为Fpclk/2) 
  • 从模式频率 (最大为Fpclk/2) 
  • 主模式和从模式的快速通信
  • 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
  • 可编程的时钟极性和相位
  • 可编程的数据顺序,MSB在前或LSB在前
  • 可触发中断的专用发送和接收标志
  • SPI总线忙状态标志
  • 支持可靠通信的硬件CRC
    • 在发送模式下,CRC值可以被作为最后一个字节发送
    • 在全双工模式中对接收到的最后一个字节自动进行CRC校验
  • 可触发中断的主模式故障、过载以及CRC错误标志
  • 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求

2 功能详述

2.1 NSS引脚详解

其他的引脚没什么好说的,主要是NSS引脚,见前文《STM32-SPI的NSS详解

2.2 时钟信号的相位和极性

SPI_CR寄存器的CPOL(时钟极性)和CPHA(时钟极性)。

如果CPOL被 清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。
如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿进行数据位的采样,数据在第二个时钟边沿被锁存;如果CPHA位被清’0’,SCK时钟的第一边沿进行数据位采样,数据在第一个时钟边沿被锁存。

能够组合成四种可能的时序关系

  CPHA=0 CPHA=1
CPOL=0 SCK空闲低,第一SCK边沿采样 SCK空闲低,第二SCK边沿采样
CPOL=1 SCK空闲高,第一SCK边沿采样 SCK空闲高,第二SCK边沿采样

 

2.3 数据帧格式

控制寄存器的LABFIRST位可以设置为MSB在先或LSB在先。控制寄存器的DFF位可以设置为8位数据或16位数据。

2.4 主/从模式的数据发送和接收过程

主模式和从模式的发送和接收过程一致。一般我们使用的模式为主模式!

发送数据:
当写入数据至发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。

接收数据
当数据传输完成时,传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位,读SPI_DR寄存器将清除RXNE位。

3 寄存器

SPI控制寄存器 1(SPI_CR1)

SPI控制寄存器 2(SPI_CR2)

SPI 状态寄存器(SPI_SR)

SPI 数据寄存器(SPI_DR)

SPI CRC多项式寄存器(SPI_CRCPR)

SPI Rx CRC寄存器(SPI_RXCRCR)

SPI Tx CRC寄存器(SPI_TXCRCR)