【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构

2024-03-06 20:12

本文主要是介绍【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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


前言

SPI(Serial Peripheral Interface)是一种常见的串行通信协议,用于在微控制器和外部设备之间进行快速、全双工的通信。在 ESP32 IDF(Espressif IoT Development Framework)中,SPI 接口被广泛应用于连接各种外设,如传感器、存储器和显示屏等,为开发者提供了一种可靠而高效的数据传输方式。

本文将探讨 ESP32 IDF 中 SPI 的层次结构、SPI 协议以及 SPI 控制器的结构,以帮助开发者更好地理解和利用 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的时钟平时是什么电平,在第几个跳边缘传输数据:
    在这里插入图片描述

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


总结

在 ESP32 IDF 中,SPI 提供了一种强大而灵活的接口,使开发者能够轻松地与外部设备进行高速、全双工的通信。通过了解 SPI 的层次结构、协议和控制器结构,开发者可以更好地利用 ESP32 的硬件特性,实现与外部设备的可靠连接,并构建各种复杂的嵌入式系统。熟悉 ESP32 IDF 提供的 SPI 接口,将有助于开发者更快速、更有效地完成各种项目,从而推动物联网和嵌入式系统的发展。

这篇关于【ESP32 IDF】SPI层次结构SPI协议与SPI控制器结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781194

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注