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 主模式需要设置以下参数:
-
时钟极性(CPOL):决定时钟信号的空闲状态。
- CPOL = 0:时钟空闲时为低电平。
- CPOL = 1:时钟空闲时为高电平。
-
时钟相位(CPHA):决定数据采样的时机。
- CPHA = 0:数据在时钟的第一个边沿采样。
- CPHA = 1:数据在时钟的第二个边沿采样。
-
数据帧格式:通常为 8 位或 16 位。
-
波特率:决定通信速度。
以下是一个配置 SPI 主模式的代码示例:
#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 从模式的代码示例:
#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 主从通信示例,主设备发送数据,从设备接收并返回数据。
主设备代码
uint8_t txData = 0x55;
uint8_t rxData;
HAL_SPI_TransmitReceive(&hspi, &txData, &rxData, 1, HAL_MAX_DELAY);
从设备代码
uint8_t rxData;
uint8_t txData = 0xAA;
HAL_SPI_TransmitReceive(&hspi, &txData, &rxData, 1, HAL_MAX_DELAY);
在实际应用中,确保主设备和从设备的波特率设置一致,否则通信将失败。
实际应用场景
SPI 主从模式广泛应用于以下场景:
- 传感器数据采集:主设备(如 STM32)通过 SPI 从传感器(如温度传感器、加速度计)读取数据。
- 存储器读写:主设备通过 SPI 与外部存储器(如 Flash、EEPROM)进行数据交换。
- 显示器控制:主设备通过 SPI 控制 LCD 或 OLED 显示器。
总结
本教程详细介绍了 STM32 的 SPI 主从模式,包括基本概念、配置方法、代码示例以及实际应用场景。通过本教程,您应该能够理解并实现 SPI 主从通信。
附加资源与练习
- 练习:尝试配置两个 STM32 开发板,一个作为主设备,另一个作为从设备,实现双向通信。
- 参考文档:STM32 官方参考手册和 HAL 库文档。
- 进阶学习:探索 SPI 的多从设备通信模式,了解如何使用硬件 NSS 信号管理多个从设备。
在实际开发中,务必注意 SPI 的时序和信号完整性,避免通信错误。