STM32 单片机开发 - SPI 总线

一、SPI 总线概念

SPI 总线        ---        Serial Peripheral Interface,即串行外设接口

  1. SPI 是摩托罗拉公司设计的一款 串行同步全双工总线
  2. SPI 总线是三线 / 四线制总线,分别是:SPI_SCK时钟线)、SPI_MOSI串行发送线)、SPI_MISO串行接收线)、SPI_NSS / CSS片选线 );
  3. SPI 总线通信速率一般 达到 Mbps
  4. SPI 总线应用场景:数码管(中控屏)、LCD 屏……
  5. SPI 总线支持主从机模式支持多主机多从机一般使用单主机多从机

二、SPI 总线硬件连接

图 1 SPI 总线硬件连接

SPI 总线为三线制 / 四线制

  • SPI_SCK:时钟线 - 对使用 SPI 总线通信的两个设备进行时钟同步;
  • SPI_MOSI:串行发送线 - 主机输出,从机输入;
  • SPI_MISO:串行接收线 - 主机输入,从机输出
  • SPI_NSS / NCS:片选线 - CS:Chip Select(芯片选择),N(多根、多个)。

SPI 总线支持主从机模式Master / Slaver

M:Master        O:Output        S:Slaver        I:Input

当使用 SPI 总线通信时,存在多个从机设备,主机如何找到要通信的从机?

        SPI 总线通过 SPI_NSS/NCS 片选线进行从机选择;

        每一个挂载在 SPI 总线的从机设备,都有一根自己私有的 NSS/NCS 片选线和主机相连

        SPI 总线上的主机将需要通信的从机的 NSS/NCS 片选线电平信号拉低,就代表要和对应的主机进行通信。

2.1 四线制连接方式 - 多从机

图 2 四线制 SPI 总线硬件连接图

        四线制时,每个从机的 SPI_NSS/NCS 片选线都和主机单独相连。

2.2 三线制连接方式 - 单从机

图 3 三线制 SPI 总线硬件连接图

        单从机时,主机和从机的 SPI_NSS/NCS 片选线可以直接接 GND,这样片选线上的电平一直为低电平,这样主机和从机都知道对方可以通信,直接进行数据收发。


三、SPI 总线时序图

图 4 SPI 总线时序图

起时信号:NSS / NCS 片选线上的电平信号从 高电平 -> 低电平 信号,产生一个下降沿信号时,代表主机要和对应从机通信,也代表一次 SPI 总线通信的开始

终止信号:NSS / NCS 片选线上的电平信号从 低电平 -> 高电平 信号,产生一个上升沿信号时,代表主机要和对应从机断开连接,也代表一次 SPI 总线通信的结束


数据发送信号(触发信号):SCK 时钟线处于上升沿变化期间,MOSI 数据线上主机可以发送数据MISO 数据线上从机也可以发送数据
数据读取信号(采样信号):SCK 时钟线处于
下降沿变化期间,MOSI 数据线上主机可以接收数据MISO 数据线上从机也可以接收数据


SPI 总线通信的最小数据单位是字节,一般为 8 位(1 字节)或者 16 位(2 字节)。


NSS / NCS 片选线为低电平状态时,SPI 总线处于占用状态,数据线上有实际数据传输;

NSS / NCS 片选线为高电平状态时,SPI 总线处于空闲状态,数据线上无实际数据传输。

3.1 SPI 总线的全双工通信

  • 场景:主机发送 0xFF,从机发送 0x00
  • 时钟周期操作
    • 上升沿期间:主机通过 MOSI 数据线发送 0xFF 中的 1 位数据,同时从机通过 MISO 数据线发送 0x00 中的 1 位数据。
    • 下降沿期间:从机通过 MOSI 数据线接收 0xFF 中的 1 位数据,同时主机通过 MISO 数据线接收 0x00 中的 1 位数据。
  • 8 个时钟周期后
    • 主机:通过 MOSI 发送完毕 0xFF,同时通过 MISO 接收完毕 0x00。
    • 从机:通过 MISO 发送完毕 0x00,同时通过 MOSI 接收完毕 0xFF。

与 IIC 总线的对比(8 个时钟周期)

  • IIC 总线:主机可发送完毕 0xFF 数据,从机可接收完毕 0xFF 数据。
  • SPI 总线:主机可发送完毕 0xFF 且接收完毕 0x00;从机可发送完毕 0x00 且接收完毕 0xFF。

