【STM32】HAL库-SPI

2023-05-16

● 3线全双工同步传输
● 带或不带第三根双向数据线的双线单工同步传输
● 8或16位传输帧格式选择
● 主或从操作
● 支持多主模式
● 8个主模式波特率预分频系数(最大为fPCLK/2)
● 从模式频率 (最大为fPCLK/2)
● 主模式和从模式的快速通信
● 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
● 可编程的时钟极性和相位
● 可编程的数据顺序,MSB在前或LSB在前
● 可触发中断的专用发送和接收标志
● SPI总线忙状态标志
● 支持可靠通信的硬件CRC
─ 在发送模式下,CRC值可以被作为最后一个字节发送
─ 在全双工模式中对接收到的最后一个字节自动进行CRC校验
● 可触发中断的主模式故障、过载以及CRC错误标志
● 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求
在这里插入图片描述

SPI的引脚

  • MISO:主设备输入/从设备输出引脚
    该引脚在从模式下发送数据,在主模式下接收数据。
  • MOSI:主设备输出/从设备输入引脚
    该引脚在主模式下发送数据,在从模式下接收数据。
  • SCK:时钟信号,时钟信号由主设备产生,时钟频率由主设备决定
    主设备产生(输出),从设备接收(输入)
  • NSS(CS):从设备使能信号,由主设备控制
    从设备的NSS(CS)引脚可以由主设备的一个标准I/O引脚来驱动;也可以由STM32的SPI外设中的NSS引脚来驱动

NSS(CS)引脚管理

