STM32F4的SPI简介和配置

2018/07/09 MCU

原创

转载请注明出处,侵权必究

1、SPI介绍

1.1 SPI总体介绍

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线。

硬件SPI内部简明图

硬件SPI内部简明图

1.2 引脚介绍:

  • MISO 主设备数据输入,从设备数据输出。

  • MOSI 主设备数据输出,从设备数据输入。

  • SCLK 时钟信号,由主设备产生。

  • CS 从设备片选信号,由主设备控制。

寄存器CPOL=0,串行同步时钟的空闲状态为低电平;CPOL=1,串行同步时钟的空闲状态为高电平;

寄存器CPHA=0,串行同步时钟频率的第一个跳变沿数据被采集;CPHA=1,串行同步时钟的第二个跳变沿数据被采集

时序图

2、SPI配置

stm32f4xx_spi.c和 stm32f4xx_spi.h中有SPI的库函数

2.1 STM32 SPI配置位主模式

1) 配置相关引脚的复用功能,使能 SPI1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能 SPI1 时钟
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3 复用为 SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4 复用为 SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5 复用为 SPI1
//设置GPIO为复用模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

2)初始化SPI1, 设置SPI1工作模式等

通过设置SPI1_CR1寄存器实现

初始化函数如下:

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);

其中,SPI_InitTypeDef结构体指针为

typedef struct
{
  uint16_t SPI_Direction;           /*!< SPI通信方式,半双工、全双工、串行发和串行收方式 */

  uint16_t SPI_Mode;                /*!<SPI的主从模式选择 */

  uint16_t SPI_DataSize;            /*!<SPI8位还是16位传输  */

  uint16_t SPI_CPOL;                /*!< 设置时钟极性*/

  uint16_t SPI_CPHA;                /*!< 设置时钟相位 */

  uint16_t SPI_NSS;                 /*!<  NSS 信号由硬件(NSS 管脚)还是软件控制*/
 
  uint16_t SPI_BaudRatePrescaler;   /*!< 设置 SPI 波特率预分频值,84Mhz---2分频到256分频---分频输出 */

  uint16_t SPI_FirstBit;            /*!< 设置数据传输顺序是 MSB 位在前还是 LSB 位在前*/

  uint16_t SPI_CRCPolynomial;       /*!<设置 CRC 校验多项式,提高通信可靠性,大于 1 即可*/
}SPI_InitTypeDef;

注: NSS引脚的作用:从器件选择。这是用于选择从器件的可选引脚。此引脚用作“片选”,可让 SPI主器件与从器件进行单独通信,从而并避免数据线上的竞争。从器件的 NSS 输入可由主器件上的标准 IO 端口驱动。NSS 引脚在使能(SSOE 位)时还可用作输出,并可在SPI 处于主模式配置时驱动为低电平。通过这种方式,只要器件配置成 NSS 硬件管理模式,所有连接到该主器件 NSS 引脚的其它器件 NSS 引脚都将呈现低电平,并因此而作为从器件。当配置为主模式,且 NSS 配置为输入(MSTR=1 且 SSOE=0)时,如果NSS 拉至低电平,SPI 将进入主模式故障状态:MSTR 位自动清零,并且器件配置为从模式

3)使能SPI

//SPI_CR1的bit6
SPI_Cmd(SPI1, ENABLE); //使能 SPI1 外设

4)SPI数据传输

void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

5)查看SPI的传输状态

//判断发送是否完成
SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE);

欢迎关注我的微信公众号

互联网矿工

funpeefun

Search

    Post Directory