这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32H503的SPI发送数据详细流程

共1条 1/1 1 跳转至

STM32H503的SPI发送数据详细流程

院士
2026-02-19 16:44:53     打赏
初始化阶段
  1. 使能SPI时钟‌:通过RCC(复位和时钟控制)相关寄存器使能SPI模块对应的时钟,例如对RCC_PERIPHCLK_ENABLE寄存器进行配置,确保SPI模块能够正常工作在相应的时钟频率下。目的是为SPI模块提供运行所需的时钟信号。

  2. 配置GPIO引脚

    • 配置SPI的MOSI(主出从入)、SCK(时钟)引脚为复用推挽输出模式,MISO(主入从出)引脚为浮空输入或带上拉/下拉输入模式(根据实际硬件连接情况)。比如对GPIOx_MODER、GPIOx_AFR等寄存器进行设置。这是为了让这些引脚能够正确地与SPI设备进行数据传输和时钟信号的发送/接收。

    • 如果有片选引脚(NSS),配置其为输出模式,并将其置为高电平(默认不选中从设备)。

  3. SPI初始化

    • 设置SPI的工作模式(主模式或从模式),在主模式下STM32H503作为SPI通信的发起者和控制者,通过对SPIx_CR1寄存器的相关位进行配置来实现。

    • 配置SPI的数据帧格式,包括数据位宽(8位或16位等)、时钟极性(CPOL)和时钟相位(CPHA)。CPOL决定了时钟信号在空闲状态下的电平,CPHA决定了数据采样是在时钟的第一个沿还是第二个沿,这些都通过对SPIx_CR1等寄存器的相应位设置来完成。

    • 设置SPI的波特率预分频因子,以确定SPI通信的速度,可在SPIx_CR1寄存器中设置BR[2:0]位来调整波特率。

    • 使能SPI的硬件NSS信号(如果使用硬件片选)或者将软件NSS位使能(如果使用软件片选),通过对SPIx_CR1寄存器的相关位操作实现。

数据发送阶段
  1. 选中从设备‌:如果是软件片选,将NSS引脚拉低,选中对应的从设备;如果是硬件片选,在初始化配置好后,SPI模块会自动管理NSS信号。

  2. 检查发送缓冲区状态‌:查询SPIx_SR寄存器的TXE(发送缓冲区为空)标志位,当该位为1时,表示发送缓冲区为空,可以写入新的数据。

  3. 写入数据到发送缓冲区‌:将要发送的数据写入SPIx_DR(数据寄存器),SPI模块会自动将数据从发送缓冲区发送出去。

  4. 等待数据发送完成‌:继续查询SPIx_SR寄存器的BSY(忙)标志位,当BSY位为0时,表示SPI传输已经完成,数据已经成功发送到从设备。

数据发送结束阶段
  1. 取消选中从设备‌:将NSS引脚拉高(如果是软件片选),结束与从设备的通信。

  2. 根据需要进行后续操作‌:例如可以继续发送下一组数据,或者进行其他SPI相关的操作,如接收从设备返回的数据等。

学习完原理知识,我们看看项目中如何实现呢?

/**
  * @brief  Transmit an amount of data in blocking mode.
  * @param  hspi   : pointer to a SPI_HandleTypeDef structure that contains
  *                  the configuration information for SPI module.
  * @param  pData  : pointer to data buffer
  * @param  Size   : amount of data to be sent
  * @param  Timeout: Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

好吧!现在官方把SPI实现的封装超级完美。甚至并不需要我们理解SPI的过程。

总之,要是有时间还是要深入了解寄存器的每个bit的意义。





关键词: SPI     发送    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]