跳到主要内容

STM32 SPI 主从模式

SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工的同步通信协议,广泛用于微控制器与外围设备(如传感器、存储器、显示器等)之间的通信。STM32 微控制器支持 SPI 主从模式,本教程将详细介绍这两种模式的工作原理、配置方法以及实际应用。

什么是 SPI 主从模式?

在 SPI 通信中,存在两种角色:主设备(Master)从设备(Slave)。主设备负责生成时钟信号(SCK)并控制通信的启动和结束,而从设备则根据主设备的时钟信号进行数据交换。SPI 通信通常需要四根信号线:

  • SCK(Serial Clock):时钟信号,由主设备生成。
  • MOSI(Master Out Slave In):主设备发送数据,从设备接收数据。
  • MISO(Master In Slave Out):从设备发送数据,主设备接收数据。
  • NSS(Slave Select):从设备选择信号,由主设备控制。
备注

SPI 是一种全双工通信协议,意味着主设备和从设备可以同时发送和接收数据。

SPI 主模式配置

在 STM32 中,配置 SPI 主模式需要设置以下参数:

  1. 时钟极性(CPOL):决定时钟信号的空闲状态。

    • CPOL = 0:时钟空闲时为低电平。
    • CPOL = 1:时钟空闲时为高电平。
  2. 时钟相位(CPHA):决定数据采样的时机。

    • CPHA = 0:数据在时钟的第一个边沿采样。
    • CPHA = 1:数据在时钟的第二个边沿采样。
  3. 数据帧格式:通常为 8 位或 16 位。

  4. 波特率:决定通信速度。

以下是一个配置 SPI 主模式的代码示例:

c
#include "stm32f4xx_hal.h"

SPI_HandleTypeDef hspi;

void SPI_Init(void) {
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi.Init.TIMode = SPI_TIMODE_DISABLE;
hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi);
}
提示

在实际应用中,确保主设备和从设备的 CPOL 和 CPHA 设置一致,否则通信将失败。

SPI 从模式配置

在从模式下,STM32 的 SPI 外设会根据主设备的时钟信号进行数据交换。从设备的配置与主设备类似,但需要将模式设置为 SPI_MODE_SLAVE

以下是一个配置 SPI 从模式的代码示例:

c
#include "stm32f4xx_hal.h"

SPI_HandleTypeDef hspi;

void SPI_Init(void) {
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_SLAVE;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi.Init.NSS = SPI_NSS_HARD_INPUT;
hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi.Init.TIMode = SPI_TIMODE_DISABLE;
hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi);
}

主从通信示例

以下是一个简单的 SPI 主从通信示例,主设备发送数据,从设备接收并返回数据。

主设备代码

c
uint8_t txData = 0x55;
uint8_t rxData;

HAL_SPI_TransmitReceive(&hspi, &txData, &rxData, 1, HAL_MAX_DELAY);

从设备代码

c
uint8_t rxData;
uint8_t txData = 0xAA;

HAL_SPI_TransmitReceive(&hspi, &txData, &rxData, 1, HAL_MAX_DELAY);
警告

在实际应用中,确保主设备和从设备的波特率设置一致,否则通信将失败。

实际应用场景

SPI 主从模式广泛应用于以下场景:

  1. 传感器数据采集:主设备(如 STM32)通过 SPI 从传感器(如温度传感器、加速度计)读取数据。
  2. 存储器读写:主设备通过 SPI 与外部存储器(如 Flash、EEPROM)进行数据交换。
  3. 显示器控制:主设备通过 SPI 控制 LCD 或 OLED 显示器。

总结

本教程详细介绍了 STM32 的 SPI 主从模式,包括基本概念、配置方法、代码示例以及实际应用场景。通过本教程,您应该能够理解并实现 SPI 主从通信。

附加资源与练习

  1. 练习:尝试配置两个 STM32 开发板,一个作为主设备,另一个作为从设备,实现双向通信。
  2. 参考文档:STM32 官方参考手册和 HAL 库文档。
  3. 进阶学习:探索 SPI 的多从设备通信模式,了解如何使用硬件 NSS 信号管理多个从设备。
注意

在实际开发中,务必注意 SPI 的时序和信号完整性,避免通信错误。