当前位置: 首页 > news >正文

STM32学习笔记----SPI协议

STM32的SPI(串行外设接口,Serial Peripheral Interface)是一种常见的同步串行通信协议,广泛应用于与传感器、显示屏、存储设备等外设的通信。SPI通过主从模式(Master/Slave)来实现数据交换,其中主设备控制通信过程,从设备响应主设备的命令。

STM32的SPI硬件模块支持全双工通信,意味着可以同时发送和接收数据。下面是使用STM32标准库进行SPI配置和使用的详细介绍。

1. SPI的基本原理

SPI协议使用四条基本信号线:

  • SCK(时钟线):由主设备生成时钟信号,驱动数据的传输速率。
  • MISO(主输入从输出):从设备向主设备发送数据。
  • MOSI(主输出从输入):主设备向从设备发送数据。
  • SS(从设备选择):用于选择与主设备通信的从设备。

2. SPI工作模式

SPI有四种工作模式,取决于时钟极性(CPOL)和时钟相位(CPHA):

  • CPOL:时钟的空闲状态。0表示时钟线低电平,1表示时钟线高电平。
  • CPHA:时钟的采样时机。0表示数据在时钟上升沿采样,1表示数据在时钟下降沿采样。

这四种模式分别是:

  • 模式0:CPOL=0, CPHA=0
  • 模式1:CPOL=0, CPHA=1
  • 模式2:CPOL=1, CPHA=0
  • 模式3:CPOL=1, CPHA=1

3. STM32 SPI的配置

在STM32中,通过使用标准外设库来配置SPI。在使用STM32的SPI时,通常需要进行以下几个步骤:

3.1. 开启SPI外设时钟

每个外设都有对应的时钟,需要先开启SPI模块的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 开启SPI1时钟
3.2. 配置SPI的引脚(GPIO)

SPI通信需要使用特定的引脚,这些引脚通常会由GPIO配置来选择。

例如,在STM32F103系列中,SPI1的引脚配置如下:

  • SCK:PA5
  • MISO:PA6
  • MOSI:PA7
  • SS:PA4(可选)

这些引脚通常是复用功能,需配置为复用模式

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // 配置SCK、MISO、MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 配置为推挽复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIO
3.3. 配置SPI参数

STM32的SPI配置涉及时钟极性、时钟相位、数据长度、主从模式等参数。通过SPI_InitTypeDef结构体来配置SPI。

3.4. 使能SPI

配置完成后,需要使能SPI外设。

SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8位数据帧
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // 时钟空闲状态为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 数据在第一个上升沿采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // 软件管理NSS信号
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // 设置波特率预分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据从高位传输
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC校验多项式(可选)
SPI_Init(SPI1, &SPI_InitStructure); // 配置SPI1
SPI_Cmd(SPI1, ENABLE); // 启动SPI

4. SPI通信过程

SPI的通信包括数据的发送和接收,可以通过轮询、DMA(直接存储器访问)或者中断的方式进行。

4.1. 发送数据

SPI通信的发送通过SPI_I2S_SendData函数进行。主设备将数据写入SPI数据寄存器,然后自动通过SPI总线发送出去。

SPI_I2S_SendData(SPI1, data); // 发送数据
4.2. 接收数据

接收数据通过SPI_I2S_ReceiveData函数进行,接收到的数据会自动放入SPI数据寄存器中。

received_data = SPI_I2S_ReceiveData(SPI1); // 接收数据
4.3. 数据传输示例

下面是一个简单的SPI通信传输示例,主设备向从设备发送一个字节并接收返回的数据。

uint8_t SendData(uint8_t data)
{while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送缓冲区空SPI_I2S_SendData(SPI1, data); // 发送数据while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // 等待接收数据return SPI_I2S_ReceiveData(SPI1); // 返回接收到的数据
}

5. SPI中断和DMA

5.1. SPI中断

可以使能SPI的中断,处理如接收完成、发送完成等事件。

SPI_ITConfig(SPI1, SPI_IT_RXNE, ENABLE); // 使能SPI1接收中断

接收中断可以在中断服务程序中处理。

void SPI1_IRQHandler(void)
{if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) != RESET){uint8_t received_byte = SPI_I2S_ReceiveData(SPI1); // 读取接收到的数据}
}
5.2. SPI DMA

使用DMA(直接存储器访问)可以提高数据传输效率,特别是在大数据量传输时。通过配置DMA通道来实现SPI的数据发送和接收。

6. 总结

