STM32--SPI通信协议(1)SPI基础知识总结

前言

I2C (Inter-Integrated Circuit)和SPI (Serial Peripheral Interface)是两种常见的串行通信协议,用于连接集成电路芯片之间的通信,选择I2C或SPI取决于具体的应用需求。如果需要较高的传输速度和简单的接口,可以选择SPI。如果需要连接多个设备或硬件复杂性较低的解决方案,可以选择I2C。

一、SPI介绍

SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在微控制器和外围设备之间传输数据。SPI使用四根线进行通信,即主设备和从设备之间的主时钟线(SCLK)、数据输出线(MOSI)、数据输入线(MISO)和片选线(SS)。

SPI协议可以实现高速数据传输和多设备通信,并且具有简单的硬件实现和低功耗特点,常用于与外围设备(如传感器、存储器、显示屏等)的通信。

二、硬件电路

MOSI:主机输出从机输入,主机接入这根线,就是MO,从机接入这根线就是SI;

MISO:主机输入从机输出,主机接入这根线,就是MI,从机接入这根线就是SO;

SS:片选,用来指定和哪个从机通信,主机想指定与谁通信,就把对应的SS输出线置低电平,但同一时间只能指定一个从设备,否则会导致数据冲突

三、SPI基本原理--移位示意图

假设上升沿开始移位

时钟的上升沿:

时钟的下降沿:

由主机提供的时钟控制着主机的移位寄存器,一般SPI都是高位先行:每来一个时钟,主机的移位寄存器就会向左进行移位,同时这个时钟也通过SCK引脚进行输出,控制从机的移位寄存器进行左移。然后主机移位寄存器左边移除的数据通过MOSI引脚输入到从机移位寄存器的右边,从机移位寄存器左边移除的数据通过MISO引脚输入到主机移位寄存器的右边

四、SPI时序基本单元

1、起始与终止

2、交换一个字节

SPI可以通过配置两个位来选择什么时候开始移位,上升沿移位或下降沿移位;

CPOL(Clock Polarity)时钟极性;CPHA(Clock Phase)时钟相位;每一位都可以选择0或1,共4种模式。

模式1:

因为可能有多个从机设备,在MISO线如果多个从机设备始终是推挽输出,会导致冲突,所以在从机的SS为高电平时,MISO引脚必须切换为高阻态(就是相当于引脚断开,不输出任何电平)。

模式0:

与模式1的区别就是相位提前,在SS下降沿就要移除数据。

模式0与模式2,模式1与模式3的区别都只是SCK的极性取反。

五、SPI通信流程

SPI协议的通信方式是通过主设备向从设备发送时钟信号,并在时钟信号的上升沿或下降沿传输数据。主设备控制片选线,选择要与之通信的从设备。

一般来说,SPI协议的通信流程如下:

  1. 主设备将片选线拉低,选中一个从设备。
  2. 主设备将数据发送到从设备的数据输出线。
  3. 主设备发送时钟信号,从设备根据时钟信号接收数据。
  4. 从设备将数据发送到主设备的数据输入线。
  5. 主设备继续发送时钟信号,从设备继续传输数据。
  6. 主设备将片选线拉高,结束通信。

SPI协议的数据传输一般是:指令码加读写数据

从设备一般都会有一个指令集来规定该指令的功能。

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

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

相关文章

驾照考试-科目三

有车阻挡 先踩刹车或者自然降速,估计要停了就踩离合换1档,然后踩刹车,再半制动起步,起步后再踩油门换2挡,然后维持速度。如果估计不会停,就等距离合适后再踩油门启动。(一般是停好些) 准备 上车,系安全带,调座位和镜子,检测灯光,手刹,挡位,远近交替灯闪两下,…

css1字体属性

一.font-family(字体系列) 不同字体系统用,隔开; 多个字母的字体系统用“”; 二.font-size(字体大小)(有单位px)(默认字体16px) 三.font-weight&#xff08…

