STM32 SPI 学习笔记

一、接口

MISO:主设备输入/从设备输出管脚。该管脚在从模式下发送数据,在主模式下接收数据

MOSI:主设备输出/从设备输入管脚。该管脚在主模式下发送数据,在从模式下接收数据。 

SCK:串口时钟,串口时钟,作为主设备的输出,从设备的输入

NSS:片选管脚,用于主设备选择特定的从设备通信。如果设为主设备IO口配置为输出,如果设为从设备,IO口配置为输入。

二、工作方式

   SPI是一个环形总线结构,在同步时钟SCK控制下,两个双向位移寄存器进行数据交换。

STM32 SPI 学习笔记_第1张图片

三、重要参数

(1)主从模式:主要配置单片机为从机还是主机

(2)单双工通信:选择单工通信或者双工通信

(3)NSS软件还是硬件:选择软件NSS引脚将寄存器配置

(4)传输数据格式:8bit或者16bit

(5)CPOL:选择时钟的空闲模式是低电平或者高电平

(6)CPHA:选择数据采样时钟边沿第一个或者第二个

(7)波特率:数据传输速度

(8)MSB/LSB:选择数据传送方向高位开始还是低位开始

(9)SPI设备使能:启动SPI设备

(10)TXE/RXNE:发送和接收数据状态标志位,判断数据是否发送/接收完成。

在使用库函数配置spi时可以跟踪到SPI_InitTypeDef这个结构体定义去查看里面的参数定义代码如下,每个参数都有注释。代码如下:

typedef struct
{
  uint16_t SPI_Direction;           /*!< Specifies the SPI unidirectional or bidirectional data mode.
                                         This parameter can be a value of @ref SPI_data_direction */

  uint16_t SPI_Mode;                /*!< Specifies the SPI operating mode.
                                         This parameter can be a value of @ref SPI_mode */

  uint16_t SPI_DataSize;            /*!< Specifies the SPI data size.
                                         This parameter can be a value of @ref SPI_data_size */

  uint16_t SPI_CPOL;                /*!< Specifies the serial clock steady state.
                                         This parameter can be a value of @ref SPI_Clock_Polarity */

  uint16_t SPI_CPHA;                /*!< Specifies the clock active edge for the bit capture.
                                         This parameter can be a value of @ref SPI_Clock_Phase */

  uint16_t SPI_NSS;                 /*!< Specifies whether the NSS signal is managed by
                                         hardware (NSS pin) or by software using the SSI bit.
                                         This parameter can be a value of @ref SPI_Slave_Select_management */
 
  uint16_t SPI_BaudRatePrescaler;   /*!< Specifies the Baud Rate prescaler value which will be
                                         used to configure the transmit and receive SCK clock.
                                         This parameter can be a value of @ref SPI_BaudRate_Prescaler.
                                         @note The communication clock is derived from the master
                                               clock. The slave clock does not need to be set. */

  uint16_t SPI_FirstBit;            /*!< Specifies whether data transfers start from MSB or LSB bit.
                                         This parameter can be a value of @ref SPI_MSB_LSB_transmission */

  uint16_t SPI_CRCPolynomial;       /*!< Specifies the polynomial used for the CRC calculation. */
}SPI_InitTypeDef;

参数设置完成后调用SPI_Init函数进行初始化,把设置好的参数写到对应的寄存器中。也可一通过配置寄存器的值直接配置相关参数而不通过库函数进行配置。通过查询STM32参考手册,可以发现相关寄存器,和相关参数值对应的功能。

STM32 SPI 学习笔记_第2张图片

STM32 SPI 学习笔记_第3张图片

STM32 SPI 学习笔记_第4张图片

四、数据发送与接收

数据发送与接收可以通过库函数中的SPI_I2S_GetFlagStatus读取寄存器txe的值当函数的返回值为1时说明正在发送数据,当返回值为0时可以调用SPI_I2S_SendData函数把要发送的值送给数据寄存器进行发送。读取数据和发送数据过程相同,调用的函数SPI_I2S_GetFlagStatusSPI_I2S_ReceiveData。如果不使用库函数等待SPI_SR寄存器的TXE位为低时将发送数据传送给数据寄存器SPI_DR就可以完成发送功能,等待SPI_SR寄存器的RXNE为低时读取数据寄存器SPI_DR的值可以接收数据。

五、SPI主模式配置步骤

STM32 SPI 学习笔记_第5张图片

STM32 SPI 学习笔记_第6张图片

STM32 SPI 学习笔记_第7张图片

你可能感兴趣的:(嵌入式)