三、SPI 总线的工作模式 - 协议格式

SPI 总线的工作模式(协议格式)和 SPI 总线的 时钟极性 CPOL 时钟相位 CPHA 相关。


时钟极性(CPOL):时钟线初始状态的电平信号

        CPOL = 0:SCK 时钟线初始电平信号时低电平信号;

        CPOL = 1:SCK 时钟线初始电平信号时高电平信号。

时钟相位(CPHA):SPI 总线进行数据采样数据读取)是处于奇数沿还是偶数沿

        CPHA = 0:SPI 总线在 SCK 时钟线的奇数沿进行数据采样;

        CPHA = 1:SPI 总线在 SCK 时钟线的偶数沿进行数据采样。

图 5 SPI 总线工作模式

3.1 CPOL = 0,CPHA = 0 - 工作模式

图 6 CPOL = 0,CPHA = 0

CPOL = 0,CPHA = 0 时

        SCK 时钟线初始状态电平为 低电平 信号,SCK 时钟线处于 奇数沿 时,进行 数据采样

        SCK 上升沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 读取数据

        SCK 下降沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 写入数据


3.2 CPOL = 0,CPHA = 1 - 工作模式

图 7 CPOL = 0,CPHA = 1

CPOL = 0,CPHA = 1 时

        SCK 时钟线初始状态电平为 低电平 信号,SCK 时钟线处于 偶数沿 时,进行 数据采样

        SCK 上升沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 写入数据

        SCK 下降沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 读取数据


3.3 CPOL = 1,CPHA = 0 - 工作模式

图 8 CPOL = 1,CPHA = 0

CPOL = 1,CPHA = 0 时

        SCK 时钟线初始状态电平为 高电平 信号,SCK 时钟线处于 奇数沿 时,进行 数据采样

        SCK 上升沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 写入数据

        SCK 下降沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 读取数据


3.4 CPOL = 1,CPHA = 1 - 工作模式

图 9 CPOL = 1,CPHA = 1

CPOL = 1,CPHA = 1 时

        SCK 时钟线初始状态电平为 高电平 信号,SCK 时钟线处于 偶数沿 时,进行 数据采样

        SCK 上升沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 读取数据

        SCK 下降沿期间:主机 / 从机可以从 MOSI / MISO 数据线上 写入数据

3.5 SPI 总线通信要求

两个设备要使用 SPI 总线通信,必须

  1. 两个设备的 SPI 总线的工作模式协议格式要相同
  2. 工作模式相同就是:两个设备的时钟极性CPOL)和时钟相位CPHA相同
图 10 M74HC595 芯片的时钟极性和时钟相位

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

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

相关文章

区域医院云HIS系统源码,云医院管理系统源码,云诊所源码

云HIS源码,云医院管理系统源码,云诊所源码,二级专科医院云HIS系统源代码,有演示云HIS,即云医院管理系统,是一种运用云计算、大数据、物联网等新兴信息技术的医疗信息化解决方案。它重新定义了传统的医院信息…

Java基础 9.11

1.第三代日期类前面两代日期类的不足分析JDK 1.0中包含了一个java.uti.Date类,但是它的大多数方法已经在JDK1.1引Calendar类之后被弃用了。而Calendar也存在问题是:可变性:像日期和时间这样的类应该是不可变的偏移性:Date中的年份…

JavaScript 数组过滤方法

在 JavaScript 编程中,数组是最常用的数据结构之一,而数组过滤则是处理数据集合的关键操作。filter() 方法提供了一种高效的方式来从数组中筛选出符合特定条件的元素,返回一个新的数组,而不改变原始数组。这种方法在处理对象数组时…

《sklearn机器学习——数据预处理》离散化

