【史上最全面arduino esp32教程】SPI层次结构SPI协议与SPI控制器结构

文章目录

  • 前言
  • 一、SPI 程序层次
    • 1.1 硬件原理图
    • 1.2 硬件框图
    • 1.3 软件层次
  • 二、SPI协议
    • 2.1 硬件连线
    • 2.2 如何访问SPI设备
    • 2.3 SPI 框图
  • 总结


前言

欢迎阅读本篇文章,将为您介绍Arduino ESP32上的SPI通信协议。SPI(Serial Peripheral Interface)是一种常见的串行通信协议,广泛用于与外部设备进行数据交换。本教程将重点介绍SPI的层次结构和基本原理,以及ESP32上的SPI协议和SPI控制器结构。希望通过本教程,您能充分理解SPI通信,并能够在Arduino ESP32上灵活应用SPI协议。


一、SPI 程序层次

1.1 硬件原理图

以 SPI 接口的 Flash 为例,它跟主控的连接图如下:
在这里插入图片描述
其中DI为SPI设备发给主控的。SCK为时钟(所以SPI协议是一种同步协议)
主控发出。DO为主控发送给SPI设备的,CS为片选引脚,我们可以通过CS片选引脚来选中不同的SPI设备,可以实现一主多从。

1.2 硬件框图

我们会编写程序通过SPI控制器来操作Flash,SPI来帮我们传递数据。
在这里插入图片描述

1.3 软件层次

要操作 Flash,涉及这几个层次的程序:
① 应用程序:我来决定“在哪个位置、读写什么数据”
② Flash 驱动:我知道发送什么格式的 SPI 数据才能读、写、擦除 Flash
③ SPI 控制器驱动(HAL):我可以发送 SPI 数据

在这里插入图片描述

二、SPI协议

2.1 硬件连线

SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在
1980 前后提出的一种全双工同步串行通信接口,它用于 MCU 与各种外围设备以串行方式进
行通信以交换信息,通信速度最高可达 25MHz 以上。

SPI 接口主要应用在 EEPROM、FLASH、实时时钟、网络控制器、OLED 显示驱动器、AD
转换器,数字信号处理器、数字信号解码器等设备之间。

SPI 通常由四条线组成,一条主设备输出与从设备输入(Master Output Slave Input,
MOSI),一条主设备输入与从设备输出(Master Input Slave Output,MISO),一条时钟信
号(Serial Clock,SCLK),一条从设备使能选择(Chip Select,CS)。
SPI 可以一个主机连接单个或多个从机,每个从机都使用一个引脚进行片选,物理连
接示意图如图所示:
在这里插入图片描述
我们可以通过把SCLK时钟,输入和输出所有从机共用一根线,通过CS引脚(片选引脚)来区分发送和接收哪个设备。
这样就可以使用I2C的一主多从

2.2 如何访问SPI设备

首先,使能片选引脚,在片选引脚有用的期间再去访问
那怎么发数据和读数据呢?
假设主控要发送0x56(二进制:0101 0110)给Flash,时序如下:
在这里插入图片描述
首先发送CS片选信号,选中他,在每个时钟周期传输一位。第一个时钟周期传递最高位。然后其他的位就接着传输。

在一开始的时候,这个SCK是高电平还是低电平?
这是可以设置的。(CPOL)

传输数据时,是在第一个跳边缘("跳边缘"通常指的是在数字信号中的变化,特别是从低电平到高电平或从高电平到低电平的变化。)传输数据还是在第二个跳边缘传输数据?
这也是可以设置的(CPHA)

通过上面的CPOL和CPHA的组合,可以组合成4个SPI不同的模式
在这里插入图片描述
比如说我们可以组合成下面这个时钟时序图:
在这里插入图片描述
当CPHA为1时在第二个跳边缘传输数据
在这里插入图片描述
当CPHA为1,CPOL不同时,可以观察到,他们的初始电平分别为高电平和低电平

