SPI - 总线协议

什么是 SPI?

SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工的同步通信总线。它主要用于单片机与各种外设之间的通信,比如传感器、显示屏、存储芯片等。

SPI 总线非常简单,通常只需要 4 根线:

  • SCK:时钟线,由主设备产生,用于同步数据传输

  • MOSI:主设备输出,从设备输入(Master Out Slave In)

  • MISO:主设备输入,从设备输出(Master In Slave Out)

  • CS/SS:片选线,用于选择通信的从设备(低电平有效)

SPI 的 "脾气":CPOL 和 CPHA

SPI 有个特别的地方,就是它有四种 "脾气"(工作模式),由两个参数决定:

  1. CPOL(时钟极性):决定时钟线在空闲时的电平

    • CPOL=0:空闲时 SCK 为低电平

    • CPOL=1:空闲时 SCK 为高电平

  2. 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

  1. 打开 STM32CubeMX,选择你的单片机型号

  2. 在 Pinout 视图中,找到 SPI 外设(如 SPI1、SPI2 等)

  3. 配置 SPI 模式为主模式(Master)或从模式(Slave)

  4. 配置参数:

    • 数据长度(通常是 8 位)

    • 时钟极性(CPOL)

    • 时钟相位(CPHA)

    • 分频系数(决定 SPI 通信速度)

    • 片选线(可以硬件控制或软件控制)

步骤 2:生成代码

配置完成后,点击 "Generate Code" 生成初始化代码。CubeMX 会自动帮我们生成 SPI 的初始化函数MX_SPI1_Init()

步骤 3:使用 HAL 库函数进行通信

HAL 库提供了几个常用的 SPI 通信函数:

  1. 发送数据

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

  1. 接收数据

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);

  1. 首先我们拉低片选线(CS/SS),告诉从设备 "现在要和你通信了"

  2. 使用HAL_SPI_Transmit()函数发送数据

  3. 发送完成后,拉高片选线,告诉从设备 "通信结束"

  4. 函数返回 0 表示发送成功,返回 - 1 表示发送失败

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值