跳到主要内容

STM32 SPI 基础

介绍

SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工的同步串行通信协议,广泛用于微控制器与外部设备(如传感器、存储器、显示器等)之间的通信。STM32 微控制器内置了 SPI 外设,支持多种配置选项,使其适用于各种应用场景。

SPI 通信通常涉及一个主设备(Master)和一个或多个从设备(Slave)。主设备通过时钟信号(SCK)控制通信的时序,并通过 MOSI(主出从入)和 MISO(主入从出)线进行数据传输。

SPI 的工作原理

SPI 通信基于以下四根信号线:

  1. SCK(Serial Clock):时钟信号,由主设备生成,用于同步数据传输。
  2. MOSI(Master Out Slave In):主设备发送数据,从设备接收数据。
  3. MISO(Master In Slave Out):从设备发送数据,主设备接收数据。
  4. NSS(Slave Select):从设备选择信号,用于选择特定的从设备。

SPI 通信是全双工的,意味着主设备和从设备可以同时发送和接收数据。通信的时序由主设备控制,数据在时钟的上升沿或下降沿进行采样。

备注

SPI 的时钟极性(CPOL)和时钟相位(CPHA)决定了数据的采样时机。CPOL 决定了时钟的空闲状态,CPHA 决定了数据是在时钟的第一个边沿还是第二个边沿采样。

STM32 SPI 配置

在 STM32 中,SPI 外设可以通过寄存器或 HAL 库进行配置。以下是一个使用 HAL 库配置 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);
}

在这个示例中,我们配置了 SPI1 为主设备,数据大小为 8 位,时钟极性为低,时钟相位为第一个边沿采样,NSS 信号由软件控制,波特率预分频为 256。

SPI 数据传输

SPI 数据传输通常使用 HAL_SPI_TransmitReceive 函数进行。以下是一个简单的数据传输示例:

c
uint8_t txData[4] = {0x01, 0x02, 0x03, 0x04};
uint8_t rxData[4];

HAL_SPI_TransmitReceive(&hspi, txData, rxData, 4, 1000);

在这个示例中,我们发送了 4 个字节的数据,并接收了 4 个字节的数据。HAL_SPI_TransmitReceive 函数会阻塞直到数据传输完成。

实际应用场景

SPI 在许多实际应用中都有广泛的使用。例如,在物联网设备中,SPI 常用于连接传感器(如温度传感器、加速度计)和无线模块(如 Wi-Fi 或蓝牙模块)。以下是一个使用 SPI 读取温度传感器数据的示例:

c
uint8_t txData[2] = {0x00, 0x00}; // 读取温度的命令
uint8_t rxData[2];

HAL_SPI_TransmitReceive(&hspi, txData, rxData, 2, 1000);

int16_t temperature = (rxData[0] << 8) | rxData[1];

在这个示例中,我们发送了一个读取温度的命令,并接收了两个字节的温度数据。温度数据通常以二进制补码形式表示,需要进行适当的转换。

总结

SPI 是一种高效、灵活的串行通信协议,适用于多种应用场景。通过 STM32 的 SPI 外设,我们可以轻松地实现与外部设备的通信。本文介绍了 SPI 的基本原理、配置方法以及实际应用场景,希望能帮助你更好地理解和应用 SPI。

附加资源与练习

  • 练习 1:尝试配置 STM32 的 SPI 为从设备模式,并与另一个主设备进行通信。
  • 练习 2:使用 SPI 连接一个 SPI Flash 存储器,并尝试读取和写入数据。
  • 资源:参考 STM32 的参考手册和 HAL 库文档,了解更多关于 SPI 的配置选项和使用方法。
提示

在实际项目中,建议使用 DMA(直接内存访问)来优化 SPI 数据传输,以减少 CPU 的负载。