STM32的SPI有2种NSS模式:

  • 软件NSS模式
    可以由主设备的一个标准I/O引脚来驱动;也可以由STM32的SPI外设中的NSS引脚来驱动(通过设置SPI_CR1寄存器的SSM位来使能这种模式,内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动)
  • 硬件NSS模式:有2种情况
  1. NSS输出被使能:当工作在主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。(只能有一个主设备情况
  2. NSS输出被关闭:允许操作于多主环境。(SPI_CR2寄存器的SSOE位复位)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

时钟信号的相位与极性

配置SPI_CR1寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系

CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。

CPHA(时钟相位)位控制数据采样的边沿

主和从设备必须配置成相同的时序模式
在这里插入图片描述

数据帧格式

根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB位在先也可以LSB位在先
根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位

所选择的数据帧格式对发送和接收都有效。

在这里插入图片描述
在这里插入图片描述

配置为主设备

在为主设备时,在SCK脚产生串行时钟;由主设备决定时钟频率。
置位SPI_CR1寄存器的MSTR位。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置为从设备

在从模式下,SCK引脚用于接收从主设备来的串行时钟。
SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率。

建议在主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输

配置步骤
在这里插入图片描述

SPI发送/接收模式设置

在接收时,接收到的数据被存放在一个内部的接收缓冲器中;
在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。

  • 工作在主设备下
模式BIDIMODEBIDIOERXONLY工作引脚
全双工模式000TX:MOSI;RX:MISO
单工模式(单向的只接收模式)001RX:MISO
半双工模式(发送模式)110TX:MOSI
半双工模式(接收模式)100RX:MOSI
  1. 全双工模式
    当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;
    在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上;
    与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。

  2. 单向的只接收模式
    SPE=1时,传输开始;
    只有接收器被激活,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。

  3. 半双工模式(发送模式)
    当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;
    在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上;不接收数据。

  4. 半双工模式(接收模式)
    SPE=1并且BIDIOE=0时,传输开始;
    在MOSI引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。不激活发送器,没有数据被串行地送到MOSI引脚上。

  • 工作在从设备下
模式BIDIMODEBIDIOERXONLY工作引脚
全双工模式000TX:MISO;RX:MOSI
单工模式(单向的只接收模式)001RX:MOSI
半双工模式(发送模式)110TX:MISO
半双工模式(接收模式)100RX:MISO
  1. 全双工模式
    当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随后的数据位依次移动进入移位寄存器;
    与此同时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移位寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据。
  2. 单向的只接收模式
    当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随后数据位依次移动进入移位寄存器;
    不启动发送器,没有数据被串行地传送到MISO引脚上。
  3. 半双工模式(发送模式)
    当从设备接收到时钟信号并且发送缓冲器中的第一个数据位被传送到MISO引脚上的时候,数据传输开始;
    在第一个数据位被传送到MISO引脚上的同时,发送缓冲器中要发送的数据被平行地传送到8位的移位寄存器中,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据;
    不接收数据。
  4. 半双工模式(接收模式)
    当从设备接收到时钟信号并且第一个数据位出现在它的MISO时,数据传输开始;
    从MISO引脚上接收到的数据被串行地传送到8位的移位寄存器中,然后被平行地传送到SPI_DR寄存器(接收缓冲器);
    不启动发送器,没有数据被串行地传送到MISO引脚上。

在这里插入图片描述

在这里插入图片描述

在写入发送缓冲器之前,软件必须确认TXE标志为’1’

状态标志

应用程序通过3个状态标志可以完全监控SPI总线的状态。

  1. 发送缓冲器空闲标志(TXE)
    此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。
  2. 接收缓冲器非空(RXNE)
    此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
  3. 忙(Busy)标志
    BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。

关闭SPI

当通讯结束,可以通过关闭SPI模块来终止通讯。清除SPE位即可关闭SPI。
在某些配置下,如果在传输还未完成时,就关闭SPI模块并进入停机模式,则可能导致当前的传输被破坏,而且BSY标志也变得不可信。
为了避免发生这种情况,关闭SPI模块时,建议按照下述步骤操作:

  • 在主或从模式下的全双工模式(BIDIMODE=0,RXONLY=0)
  1. 等待RXNE=1并接收最后一个数据;
  2. 等待TXE=1;
  3. 等待BSY=0;
  4. 关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。
  • 在主或从模式下的单向只发送模式(BIDIMODE=0,RXONLY=0)或双向的发送模式(半双工模式)(BIDIMODE=1,BIDIOE=1)

在SPI_DR寄存器中写入最后一个数据后:

  1. 等待TXE=1;
  2. 等待BSY=0;
  3. 关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。
  • 在主模式下的单向只接收模式(MSTR=1,BIDIMODE=0,RXONLY=1)或双向
    的接收模式(半双工模式)(MSTR=1,BIDIMODE=1,BIDIOE=0)

这种情况需要特别地处理,以保证SPI不会开始一次新的传输:

  1. 等待倒数第二个(第n-1个)RXNE=1;
  2. 在关闭SPI(SPE=0)之前等待一个SPI时钟周期(使用软件延迟);
  3. 在进入停机模式(或关闭该模块的时钟)之前等待最后一个RXNE=1。

注: 在主模式下的单向只接收模式(MSTR=1,BDM=1,BDOE=0)时,传输过程中BSY标志始终为低。

  • 在从模式下的只接收模式(MSTR=0,BIDIMODE=0,RXONLY=1)或双向的接收模
    式(半双工模式)(MSTR=0,BIDIMODE=1,BIDIOE=0)
  1. 可以在任何时候关闭SPI(SPE=0),SPI会在当前的传输结束后被关闭;
  2. 如果希望进入停机模式,在进入停机模式(或关闭该模块的时钟)之前必须首先等待
    BSY=0。

DMA发送与接收

为了达到最大通信速度,需要及时往SPI发送缓冲器填数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求/应答的DMA机制。

在这里插入图片描述

在发送模式下,当DMA已经传输了所有要发送的数据(DMA_ISR寄存器的TCIF标志变为’1’)后,可以通过监视BSY标志以确认SPI通信结束,这样可以避免在关闭SPI或进入停止模式时,破坏最后一个数据的传输。因此软件需要先等待TXE=1,然后等待BSY=0

在这里插入图片描述
在这里插入图片描述

CRC功能

以后再更

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】HAL库-SPI 的相关文章

  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • C、硬件抽象层中“extern”类型的变量

    我正在研究硬件抽象层 该 HAL 的目的是在 Linux 驱动程序和 MCU 驱动程序之间轻松切换 我正在研究SPI接口 下面是 打开 SPI接口的HAL函数的签名 哈尔 spi h spi handle t spi open spi po
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启

随机推荐

  • 误差与精度

    整理自 误差理论与数据处理 合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做 公差与测量 或者叫做 机械精度设计 xff0c 而公差或者精度的本质含义就是误差的大小 xff0c 公差越小 xff0c 误差越小 xff0c 精度越高
  • 两个类的头文件互相包含

    两个类的头文件互相包含 我做任务的时候遇到了两个类都互相包含对方的对象的问题 xff0c 本来是有错误的 xff0c 但经过我一番改动 xff0c 两个头文件互相包含同时 xff0c 每个头文件都含有令一个类的前置声明 虽然最后运行正确 x
  • 【C++ STL 容器】——vector

    概述 vector容器也被称作向量 xff0c 实现了动态的数组 xff0c 用于元素数量变化的对象数组 xff0c 算是比较常用的容器 常用函数 构造函数 vector 创建一个空vectorvector int size 创建一个vec
  • 2021-07-22

    MSP432在keil中通过CMSIS DAP下载程序出现cannot enter debug mode的解决办法 xff1a MSP432下载程序出现cannot enter debug mode 可以通过修改如下设置 Debug里面的两
  • 通信协议基础以及常用的串口通信协议

    通信协议 xff1a 串行通信和并行通信 在数据的通信方式中根据数据传输方式的不同可以分为 xff1a 串行通信和并行通信 串行通信 xff1a 串行通信是指使用一条数据线 xff0c 将数据一位一位地依次传输 xff0c 每一位数据占据一
  • Ubuntu安装ROS melodic,管理环境,创建工作空间

    一 安装ROS 1 设置源 xff1a sudo sh c 39 etc lsb release amp amp echo 34 deb http mirrors tuna tsinghua edu cn ros ubuntu 96 lsb
  • HTTP请求报文的结构组成及URL的结构组成

    HTTP请求报文 HTTP 超文本传输协议 Hypertext Transfer Protocol xff0c 简称HTTP 是应用层协议 HTTP 是一种请求 响应式的协议 xff0c 即一个客户端与服务器建立连接后 xff0c 向服务器
  • Qt之旅_001>>Qt常用窗口类之间的关系

    QApplication xff0c QGuiApplication QCoreApplication三者之间的关系 QCoreApplication处于core模块中 xff0c 为应用程序提供了一个非gui的时间循环 xff1b QGu
  • GPIO相关介绍

    文章目录 GPIO概念TXD与RXD GPIO的使用注意STM32IO口哪些兼容5V一定不要接超过5V的电压默认不能做输出的GPIO GPIO硬件原理图GPIO地址 GPIO的八种工作模式浮空输入带上拉输入带下拉输入模拟输入开漏输出推挽输出
  • STM32的常用C语言

    文章目录 一些被坑了的注意点 int16 define结构体与共用体指针 C语言发展史C语言概述C90 标准C99标准C11标准 C编译o代替c 条件语句else ifdo while 变量定义一个字符串字符串结尾 定义一个字符串数组sta
  • STM32应用霍尔转速传感器基于输入捕获

    这里我用通用定时器3的通道1来测量转速 霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器 STM32程序实现程序介绍程序源码TIM3 CAP HTIM3 CAP H解读TIM3 CAP CTIM3 CAP
  • Android so库开发——使用Studio生成自己的so库(一)

    一 创建Native项目 1 新建 Native 项目 1 xff09 新建项目 选择最下面的 Native C 43 43 下一步即可 2 xff09 填写项目信息 3 xff09 选择C 43 43 版本可以直接选择默认 2 下载并配置
  • C语言实现线性回归求斜率

    2020 11 22 修改 span class token comment 线性回归求斜率 注意数据类型 参数 count 数据个数 数组行 列 的个数 数组的行列数目相等 参数 dataCol X 数据的列数据 参数 dataRow Y
  • 【C语言】详解位域定义与使用

    位域的定义 span class token keyword struct span span class token class name bit span span class token punctuation span span c
  • C语言实现MQTT协议(一)协议讲解

    MQTT介绍 MQTT是一个客户端服务端架构的发布 订阅模式的消息传输协议 它的设计思想是轻巧 开放 简单 规范 xff0c 易于实现 这些特点使得它对很多场景来说都是很好的选择 xff0c 特别是对于受限的环境如机器与机器的通信 xff0
  • 【STM32】HAL库-外部中断

    外部中断框图 产生中断 硬件触发外部中断 配置中断屏蔽寄存器中的屏蔽位 xff0c 允许该外部中断请求 通过AFIO EXTICRx配置GPIO线上的外部中断 事件 xff0c 必须先使能AFIO时钟 选择外部中断的触发边沿 xff0c 上
  • 【STM32】HAL库-系统滴答定时器SysTick

    SysTick定时器被捆绑在NVIC中 xff0c 是一个简单的定时器 xff0c 对于CM3 CM4内核芯片 xff0c 都有Systick定时器 Systick定时器常用来做延时 xff0c 或者实时系统的心跳时钟 这样可以节省MCU资
  • 【STM32】HAL库-串口USART

    USART简介 通用同步异步收发器 USART 提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换 USART利用分数波特率发生器提供宽范围的波特率选择 一个波特率寄存器 USART BRR xff0c
  • 【STM32】HAL库-通用定时器

    简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成 它适用于多种场合 xff0c 包括测量输入信号的脉冲长度 输入捕获 或者产生输出波形 输出比较和PWM 使用定时器预分频器和RCC时钟控制器预分频器 xff0c 脉冲长
  • 【STM32】HAL库-SPI

    3线全双工同步传输 带或不带第三根双向数据线的双线单工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数 最大为fPCLK 2 从模式频率 最大为fPCLK 2 主模式和从模式的快速通信 主模式和从模式