无论哪种模式,我们都可以同时发送和同时接收8位数据

2.3 SPI 框图

在我们实际编程中我们是不需要这样去控制引脚的
我们编写的程序将会通过内部的SPI控制器去访问外部的SPI设备,这个SPI控制器帮我们实现时序,进行读写。

SPI控制器框图:
在这里插入图片描述

  1. 当我们要操作SPI的时候,我们要去设置他的模式:时钟平时是什么电平,在第几个跳边缘传输数据
  2. 我们需要设置时钟的频率
  3. 我们可以去写数据了
    比如上面的框图,他有SPI控制寄存器2,控制寄存器1,我们可以设置控制寄存器1的时钟平时是什么电平,在第几个跳边缘传输数据:
    在这里插入图片描述

然后我们就可以通过写/读缓冲区来得到数据了
在这里插入图片描述


总结

本教程详细介绍了Arduino ESP32上的SPI通信协议。我们探讨了SPI的层次结构,了解了主设备和从设备之间的通信过程。我们还学习了ESP32上的SPI协议和SPI控制器结构,了解了数据传输的时序和通信方式。通过使用SPI库函数,我们可以在ESP32上轻松地进行SPI通信,并与各种外部设备进行数据交换。

在掌握了Arduino ESP32上的SPI通信技能后,您可以与各种SPI设备进行交互,如显示屏、存储器和传感器等。SPI通信提供了更高的数据传输速度和更灵活的连接方式,为您的项目提供了更多的选择。祝贺您成功完成了本教程!现在,您可以开始实践应用SPI通信,开发出自己的创意项目了。祝您好运!

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

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

相关文章

鸿蒙开发案例:【图像加载缓存库ImageKnife】

专门为OpenHarmony打造的一款图像加载缓存库,致力于更高效、更轻便、更简单。 简介 OpenHarmony的自研版本: 支持内存缓存,使用LRUCache算法,对图片数据进行内存缓存。支持磁盘缓存,对于下载图片会保存一份至磁盘当…

新材料正在加速金属3D打印的应用步伐

在金属3D打印领域,材料性能是影响工件综合表现的关键因素,如强度、硬度、耐腐蚀性、抛光性能以及导热性能等,都与材料息息相关,好的材料是推动金属3D打印向更多领域应用的基础。 在这一背景下,上海毅速新材料推出的多款…

递增四元组

解法: 首先都可以想到dp[i]:第i个元素结尾的递增四元组有dp[i]个 然后发现有一组数据:2,3,6,1,5,8。会出现6结尾和5结尾的递增三元组,也就是未来的决策受过去影响,专业的说就是有后效性。需要强化约束条件&#xff0…

vue3+threejs新手从零开发卡牌游戏(三):尝试在场景中绘制一张卡牌

首先我们思考下,一张最简单的卡牌有哪些东西构成:卡牌样式和卡牌数据。一张卡牌有正面和背面,有名称、属性、种族、攻击力等数据,我们先不考虑数据,先尝试在场景中绘制一张卡牌出来。 一、寻找卡牌素材 为了简单我直…

变老特效怎么弄?分享3个软件体验!

变老特效怎么弄?分享3个软件体验! 当我们想要预览自己老去的模样,或者给照片增添一丝岁月的韵味时,变老特效成为了一个热门选择。那么,这种神奇的效果是如何实现的呢?又有哪些软件可以让我们轻松体验呢&am…

就业班 第二阶段 2401--3.18 day1 初识mysql

初识: 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库,创建用户,创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

忘记密码找回流程请求拦截器-前端

目录 设置找回密码请求拦截器 1.相关参数 2.约定 代码实现 1. 实现思路 2. 实现代码 校园统一身份认证系统: 基于网络安全,找回密码、重新设置密码的流程和正常登录流程中密钥等请求头不一致。 设置找回密码请求拦截器 1.相关参数 clientId 应…

