【快速上手ESP32(基于ESP-IDFVSCode)】08-SPI

news2024/12/23 14:56:34

SPI

SPI,全称Serial Peripheral Interface,即串行外设接口,是一种同步串行接口技术。它最初由Motorola公司推出,并在其MC68HCXX系列处理器上首次定义。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,以及数字信号处理器和数字信号解码器之间。这种接口的主要特点如下:

  1. 通信方式:SPI是一种高速的、全双工、同步的通信总线。它采用主从模式进行通信,通常有一个主设备和一个或多个从设备。主设备启动一个数据交换,从设备则在被选择时响应。这种通信方式使得SPI能够在同一时刻进行数据的发送和接收,提高了数据传输的效率。
  2. 优点:SPI接口的主要优点包括支持全双工通信,使得数据传输速度更快;协议简单,使得硬件和软件实现都相对容易;并且由于SPI在芯片的管脚上只占用四根线,因此能节约芯片的管脚,同时为PCB的布局节省空间。
  3. 缺点:尽管SPI有许多优点,但也存在一些缺点。例如,SPI没有指定的流控制,也没有应答机制来确认是否接收到数据,因此在数据传输的可靠性方面存在一定的缺陷。此外,SPI还需要占用主机较多的口线,每个从机都需要一根片选线,这在一定程度上限制了其应用范围。

在应用场景方面,SPI协议被广泛应用于工业自动化、通信、航空航天等领域。在嵌入式系统中,SPI主要用于连接各种外设,如存储器、传感器、显示器等。例如,SD卡、TFT液晶屏、NFC模块、加速度计等常见的外设都可以通过SPI接口来实现数据通信。SPI协议还常常被用于多机通信,例如在车载系统中,多个设备可以通过SPI接口进行数据传输,从而实现各个设备之间的协同工作。

以上是来自文心一言的介绍。

ESP32中的SPI

ESP32中一共是有四个SPI。

四个SPI的不同点在下面。

除了上面一大堆不同点外,最显著的,对我们感知起来比较明显的点就是前两个SPI的引脚是固定的,而后两个的引脚是可以通过交换矩阵而自定义的。

因此我们常用的还是后两个SPI。

其实我们并不需要特别关心它的硬件设计,我们只要能用就行。

使用SPI

和I2C相比,编程指南中的SPI有些乱,我看着迷迷糊糊的,因此我以立创开发板的文档为主,以编程指南为辅介绍如何使用SPI。

关于SPI的时序,可以参考我之前的文章,那边介绍的相对详细一些。

【快速上手STM32】SPI通信协议&&1.8寸TFT-LCD(ST7735S)-CSDN博客文章浏览阅读419次,点赞17次,收藏4次。SPI,英文全称Serial Peripheral Interface,即串行外围设备接口,是一种高速、全双工、同步的串行通信总线。我们之前说过I2C,那么我们就拿I2C和SPI做个对比。SPI和I2C对比,优势在于SPI的传输速率比I2C快得多,劣势在于SPI需要用的通信线比较多。https://blog.csdn.net/m0_63235356/article/details/136977377?spm=1001.2014.3001.5501

初始化总线

首先先初始化SPI的总线。

参数一指定SPI资源。但是在选择的时候发现只有三个SPI,不过没有影响,因为编程指南里说了,不支持SPI0和1,因此我们直接选择2和3即可。

参数二的结构体的成员变量很多,不过我们大多用不到,因此配置的时候选择性的配置即可。

参数三指定DMA,SPI_DMA_DISABLED不使用DMA,SPI_DMA_CH_AUTO自动分配DMA。

使用DMA则最大传输量为4096Byte,不使用则为64Byte。

    spi_bus_config_t spi_initer={
        .miso_io_num=12,
        .mosi_io_num=13,
        .sclk_io_num=14,
        .max_transfer_sz=64
    };
    if(spi_bus_initialize(SPI2_HOST,&spi_initer,SPI_DMA_DISABLED)!=ESP_OK)  printf("bus init success\r\n");

在总线上挂载设备

参数二的结构体的成员变量也很多,我们一样是挑着用上的配置。

参数三是传出参数,我们拿一个SPI设备句柄去接收。

    spi_device_handle_t dev_handle;
    spi_device_interface_config_t device_initer={
        .command_bits=0,
        .address_bits=0,
        .mode=0,
        .spics_io_num=15,
        .clock_speed_hz=1000*1000
    };
    if(spi_bus_add_device(SPI2_HOST,&dev_handle,&dev_handle)!=ESP_OK)  printf("add device success\r\n");

发送/接收数据

参数二的结构体成员变量也不少,但是我们配置好要发送的数据和长度,以及接收数据的地方和长度即可。

硬件SPI差不多就是这样,本来想驱动一下ST7735S的,结果发现还是使用软件SPI会更方便,因为ST7735S除了SPI之外还有另外的控制线,这里就偷个懒不写了。下次有机会我再写个ESP32软件SPI驱动ST7735S屏幕的文章。

关于硬件SPI的示例代码,可以参考一下立创开发板的SPI驱动W25Q64,代码写的很详细,基本上复制粘贴修修改改就能用。

Docsicon-default.png?t=N7T8https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g

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

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

相关文章

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎。…

【学习笔记二十一】EWM仓库两步拣配配置及操作展示

