stm32 HAI库 SPI(一)原理

基本特点

  • 通信方式:同步、串行(串行、并行、并发,别再傻傻分不清了!_串行和并行的区别-CSDN博客)、全双工 (也可以选择半双工)
  • 速率:50MHZ以下
  • 数据格式:8位/16位
  • 传输顺序:MSB先行/LSB先行

通信

spi通信需要四个引脚,MOSI MISO SCK NSS。

  • MOSI: master output slave input 主设备数据输出 从设备数据接收
  • MISO:master input slave output
  • SCK:时钟线 只有主设备能控制。不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备
  • NSS(CS):片选不同的从设备 可选择硬件NSS和软件NSS

一对一:

一对多:

SCK

时钟线 空闲电平取决于工作模式的设置(见后)

NSS

原理:NSS保持高电平,如果想发起通信,主设备就去拉低对应从机的NSS信号线使能从机 开始与其通信(即MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效)

NSS可以选择是硬件模式还是软件模式,硬件模式就是一个固定的引脚作为NSS,直接与外界从设备的GPIO口相连,软件自选管脚

NSS模式的选择是由SPI_CR1寄存器中的ssm位和SPI_CR2寄存器中的SSOE位控制的。

区分一下NSS和CS

虽然大概上说这两者差不多(或者可以直接看做相同) 但还是有些微妙的差别。
NSS指的是芯片硬件上的那个真实存在的片选管脚,而CS虽然也起到片选从机的作用 但是它主要是强调主从之间实际连接的那个片选线,用软件手动控制。

具体的通信过程

  1. 主机首先拉低对应从机的NSS信号线,表示与该设备进行通信。
  2. 然后主机发送SCLK时钟信号,通知从机读/写数据。(SCLK时钟信号可能是低电平有效,也可能是高电平有效,见【spi四种工作模式】)
  3. 主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
  4. 从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

Warning

SPI没有严格意义上的读写操作 只有发送和接收 而且无论是对主还是从设备 发送和接收都是一起进行的。
以主设备为例 主设备移位寄存器一位位把数据传到MOSI信号线上同时 MISO信号线上的数据也被一位位移进数据移位寄存器 然后再传给缓冲区这样
所以无论是主还是从设备 发送(接收)一个字节必须同时接收(发送)一个字节
如果是要主设备只输出 就得忽略掉从设备发送的字节。同理主设备只接收 从设备就得忽略掉主设备发送的字节

(不过这个知道就好 hal库函数已经配备好了 如果不是自己写软件SPI的话其实不用考虑)

四种工作模式

SPI的工作模式由CPOL(时钟极性)和CPHA(相位)控制。
CPOL=0:低电平空闲高电平读取 =1:高电平空闲
CPHA=0:第一个沿采样 =1:第二个沿采样

模式CPOLCPHA说明
000高电平的上升沿读取
101高电平的下降沿读取
210低电平的下降沿读取
311低电平的上升沿读取

这四种工作模式的选择不是自己喜欢哪个选哪个 而是要根据从设备的数据帧规格设定。

STM32 SPI硬件架构