Leetcode—535. TinyURL 的加密与解密【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—535. TinyURL 的加密与解密 实现代码 class Solution { public:// Encodes a URL to a shortened URL.string encode(string longUrl) {while(!urlToCode.count(longUrl)) {string code;for(int i 0; i < 6; i) {code…

如何快速上手VUE框架并写出VUE简单的增删改查的的开发代码

要快速上手Vue框架并编写简单的增删改查&#xff08;CRUD&#xff09;开发代码&#xff0c;可以遵循以下步骤&#xff1a; 步骤1&#xff1a;了解Vue基本概念和原理 在开始编写代码之前&#xff0c;需要了解Vue的基本概念和原理&#xff0c;包括组件、数据双向绑定、指令、生命…

Blender使用Rigify和Game Rig Tool基础

做动画需要的几个简要步骤&#xff1a; 1.建模 2.绑定骨骼 3.绘制权重 4.动画 1.Rigify是干嘛用的&#xff1f; 》 绑定骨骼 2.Game Rig Tool干嘛用的&#xff1f; 》 修复Rigify绑定骨骼做的动画导入游戏引擎的问题&#xff0c;如果Rigify自身修复了就不需要这个插件了&#…

Python算法100例-1.2 兔子产子

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1&#xff0e;问题描述 有一对兔子&#xff0c;从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子&#xff0c;假设所有的兔子都不死&#xff0c;问30个月内每个月的兔子总对数为…

docker镜像变量传递

docker镜像变量传递问题 直接使用变量似乎读取不到 [rootvm t]# cat Dockerfile FROM centos:7.9.2009 ENV JAVA_OPTS " -Xloggc:/opt/${HOSTNAME}.log" CMD ["/usr/sbin/sshd", "-D"] docker build -t centos:env-tag . docker run -itd --na…

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…

PCA等、Compression is Intelligence.

ChatGPT是如何产生心智的&#xff1f;|神经元|神经网络_网易订阅 (163.com) Compression For AGI&#xff1a;压缩即智慧&#xff0c;LLM是最好的无损压缩器 - 知乎 (zhihu.com) 压缩即智慧 - 知乎 (zhihu.com)

Vue 图片加载失败处理

Vue 图片加载失败处理 很多人会使用 error 方法在图片加载 失败时替换img.src 的方式 但是这种方式在默认图片加载失败时&#xff0c;error会出现死循环&#xff0c;所以我使用了error v-if的方式。 <template><div><!-- 正常时显示 --><img v-if&quo…

Android消息通知Notification

Notification 发送消息接收消息 #前言 最近在做消息通知类Notification的相关业务&#xff0c;利用闲暇时间总结一下。主要分为两部分来记录&#xff1a;发送消息和接收消息。 发送消息 发送消息利用NotificationManager类的notify方法来实现&#xff0c;现用最普通的方式发…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本&#xff0c;jdk8和jdk17 自从升级IDEA版本到2023以后&#xff0c;每次打开新项目&#xff0c;sdk都被默认选择成了jdk17, 每次都得手动修改 &#xff08;File--Project Structure&#xff09;&#xff0c;超级麻烦。 没有用的解决方法 以下这…

C++模板:函数模板

基本语法&#xff1a; template <typename T> void mySwap(T& a, T& b) {//类型参数化T temp a;a b;b temp; } void test01() {int a 10, b 20;//自动类型推导mySwap(a,b);//显示指定类型mySwap<int>(a, b); } 实例&#xff1a;数组排序 template&…

2. 路由 Vue-Router

目录 2.1 Vue-Router 介绍 2.2 路由配置 2.3 嵌套路由 Vue1&#xff1a;基础跟使用方式 2.1 Vue-Router 介绍 vue 属于单页面应用&#xff0c;所谓路由&#xff0c;就是根据浏览器路径不同&#xff0c;用不同的视图组件替换这个页面内容。 在vue应用中使用路由功能&#x…

Unity 渲染管线自动转换的实现 支持HDRP转URP,URP转HDRP

HDRP和URP无法平滑切换&#xff0c;因为属性、功能差异巨大。 本脚本仅对可对应的默认脚本和属性做了转换处理。细节调整还需自己搞。 自动转换可以节省手动更换shader、texture、通用属性的劳动成本。 操作步骤 使用前确保当前项目中存在HDRP和URP的包&#xff0c;没有请到p…

【GPU驱动开发】- GPU架构流程

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; 一、总述 GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 总体流…

UE4 C++ 枚举类型

先在UCLASS()前写入&#xff1a; //定义枚举变量&#xff1a;方法一 UENUM(BlueprintType) //BlueprintType&#xff1a;在蓝图中可显示、创建该枚举变量 namespace MyEnumType //namespace&#xff1a;命名空间&#xff0c;支持同样的变量命令、便于访问//MyEnumType&#xf…

仪器接口设计

不是所有设备都是TCP连接模式&#xff0c;有读文件的、读数据库的设备&#xff0c;为此还需要一个客户端仪器接口程序&#xff0c;面向接口编程是一个良好的思想&#xff0c;他使得调用者和接口实现者不用绑定太死&#xff0c;只要双方按约定实现即可。 仪器有读文件的、写文件…

Maven配置笔记

1、下载Maven 在Maven的官网即可下载&#xff0c;点击访问Apache Maven。 2、配置环境变量 chcp 65001 echo off set mvnhomeE:\apache-maven-3.8.4 rem LPY echo. echo ************************************************************ echo * …

线程池,定时器以及阻塞队列(生产者/消费者模型)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;线程池,定时器以及阻塞队列(生产者/消费者模型) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 实现线程池,定时器以及阻塞队列,生产者/消费者模型 线程池线程池…