SPI协议内容及STM32 SPI的操作

SPI总线协议简介及内容
简介

SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全/半双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

SPI特征

3根/4根线全双工同步传输
8或16位传输帧格式选择
主从操作模式
支持多主操作模式
从模式频率(最大为fpclk/2)
可编程的时钟极性和相位
可编程的数据顺序,MSB在前或LSB在前
可触发中断的专用发送和标志
SPI总线忙状态标志
支持可靠通信的CRC

功能
  • SPI框图
    SPI框图

  • SPI通常都是采用四个引脚和外围设备相连,每个引脚的含义:

    • MISO 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
    • MOSI 主设备输出/从设备输入引脚。该引脚在从模式下接收数据,在主模式下发送数据。
    • SCK 串口时钟,作为主设备的输出,从设备的输入。
    • NSS 从设备选择(片选引脚),是一个可选的引脚,用来选择主/从设备。
  • SPI时钟极性(CPOL)和时钟相位(CPHA)的组合时序图
    SPI极性和相位时序图

  • SPI的极性和相位组合有四种:

    • CPHA=0,表示第一个边沿:
      对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
      对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
    • CPHA=1,表示第二个边沿:
      对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;
      对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;
  • 可以相互组合通过寄存器(SPI_CR1)设置不同的时钟极性和时钟相位组合。

STM32 的SPI寄存器映射及复位值
  • SPI寄存器映射

寄存器映射和复位值

用STM32固件库函数编程配置SPI总线操作
  • SPI所用到的GPIO初始化
void SPI_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Configure SPI2  -------------------------*/
  GPIO_StructInit(&GPIO_InitStructure);
  //CS | NSS
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  //SCK
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  //MISO
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  //MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
  • SPI配置初始化
void SPI_Configuration(void)
{
  SPI_InitTypeDef SPI_InitStructure;

  SPI_Cmd(SPI2, DISABLE);
  SPI_StructInit(&SPI_InitStructure);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;     
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;    
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  /*Enable SPI1.NSS as a GPIO*/
  SPI_SSOutputCmd(SPI2, ENABLE);

//  GPIO_SetBits(GPIOD, GPIO_Pin_7); 
  GPIO_SetBits(GPIOB, GPIO_Pin_12);    //CS = 1 |  NSS=1 

  /* Enable SPI1 */
  SPI_Cmd(SPI2, ENABLE);
}
  • Tips

    对于SPI配置中的CPOL和CPHA两个选项,可以根据连接外设需求不同进行修改配置,参考上面提到的四种模式。

  • SPI发送和接收

u8 SPI_SendByte(u8 tempdata)
{
  /* Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);     

  /* Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(SPI2, tempdata);    //send tempdata

  /* Wait to receive a byte */
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);    
  /* Return the byte read from the SPI bus  */
  return SPI_I2S_ReceiveData(SPI2);
}


u8 SPI_ReceiveByte(void)
{
  return (SPI_SendByte(0x00));
}
一般在SPI总线外围所接设备


  • 一般常见的SPI连接外围设备有:

Flash存储芯片,传感器类芯片。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32是一种由意法半导体公司生产的高性能微控制器,它可以通过模拟SPI协议与其他设备通信SPI是串行外设接口协议,用于在微控制器和其他设备之间传输数据。 使用STM32模拟SPI协议,需要首先了解SPI协议的工作原理。SPI协议通过一个主设备和至少一个从设备之间进行通信通信的数据是在时钟和数据线上同步传输的。在STM32中,模拟SPI协议的实现需要通过一些特定的寄存器和GPIO口进行配置。 通常情况下,STM32作为主设备时需要产生一个时钟信号来驱动从设备传输数据。在STM32的GPIO口中,需要将Clock、Master-out-slave-in、Master-in-slave-out、Slave-select四个口与从设备相连。每个GPIO口需要进行相应的配置,包括时钟极性、相、主从模式、时钟速率等参数。 使用STM32模拟SPI协议通信的流程如下:首先,主设备通过拉低Slave-select口来选择一个从设备;然后,主设备生成时钟信号,并在时钟上上升沿或下降沿发送数据;从设备接收到时钟信号后,通过Master-in-slave-out口传送相应的数据;在传输完成后,主设备释放Slave-select口,通信结束。 总的来说,使用STM32模拟SPI协议进行通信需要进行一系列的配置和操作,但是可以实现快速、可靠的数据传输。 ### 回答2: STM32是一款高性能微控制器,支持多种通信协议,其中包括SPI协议SPI协议是一种基于“主从”架构的串行通信协议,可以用于外设与主控器之间的通讯。 STM32模拟SPI协议使用GPIO模拟SPI通信,具有简单、快速、灵活等特点。在模拟SPI协议时,需要将不同GPIO端口设置为SPI通信引脚,包括如下四个信号线: 1. SCLK:时钟信号,由主控器产生,控制数据传输速度。 2. MOSI:数据输出信号,由主控器向从设备输出数据。 3. MISO:数据输入信号,从设备向主控器返回数据。 4. CS:片选信号,由主控器产生,选择与其通信的从设备。 在模拟SPI协议时,先拉低CS信号,向从设备发送命令和数据,等待从设备的响应,并读取从设备返回的数据。通讯完成后释放CS信号。 模拟SPI协议需要通过软件编写SPI接口程序来实现,主控器需要控制时钟脉冲的频率和传输字节的数量等参数。可以通过编写SPI接口类库,使用STM32内部的SPI外设来实现模拟SPI协议,或者通过GPIO口操作实现。 总之,STM32模拟SPI协议是一种简单易用、灵活、仅依赖于GPIO模拟SPI协议,可以快速实现与各种从设备的通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值