sklearn 数据预处理中的离散化(Discretization) 离散化是将连续型数值特征转换为离散区间(分箱/bins)的过程,常用于简化模型、增强鲁棒性、处理非线性关系或满足某些算法对离散输入的要求(如朴素贝叶斯、决…

PTA算法简析

ArkAnalyzer源码初步分析I:https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先,我们必须明确 PTA 的核心工作:它不再关心变量的“声明类型”,而是为程序中的每一个变量和每一个对象字段…

Vue 3 中监听多个数据变化的几种方法

1. 使用 watch监听多个 ref/reactive 数据import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 监听多个数据源watch([count, name, () > user.age], // 数组形式传入多个数据源([newCount, …

第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑

用 IntelliJ IDEA 写第一个 Java 8 程序:Hello World 实操指南 作为 Java 初学者,“Hello World” 是你接触这门语言的第一个里程碑。本文会聚焦 Java 8(经典 LTS 版本,企业级开发常用) 和 IntelliJ IDEA(当…

【GPT入门】第67课 多模态模型实践: 本地部署文生视频模型和图片推理模型

【GPT入门】第67课 多模态模型实践: 本地部署文生视频模型和图片推理模型1. 文生视频模型CogVideoX-5b 本地部署1.1 模型介绍1.2 环境安装1.3 模型下载1.4 测试2.ollama部署图片推理模型 llama3.2-vision2.1 模型介绍2.2 安装ollama2.3 下载模型2.4 测试模型2.5 测试…

C++初阶(6)类和对象(下)

1. 再谈构造函数(构造函数的2个深入使用技巧) 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后,对象中已经有了一个初始值,…

容器文件描述符热迁移在云服务器高可用架构的实施标准

在云计算环境中,容器文件描述符热迁移技术正成为保障业务连续性的关键解决方案。本文将深入解析该技术在云服务器高可用架构中的实施标准,涵盖技术原理、实现路径、性能优化等核心维度,为构建稳定可靠的容器化基础设施提供系统化指导。 容器文…

毫米波雷达液位计如何远程监控水位?

引言毫米波雷达液位计作为一种高精度、非接触式的水位监测设备,正逐渐成为智慧水务、环境监测等领域的关键工具。其通过先进的调频连续波(FMCW)技术,实现5mm的测量精度,并支持多种远程通信方式,使用户能够实…

关于 C++ 编程语言常见问题及技术要点的说明

关于 C 编程语言常见问题及技术要点的说明C 作为一门兼具高效性与灵活性的静态编译型编程语言,自 1985 年正式发布以来,始终在系统开发、游戏引擎、嵌入式设备、高性能计算等领域占据核心地位。随着 C 标准(如 C11、C17、C20)的持…

【Qt QSS样式设置】

Qt中的QSS样式设置流程 Qt Style Sheets (QSS) 是Qt框架中用于自定义控件外观的样式表语言,其语法类似于CSS。以下是QSS的设置流程和示例。 QSS设置流程 1. 创建QSS样式表文件或字符串 首先,需要创建QSS样式表,可以是一个单独的.qss文件&…

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵一、背景二、原理1、什么是变换矩阵?2、为什么需要变换矩阵?3、Apollo 中的坐标系4、Apollo TransformWrapper三、操作步骤1. 设置车辆参数2. 启动静态变换发布3. 查看变换信息4. 播放记录数据…

硬件(十)IMX6ULL 中断与时钟配置

一、OCP 原则(开闭原则)对代码扩展是开放的,允许通过新增代码来扩展功能;对代码的修改是关闭的,尽量避免直接修改已有稳定运行的代码,以此保障代码的稳定性与可维护性。二、中断处理(一&#xf…

打工人日报#20250913

打工人日报#20250913 周六,回杭州了,这边居然下雨。 阅读 《小米创业思考》 第七章 技术为本 其中的技术介绍算是比较详细的,架构也很清晰,有一种对自己家产品如数家珍的感觉,对于架构也是经常思考的感觉感恩 和namwei…

【面试题】RAG核心痛点

1. 文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失 这是一个经典难题。切分粒度过大,单个chunk包含过多无关信息(噪声),会干扰LLM理解核心内容;切分过小,则可能割裂句子或段落的完整语…

网络安全与iptables防火墙配置

iptables基本概念iptables是Linux系统中强大的防火墙工具,它工作在用户空间,通过命令行界面与内核空间的netfilter框架交互,实现数据包过滤、网络地址转换(NAT)等功能。Web服务器防火墙配置实例以下是针对Web服务器的iptables配置步骤&#x…

qt中给QListWidget添加上下文菜单(快捷菜单)

步骤 添加customContextMenuRequested信号的槽函数,添加后,在QListWidget上单击右键,无法响应,还必须执行下面操作;设置QListWidget上下文菜单策略为Qt::CustomContextMenu 如下:

一款好看的jQuery前端框架-HisUI

HisUI:一款基于EasyUI的前端组件类库,让web开发更迅速、简单。 HisUI官网文档