![]()
什么是 SPI?
SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工的同步通信总线。它主要用于单片机与各种外设之间的通信,比如传感器、显示屏、存储芯片等。
SPI 总线非常简单,通常只需要 4 根线:
-
SCK:时钟线,由主设备产生,用于同步数据传输
-
MOSI:主设备输出,从设备输入(Master Out Slave In)
-
MISO:主设备输入,从设备输出(Master In Slave Out)
-
CS/SS:片选线,用于选择通信的从设备(低电平有效)
SPI 的 "脾气":CPOL 和 CPHA
SPI 有个特别的地方,就是它有四种 "脾气"(工作模式),由两个参数决定:
-
CPOL(时钟极性):决定时钟线在空闲时的电平
-
CPOL=0:空闲时 SCK 为低电平
-
CPOL=1:空闲时 SCK 为高电平
-
-
CPHA(时钟相位):决定数据在时钟的哪个边沿被采样
-
CPHA=0:在时钟的第一个边沿采样数据
-
CPHA=1:在时钟的第二个边沿采样数据
-
这两个参数组合起来,就形成了 SPI 的四种工作模式:
-
Mode 0:CPOL=0,CPHA=0(最常用)
-
Mode 1:CPOL=0,CPHA=1
-
Mode 2:CPOL=1,CPHA=0
-
Mode 3:CPOL=1,CPHA=1
要记得看芯片数据手册选择模式。
重要:通信双方(主设备和从设备)必须使用相同的工作模式,否则会 "鸡同鸭讲",无法正确通信。
STM32 HAL 库如何使用 SPI?
下面我们以 STM32CubeMX 和 HAL 库为例,一步步教你配置和使用 SPI。
步骤 1:用 CubeMX 配置 SPI
-
打开 STM32CubeMX,选择你的单片机型号
-
在 Pinout 视图中,找到 SPI 外设(如 SPI1、SPI2 等)
-
配置 SPI 模式为主模式(Master)或从模式(Slave)
-
配置参数:
-
数据长度(通常是 8 位)
-
时钟极性(CPOL)
-
时钟相位(CPHA)
-
分频系数(决定 SPI 通信速度)
-
片选线(可以硬件控制或软件控制)
-
步骤 2:生成代码
配置完成后,点击 "Generate Code" 生成初始化代码。CubeMX 会自动帮我们生成 SPI 的初始化函数MX_SPI1_Init()。
步骤 3:使用 HAL 库函数进行通信
HAL 库提供了几个常用的 SPI 通信函数:
-
发送数据:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
-
接收数据:
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
同时发送和接收数据:
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
-
首先我们拉低片选线(CS/SS),告诉从设备 "现在要和你通信了"
-
使用
HAL_SPI_Transmit()函数发送数据 -
发送完成后,拉高片选线,告诉从设备 "通信结束"
-
函数返回 0 表示发送成功,返回 - 1 表示发送失败
32万+

被折叠的 条评论
为什么被折叠?