一、EWM两步拣配配置 1.定义两步拣配的WPT ①第一步:标准WPT2020,目标仓位是2010两步拣配的仓位,并创建存储类型2010的两步拣配的仓位 ②第二步,标准WPT2010,目标仓位9020发货区和发货的仓位 2.定义确定仓库处理类型的控制标识 3.确定仓库处理类型 4.仓库编码级别需要允…

React自定义Hook函数:高效组件开发的秘密武器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C语言(扫雷游戏)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

深入了解高保真线框:设计师必备利器推荐!

什么是高保真线框 高保真线框是低保真线框的高级版本。它不仅是一个更详细的草图,而且是一系列经过思考的“屏幕”,非常接近产品的最终外观和产品的主要功能。低保真度与高保真度线框的关键区别在于:低保真代表设计方向和整体布局&#xff0…

模块化以及生成

导入对象 >> pip install mock >> pip install pytest-mock 下面对coverage命令参数进行简单介绍。 coverage命令共有10种参数形式,分别是: run:运行一个Python程序并收集运行数据;report:生成报告&#x…

@NameBinding注解名称绑定过滤器/拦截器

NameBinding注解名称绑定过滤器/拦截器,只针对某一些资源方法执行处理逻辑 一、为什么要用名称绑定 一般情况下,借助Spring的过滤器或者拦截器等对Http请求或响应进行处理就能满足需求。但是在有些场景下若只需对特定的xxxResource做拦截处理&#xff0…

数据治理实战——元数据管理

一、元数据概述 1.1 定义 描述数据的数据,本质还是数据。数据本身带有的技术属性与其在业务运行中的业务属性,称其为元数据,例如:表数据量,占用空间,字段信息,业务描述,负责人&…

Springboot+Vue项目-基于Java+MySQL的在线文档管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Gradio 流式输出教程

Gradio 流式输出教程 随着AIGC的发展,我逐渐发现我有许多项目,如果都是等待生成结束才传输出去,就会导致等待时间非常长,影响用户使用体验。在这里流式输出就显得很有必要了,同时也是为后续的实时处理积累一下前置条件…

​Game Maker 0.10:让创作、协作和游戏变得更简单

继去年 12 月成功发布 Game Maker 0.9 之后,我们又隆重推出 Game Maker 0.10。在 0.9 更新的主要增强功能基础上,该版本为创作者实现其愿景提供了更多改进和工具。 为此,The Sandbox 还正式启动了全球范围的创作者训练营,以帮助我…

【三维地图无人机路径规划】基于改进A星算法

课题名称: 基于改进A星算法的无人机三维地图路径规划 版本时间: 2024-04-22 程序运行: 直接运行AStar.m 文件即可 代码获取方式: QQ:491052175 VX:Matlab_Lover 改进方向: 预估函数增…

稀碎从零算法笔记Day56-LeetCode:组合总和 Ⅳ

题型:DP、数组 链接:377. 组合总和 Ⅳ - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的…

手撕AVL树(map和set底层结构)(1)

troop主页 今日鸡汤:Action may out always bring happiness;but there is no happiness without action. 行动不一定能带来快乐,但不行动一定不行 C之路还很长 手撕AVL树 一 AVL树概念二 模拟实现AVL树2.1 AVL节点的定义 三 插入更新平衡因子&#xff0…

mysql基础1——数据存储

mysql数据存储 共有4步 1)创建数据库 2)确认字段 3)创建数据表 4)插入数据 1)创建数据库 从系统架构看mysql数据库系统依次是数据库服务器,数据库,数据表和数据表的行与列 安装程序-->安装了数据库服务器 所有要做的第…

1.基于Springboot对SpringEvent初步封装

一:前置知识 Spring Event是Spring框架提供的一种事件机制,用于处理组件之间的通信。在复杂的系统中,模块或组件之间的通信是必不可少的。Spring Event可以用于以下场景: 1.系统间解耦:模块或组件之间通过事件进行通…

什么是防抖和节流?有什么区别? 如何实现?

防抖(Debounce)和节流(Throttle)是两种常用的技术手段,主要用于控制某个函数在一定时间内触发的次数,以减少触发频率,提高性能并避免资源浪费。 防抖(Debounce)的工作原…

openEuler-23.03下载、安装

一、下载 下载地址:openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本:openEuler-23.03-x86_64-dvd.iso 二、安装 cd /etc/sysconfig/network-scripts/ vi ifcfg-ens-33## 要修改部分 BOOTPROTOstatic## 新增部分 IPADDR192.168.1.128 …

AI觉醒派: 探索与AI协作路径,觉醒更强大的自己

AI觉醒派成立以来,微信社群已经壮大至几千人。许多新加入的小伙伴可能对我们还不够了解,今天,让我们通过这篇文章深入探讨我们的核心理念、梦想、以及如何借助人工智能觉醒更强大的自我。 🌟 AI觉醒派简介 AI觉醒派是一个探索人工…

深度学习入门(4)

神经网络的构建 import numpy as np import matplotlib.pyplot as plt def sigmoid(x):return 1/(1np.exp(-x)) def identity_function(x):#恒等函数return x def init_network():#进行权重和偏置的初始化,并保存到字典中network{}network[W1]np.array([[0.1,0.3,0…