多线程实现

1.多线程:并发实现 主线程和子线程并行实现。 一个进程中有多个线程,可以同时进行多个任务。进程是系统分配的,线程的执行是由调度器决定的。 注意:线程开启不一定执行,由Cpu调度执行。 线程创建的三种方式&#xff…

HarmonyOS系统开发ArkTS常用组件文本输入及参数

TextInput文本输入组件,用于接收用户输入的文本内容。 1、TextInput组件的参数 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource}) placeholder属性用于设置无输入时的提示文本text用于设置输入框当前的文本内容 Entry Component st…

20240316-2-协同过滤(collaborative filtering)

协同过滤(collaborative filtering) 直观解释 协同过滤是推荐算法中最常用的算法之一,它根据user与item的交互,发现item之间的相关性,或者发现user之间的相关性,进行推荐。比如你有位朋友看电影的爱好跟你类似,然后最…

【Review+预测】测试架构演进的曲折之路

文章目录 前言 一、“原始”阶段 二、“小打小闹”阶段 三、“小米加步枪”阶段 四、“摩托化部队”阶段 五、“骑兵连”阶段 六、“海军陆战队”阶段 七、“社区型组织”阶段 前言 近期公司的测试团队需要重新组织安排,本着谦虚谨慎的态度,我从…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义:任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序: 求高度用后序,求深度用前序。(取决于需不需要从下往上返回结果) 先判断它是不是平衡二叉树 如果是就返回 如…

【CVTE 一面凉经Ⅰ】循环依赖如何解决

目录 一.🦁 开始前的废话二. 🦁 什么是循环依赖?三. 🦁Spring 容器解决循环依赖的原理是什么?五. 🦁 三级缓存解决循环依赖的原理六. 🦁 由有参构造方法注入属性的循环依赖如何解决?七.&#x…

vue3通过el-cascader实现动态菜单切换页面

如果只有一级菜单只会显示一个按钮 <div style"width: 100%; margin-top: 10px; display: flex; align-items: center; border-bottom: 1px solid #ccc;"><template v-for"(menu, index) in cascaderData" :key"index"><el-casc…

整数和浮点数在内存中存储

整数在内存中的存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。 对于整形来说&#xff0c;数据存放内存中的其实是补码。 在计算机系统中&#xff0c;数值一律用补码来表示和存储。原因是&#xff0c;使用补码&#xff0c;可以使符号位和数值域统一处理&am…

DUSt3R:简化三维重建

3D 重建是从二维 (2D) 图像创建对象或场景的 3D 虚拟表示的任务&#xff0c;可用于模拟、可视化或本地化等多种目的。 它广泛应用于计算机视觉、机器人和虚拟现实&#xff08;VR&#xff09;等多个领域。 在基本设置中&#xff0c;3D 重建方法输入一对图像 I1 和 I2&#xff0c…

关于Java对接网络验证+实践小例子,简单易懂

一个简单的网络验证小例子&#xff0c;各位大佬勿喷 突发奇想&#xff0c;如果一位A友找你拿一份 Working Fruits&#xff0c;但是你不想这位A友把你辛苦劳作、熬夜加点写出的代码分享他或她的另外一位朋友B友&#xff0c;也许并不是很有价值的一个小作业而已&#xff0c;但是就…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的…

模拟B\S服务器(扩展知识点)

3.2 模拟B\S服务器(扩展知识点) 模拟网站服务器&#xff0c;使用浏览器访问自己编写的服务端程序&#xff0c;查看网页效果。 案例分析 准备页面数据&#xff0c;web文件夹。 复制到我们Module中&#xff0c;比如复制到day08中 我们模拟服务器端&#xff0c;ServerSocket类…

SpringCloud Alibaba实战和源码(8)OpenFeign使用

1、 使用Feign实现远程HTTP调用 1.1、常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 J…