【STM32】SPI协议整理:硬件连接、通信时序与HAL库操作

📅 2026/6/18 21:38:01
【STM32】SPI协议整理:硬件连接、通信时序与HAL库操作
【STM32】SPI协议整理硬件连接、通信时序与HAL库操作文章目录【STM32】SPI协议整理硬件连接、通信时序与HAL库操作概述一、SPI程序层次1.1 SPI硬件原理图解析1.2 硬件框图 软件层次二、SPI 协议2.1 CS 片选2.2 SPI 是怎么传 1 字节数据2.3 SPI模式三、HAL 编程3.1 STM32CubeMX 配置3.2 查询方式函数说明3.3 中断方式函数说明3.4 DMA 方式函数说明3.5 W25Q64 操作方法概述SPI 可以理解为主控 MCU 按自己给出的时钟节拍和外设一边发数据、一边收数据的高速串行通信协议。同步全双工SPI 接口主要应用在 EEPROM、 FLASH、实时时钟、网络控制器、 OLED 显示驱动器、 AD转换器数字信号处理器、数字信号解码器等设备之间。一、SPI程序层次1.1 SPI硬件原理图解析SPI_Flash模块SPI硬件原理图MCU 引脚SPI 名称Flash 引脚作用PA7MOSIDIMCU FlashPA6MISODOFlash MCUPA5SCKSCKMCU 提供时钟节拍PB9CSCS片选选择某个 FlashGNDGNDGND共地VCCVCCVCC供电1.2 硬件框图 软件层次SPI 硬件框图SPI 软件层次程序 通过SPI控制器 来操作SPI FlashSPI设备二、SPI 协议2.1 CS 片选硬件连线SPI设备只能片选一个谁的 CS 被拉低谁就被选中2.2 SPI 是怎么传 1 字节数据SPI 传输一个字节2.3 SPI模式SPI 模式CPOLCPHAMode 00SCK初始电平为低0在第一个时钟沿采样数据Mode 10SCK初始电平为低1在第二个时钟沿采样数据Mode 21SCK初始电平为高0在第一个时钟沿采样数据Mode 31SCK初始电平为高1在第二个时钟沿采样数据不管是什么模式SPI协议 都可以同时发送八位数据同时接收到八位数据 交换数据三、HAL 编程3.1 STM32CubeMX 配置配置 SPI配置 CS 片选3.2 查询方式函数说明/* 发送同时接收数据 */HAL_StatusTypeDefHAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize,uint32_tTimeout);/* 发送数据 */HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);/* 接收数据 */HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);参数说明SPI_HandleTypeDef *hspi使用哪个 SPI 控制器uint8_t *pTxData或uint8_t *pData要发送的数据的 bufferuint8_t *pRxData或uint8_t *pData存储接收到的数据是 bufferuint16_t Size数据个数uint32_t Timeout超时时间单位是 Tick一般是 1ms返回值HAL_OK成功HAL_ERROR错误HAL_BUSY总线忙HAL_TIMEOUT超时3.3 中断方式函数说明STM32cubeMX 配置中断方式/* 发送同时接收数据 */HAL_StatusTypeDefHAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize);/* 发送数据 */HAL_StatusTypeDefHAL_SPI_Transmit_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);/* 接收数据 */HAL_StatusTypeDefHAL_SPI_Receive_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize)/* 发送、接收完成回调函数 */voidHAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef*hspi);/* 发送完成回调函数 */voidHAL_SPI_TxCpltCallback(SPI_HandleTypeDef*hspi);/* 接收完成回调函数 */voidHAL_SPI_RxCpltCallback(SPI_HandleTypeDef*hspi)/* 出错回调函数 */voidHAL_SPI_ErrorCallback(SPI_HandleTypeDef*hspi);参数说明SPI_HandleTypeDef *hspi使用哪个 SPI 控制器uint8_t *pTxData / uint8_t *pData要发送的数据的 bufferuint8_t *pRxData / uint8_t *pData存储接收到的数据是 bufferuint16_t Size数据个数uint32_t Timeout超时时间单位是 Tick一般是 1ms返回值HAL_OK成功 HAL_ERROR错误 HAL_BUSY总线忙 HAL_TIMEOUT超时3.4 DMA 方式函数说明STM32cubeMX 配置DMA方式/* 发送同时接收数据 */HAL_StatusTypeDefHAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize);/* 发送数据 */HAL_StatusTypeDefHAL_SPI_Transmit_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);/* 接收数据 */HAL_StatusTypeDefHAL_SPI_Receive_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);/* 发送、接收完成回调函数 */voidHAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef*hspi);/* 发送完成回调函数 */voidHAL_SPI_TxCpltCallback(SPI_HandleTypeDef*hspi);/* 接收完成回调函数 */voidHAL_SPI_RxCpltCallback(SPI_HandleTypeDef*hspi)/* 出错回调函数 */voidHAL_SPI_ErrorCallback(SPI_HandleTypeDef*hspi);参数说明SPI_HandleTypeDef *hi2c使用哪个 I2C 控制器uint16_t DevAddress设备地址需要把 7 位地址左移 1 位uint8_t *pData数据 bufferuint16_t Size数据个数返回值HAL_OK成功HAL_BUSY总线忙3.5 W25Q64 操作方法读数据写使能、读状态擦除扇区烧写页 见W25Q64芯片手册欢迎大家一起交流讨论