STM32的SPI外设模块功能强大,支持全双工、同步传输、主从模式,并且可以通过标准库进行配置和使用。使用SPI时要特别注意时钟的配置、引脚的复用、数据帧的格式等参数。通过标准库的函数,可以轻松实现数据传输,同时也支持中断和DMA等方式,提供了高效的传输机制。

相关文章:

STM32学习笔记----SPI协议

STM32的SPI(串行外设接口,Serial Peripheral Interface)是一种常见的同步串行通信协议,广泛应用于与传感器、显示屏、存储设备等外设的通信。SPI通过主从模式(Master/Slave)来实现数据交换,其中…...

Ceph的pool有两种类型

Replicated Pool(拷贝型Pool,默认) 概述: 这是Ceph的默认存储池类型。它通过生成对象的多份拷贝来确保数据的冗余和高可用性。 工作原理: 每个存入的对象(Object)都会被存储为多个副本&#xf…...

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中,以建立自己的绘图方法。WizFlow附带了完整的流程图模板,以帮助您入门。…...

设计模式之插件模式

插件模式是一种设计模式,可以让您在不修改现有系统代码的情况下扩展功能,非常适合实现监控软件和交换机配置的解耦。在嵌入式Linux系统中,您可以使用C++实现插件机制,使监控软件能够动态加载交换机型号的配置模块。这种方式允许您通过插件形式快速适配新型号的交换机。 插…...

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到,贪心算…...

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种: TTL232485 串口的相关知识: 01-【HAL库】STM32实现串口打印(printf方式) , 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…...

任务调度中心-XXL-JOB使用详解

目录 详解 调度中心 执行器 原理 快速入门 源码仓库地址 1.初始化数据库 2.配置调度中心 1.解压源码 2.需改配置文件 3.启动调度中心 3.配置执行器 1.引入pom依赖 2.修改配置文件 3.执行器组件配置 4.部署执行器项目 4.开发第一个任务 BEAN模式(类…...

git本地分支推送到远程和远程pull到本地

文章目录 本地分支推送到远程仓库git拉取远程分支到本地 本地分支推送到远程仓库 要将本地分支推送到远程仓库的某个分支(可以是同名的分支,也可以是不同名的分支),你可以使用 git push 命令。这里有几种不同的情况: …...

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…...

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识,有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言:面向过程,适用于系统…...

STM32 学习笔记-----STM32 的启动过程

STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。 1. Boot引脚设定 STM32 系列芯片有多个启动模式,这些模式是通过引脚&#xff0…...

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…...

网络安全:数字时代的守护盾

在21世纪的今天,互联网已经渗透到我们生活的方方面面,从社交互动、在线购物、远程办公到智能家居,无一不彰显着数字技术的便捷与高效。然而,随着网络空间的日益扩大,网络安全问题也日益凸显,成为了一个不容…...

vue 中监听页面尺寸变化就调用函数

方法一:使用 window.onresize 结合 Vue 实例的生命周期钩子(不推荐,存在覆盖风险) 虽然可以直接使用原生的 window.onresize 事件来监听窗口大小变化,但这种方式在 Vue 项目中有一些局限性,因为如果在多个…...

全面解读 USB Key:定义、使用场景、加密技术及 Java 实现

文章目录 **什么是 USB Key?****USB Key 的使用场景**1. **身份认证**2. **数字签名**3. **数据加密与解密**4. **证书管理** **USB Key 解决的问题****USB Key 使用的加密技术**1. **对称加密**2. **非对称加密**3. **哈希算法**4. **数字签名**5. **PKI&#xff0…...

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想:分而治之 React的组件按照不同的方式可以分成类组件: 划分方式一(按照组件的定义方式) 函数组件(Functional Component )和类组件(Class Component); …...

8 软件项目管理

软件项目管理 1、软件项目管理概念1.1 软件项目管理内容1.2 软件项目管理的4P要素人员产品过程项目 2、软件项目度量2.1 软件项目度量定义及度量方法2.2 面对规模的度量2.3 面对功能的度量UFC相关的五类组件14个复杂性调节因素 F i F_i Fi​一个功能点开发代码行数 2.4 软件估算…...

【移除bpmn-js流程图中的logo图标】

在node_modules文件中查找 bpmn-js\dist\bpmn-modeler.development.js bpmn-js\lib\BaseViewer.js在文件中搜索linkMarkup var linkMarkup <a href"http://bpmn.io" target"_blank" class"bjs-powered-by" title"Powered by bpmn.i…...

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…...

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5&#xff1a;Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了&#xff0c;但是都是基于ROS的&#xff0c;现在最新的已经是ROS2&#xff0c;这里把不同的地方简单记录一下。 搭建一个简单的场景&a…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...