几个相关的寄存器:

  • 控制寄存器:SPI_CR1 和SPI_CR2。控制整个SPI模块的工作状态
    • SPI_CR1:
      • CPHA:时钟相位,0:第一个边沿采样 1:第二个边沿
      • CPOL:时钟极性(0: 空闲时为低电平;1: 空闲时为高电平)
      • MSTR:主从选择(1:主机)
      • BR[2:0]:波特率设置,控制 SCK 的分频
      • SPE:使能SPI
      • SSM:软件NSS管理。SSM=1,软件NSS。此时是否选中从机由下面的SSI位决定^^
      • SSI:在SSM=1时有效。SSI=1,相当于软件拉高MSS,如果设置为0相当于拉低NSS(开始通信)
      • LSBFIRST:是否小端传输
      • SSI/SSM:软件控制 NSS(用于不连接外部 NSS)
      • RXONLY:接收模式(1 = 仅接收 也就是半双工,只有MISO能使用)(0:全双工
      • DFF:数据帧格式(0: 8bit,1: 16bit)
      • CRCEN:CRC 校验使能
      • BIDIMODE :=0:全双工;=1:单线模式,只能使用MOSI来进行双向传输
      • BIDIOE:仅在BIDIMODE=1时有效。=1:单线处于主机发送模式;=0:单线处于从机接收模式
    • SPI_CR2:
      • TXEIE :开启后当TXE=1(发送缓冲区为空)时触发中断 让cpu发数据
      • RXNEIE:开启后当RXNE=1(接收缓冲区费控)时触发中断 让cpu读数据
      • ERRIE: 错误中断使能
      • SSOE:硬件 NSS 输出使能(主机自动控制 NSS)
      • TXDMAEN / RXDMAEN:发送/接收 DMA 使能
  • 状态寄存器SPI_SR
    • RXNE:接收缓冲区非空(表示可以读取)(rx no empty)
    • TXE:发送缓冲区空(表示可以写入)
    • BSY:忙标志位(1 = 正在通信)
    • OVR:溢出错误(接收缓冲未读取就新数据来了
    • MODF: 模式错误(如主从冲突)
    • CRCERR:CRC错误
  • 数据移位寄存器/串并转换器shift register:把数据一位位的移入/移出 实现数据串行和并行之间的转换
  • tx buffer:发送缓冲区,由 CPU 或 DMA 写入数据。
  • rx buffer:接收缓冲区,接收到的数据存放在这里,等待 CPU 或 DMA 读取。
  • Baud Rate Generator(波特率发生器): 控制 SCK(串行时钟)的频率,由 CR1 寄存器中的 BR[2:0] 决定,通过分频选择 SPI 的时钟速度。
  • Master Control Logic(主控逻辑),由 CR1 中的 MSTR、SPE 控制。MSTR:选择主/从设备(1 = 主机,0 = 从机)。SPE:SPI 使能。

再解释一下软件NSS

硬件NSS下内部是直接根据NSS引脚上的电平来进行状态判断的。
软件NSS下因为不知道你选的是哪个GPIO口 所以不能直接去读对应引脚的电平了 内部就只能通过SPICR1寄存器里的ssi位来模拟NSS线上的电平变化。这部分是要你自己写的。

硬件SPI和软件模拟SPI

硬件

硬件spi就是打开cubemx上的spi配置,自带CRC校验(可选)和DMA(可选)。

  1. 先使能spi

模式这里选择的是全双工 右边自动亮起三个固定引脚对应SCK MISO MOSI,NSS默认不显示(即使用软件NSS)

2.


如果打开硬件NSS(可以选择NSS是输入还是输出 主设备的话就是NSS输出 从设备的话就是NSS输入,无论输出还是输入NSS都是用那一个引脚)。
如果坚持使用软件NSS,就在右边随便选一个引脚设置为GPIO_OUTPUT.

3.参数设置(参数设置我瞎选的 不用跟着我来 要跟着从机)

  • frame format帧格式。可以选择motoroia和TI两种。
    • 选TI会变成这样


      摩托罗拉比TI多一个时钟极性和相位的选择还有first bit。
      一般默认使用摩托罗拉。(TI模式蛮麻烦的我没仔细看 但是应用上其实会简单点 因为少了挺多配置)
  • data size:SPI 每次数据传输可以 8 位或 16 位为单位,每次传输多少个单位无限制。
  • first bit:选择字节序。MSB或者LSB都可以 跟着从设备选
    MSB和LSB
  • prescaler:通过配置它使波特率适配从机
  • baud rate :线上的波特率 是根据你的时钟配置 和 prescaler的选择 自动计算得到 跟着从机走
  • CPOL:时钟极性 设置0或1
  • CPHA:相位。
  • CRC calculation:crc校验是否开启
    - 开启它后会出现一个CRC Polynomial 默认即可
    CRC校验
  • nss signal typedef:自动跟着之前的配置

具体使用见:
硬件SPI的HAL库函数调用

软件模拟

就是自己在keil5里写代码 选4个引脚分别代表SCK MOSI MISO NSS,写对应的发送/接收/时钟拉高/拉低/数据读取等等操作。
软件比起硬件SPI大概只有一个自选引脚的优点 其他全是缺点(特别是时序上需要非常精确)so不建议用。
而且软件SPI没法用DMA,数据一多读起来很占用CPU。

SPI使用过程中的一些注意

  • 主从设备的MOSI和MOSI是对应相连 而不是交叉相连(be like MOSI——MISO)

  • 主机在SPI初始化后必须先拉低从机的NSS再发送(因为SPI一enable马上就会输出时钟脉冲……)否则很容易会丢数据,发送完成后需要等待BSY标志位为0才能把NSS拉高

  • 硬件NSS的话hal库函数里是能实现第二条的 但是没有BSY==0后再升高NSS的逻辑 so如果是一些时序严格的设备就不要用硬件NSS了……自己写吧

  • 软件NSS不仅自己拉高/拉低NSS要自己写 SPI_CR1寄存器中SSI位的1or0判断也要自己写

参考:
【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取】_stm32 hal qspi-CSDN博客
SPI中NSS/CS使用和SPI常见问题_spi cs-CSDN博客
【STM32】HAL库 STM32CubeMX教程十四---SPI-CSDN博客
STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs - Reference manual

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenResty技术深度解析:原理、应用与生态对比-优雅草卓伊凡

OpenResty技术深度解析:原理、应用与生态对比-优雅草卓伊凡 一、OpenResty技术概述 1.1 OpenResty是什么? OpenResty是一个基于Nginx的高性能Web平台,它将标准的Nginx核心与一系列强大的第三方模块(主要是LuaJIT)捆绑在一起,形成了一个全功能的Web应用服务器。不同于传…

二维码批量识别—混乱多张二维码识别-物品分拣—-未来之窗-仙盟创梦IDE

仙盟模型 用途 精准分拣:快速准确识别物品上复杂或多个二维码,依据码中信息(如目的地、品类等)实现物品自动化分拣,提高分拣效率与准确性。库存管理:识别入库、出库物品二维码,更新库存数据&am…

scikit-learn在监督学习算法的应用

shiyonguyu大家好,我是我不是小upper!最近行业大环境不是很好,有人苦恼别人都开始着手项目实战了,自己却还卡在 scikit-learn 的代码语法上,连简单的示例运行起来都磕磕绊绊。确实,对很多机器学习初学者来说…

dragonfly docker pull 报错 error parsing HTTP 404 response body

问题描述 在部署了 dragonfly 的机器上 docker pull 镜像发现如下报错 docker pull uhub.service.ucloud.cn/openbayes/test-job-sidecar:latest Error response from daemon: error parsing HTTP 404 response body: invalid character p after top-level value: "404 …

C++11新特性_标准库_正则表达式库

C11 引入了标准正则表达式库 <regex>&#xff0c;它提供了强大且灵活的文本匹配和替换功能。下面为你详细介绍该库的相关内容&#xff0c;包括主要组件、使用方法、示例代码等。 主要组件 std::regex&#xff1a;用于表示一个正则表达式对象&#xff0c;可通过构造函数…

【多线程】七、POSIX信号量 环形队列的生产者消费者模型

文章目录 Ⅰ. 信号量一、POSIX 信号量的概念二、POSIX 信号量的类型区别三、POSIX 信号量与 SystemV 信号量的区别Ⅱ. 线程信号量基本原理一、为什么要引入信号量❓二、PV 操作三、POSIX 信号量的实现原理四、CAS操作介绍Ⅲ. POSIX未命名信号量接口一、初始化无名信号量二、销毁…

ES基本使用方式

ES基本使用 文章目录 ES基本使用1.es的访问使用URL访问 2.mapping的理解Dynamic Mappingkeyword 与 text的区别‌基础定义与核心差异主字段&#xff0c;子字段 创建mapping 3.创建索引4.查看索引列表5.删除索引6.添加数据7.查询数据 重置es密码&#xff0c;初始用户elastic el…

玩转Docker | 使用Docker部署AI证件照工具

玩转Docker | 使用Docker部署AI证件照工具 前言一、HivisionIDPhotos介绍项目简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署HivisionIDPhotos服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问HivisionIDPhotos服务访…

【掌握 DDL】:SQL 中的数据库与表管理

掌握 DDL&#xff1a;SQL 中的数据库与表管理 掌握 DDL&#xff1a;SQL 中的数据库与表管理数据库 DDL创建数据库查看数据库查看所有数据库查看数据库创建语句 进入数据库删除数据库备份数据库备份恢复 查看数据库连接深入理解数据库创建与删除数据库字符集与校验规则 表 DLL创…

基于「骑手外卖系统」串联7大设计原则

你说得对&#xff01;这些设计原则听起来都很抽象、很“玄”&#xff0c;如果不是实际开发过系统&#xff0c;很难理解“到底为什么要这样设计”。 那我现在就用一个你能想象得很清楚的真实例子&#xff0c;帮你把这7个设计原则一一落地到具体情境里&#xff0c;你会一眼明白。…

基于轻量化YOLO的车载设备实时视频目标检测方案

一、背景与需求 在智能汽车后装市场,设备的视觉感知能力日益成为差异化竞争点。传统后装产品主要关注车辆诊断和位置跟踪,但在智能辅助驾驶(ADAS)与车联网(V2X)大潮下,如果能在已有硬件平台上新增“视频级行人、车辆、交通标志检测”功能,不仅可提升安全预警,也能为后…

HTTPS协议:更安全的HTTP

目录 1. 前言 2. HTTP 与 HTTPS&#xff1a;安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客&#xff1a;对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程&#xff1a;建立安全通道的关键步骤 3.3 数字证书&#xff…

使用 Go 和 Gorgonia 实现图像验证码识别系统

本文将介绍如何使用 Go 语言结合 Gorgonia 构建一个简单的图像验证码识别模型。Gorgonia 是一个专为机器学习打造的计算图库&#xff0c;在 Go 中支持自动微分与深度学习构建。 1. 项目依赖 首先安装 Go 语言环境和 Gorgonia&#xff1a; 登录后复制 go install gorgonia.org/g…

list的两种设计

1. 内存布局对比 (1) MSVC 的实现 cpp class _List_node {_List_node* _Next; // 指向下一个节点_List_node* _Prev; // 指向前一个节点_Value_type _Value; // 存储的数据 }; 特点&#xff1a; 每个节点包含两个指针和一个数据成员。 Debug 模式&#xff1a;可能添加迭代…

多多铃声 7.4| 拥有丰富的铃声曲库,满足不同用户的个性化需求,支持一键设置手机铃声

多多铃声是一款提供丰富铃声资源的应用程序&#xff0c;它拥有广泛的铃声曲库&#xff0c;涵盖各种风格和类型&#xff0c;能够满足不同用户的个性化需求。该应用程序支持分类浏览和热门榜单功能&#xff0c;让用户可以轻松找到当前最流行或自己感兴趣的铃声。此次分享的版本为…

Day04 新增套餐

###今天的任务主要是自主完成套餐管理的模块### 1.新增套餐 在前端页面接口中我们可以看到在新增套餐的时候需要选择添加到菜单中的菜品 因此我们需要设计一个接口可以通过根据分类id&#xff08;category_id&#xff09;来查询该分类下的菜品 1.1根据分类id查询分类下的菜…

数据赋能(208)——质量管理——及时性原则

概述 在数据处理、分析和应用过程中&#xff0c;数据及时性原则确保了数据在需要时能够迅速、准确地被获取、更新和传递&#xff0c;为决策和业务需求提供了时效性保障。能够反映当前的真实状况&#xff0c;为决策提供最新、最准确的信息支持。这种及时性不仅有助于企业快速响…

华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式&#xff1b; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析&#xff1b; 本文收录于专栏&#xff1a;《2025华为OD真题目录…

ASP.NET MVC​ 入门指南四

21. 高级路由配置 21.1 自定义路由约束 除了使用默认的路由约束&#xff0c;你还可以创建自定义路由约束。自定义路由约束允许你根据特定的业务逻辑来决定一个路由是否匹配。例如&#xff0c;创建一个只允许特定年份的路由约束&#xff1a; csharp public class YearRouteCo…

测试基础笔记第十八天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、web自动化1.xpath定位1.属性定位2.属性与逻辑结合3.属性和层级结合 2.常见元素定位方法&#xff08;面试题&#xff09;3.常见元素定位失败原因4.cookie1.验证码…