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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HCIP学习】重发布和路由策略

一、重发布(路由引入) 1、背景: 一个网络拓扑中存在多种不同的路由协议,为了使多种不同的路由协议间能相互通信,出现了路由引入 为啥会存在多种不同的网络? 例如:OSPF由于区域架构的限制&am…

《苍穹外卖》Day02部分知识点记录

一、属性的拷贝以及密码的加密 使用org.springframework.beans中的BeanUtils.copyProperties()方法时,二者的属性名必须要一致。 /*** 新增员工* param employeeDTO*/Overridepublic void save(EmployeeDTO employeeDTO) {Employee employee new Employee();// 对…

renren-fast-vue-master常见报错和解决

前言: 因为最近博主的实习,所以在小破站写那个分布式微服务电商的项目,什么什么商城就不说了,大家都明白,相信大家像我一样,在使用renren-fast-vue-master的时候都很是头痛,项目还没开始就结束了…

防、治、管融合一体化旅居健康守护系统

随着人口老龄化趋势的加剧和人们生活水平的提高,养老服务需求不断增长。旅居养老作为一种新型的养老模式,逐渐受到广大老年人的青睐。在生命健康服务运营平台中,为了给老人提供全方位、个性化的生命健康服务,我们平台也特意开设了…

PUBG问题解决:吃鸡请重新安装软件MSVCP140.dll

近年来,随着电子竞技游戏的兴起,《绝地求生》(俗称“吃鸡”)成为了全球范围内备受瞩目的游戏之一。然而,由于游戏本身对计算机硬件和软件的要求较高,许多玩家在游戏过程中可能会遇到各种问题。其中之一就是…

【Yolov系列】Yolov5学习(一)补充2:Focus模块详解

一、相关知识 Focus模块是一种用于特征提取的卷积神经网络层,用于将输入特征图中的信息进行压缩和组合,从而提取出更高层次的特征表示,它被用作网络中的第一个卷积层,用于对输入特征图进行下采样,以减少计算量和参数量…

IS62C256AL-45TLI功能参数介绍及如何优化性能

IS62C256AL-45TLI功能和参数介绍及如何优化性能-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 访问时刻:45 ns 接口类型:Parallel 电源电压-最大:5.5 V 电源电压-最小:4.5 V 电源电流—最大值:25 mA 最小…

如何高效协作?

前言 上一篇文章我们分享了《如何高效沟通》,本篇文章继续延伸至更复杂的场景,跨团队/跨部门协作。 什么是协同? 协同也会被称为协作合作,无论是哪种类型的团队,无论哪种方式的工作场景,都一定会有协作发…

力扣110. 平衡二叉树

思路:与二叉树最大高度类似,但是这里需要返回 -1 的高度来标识不是平衡二叉树,判断左右子树的高度相差大于1则不平衡,否则就是平衡。 class Solution {public boolean isBalanced(TreeNode root) {int ans func(root);if(ans >…

MySQL主从复制实现高可用性和负载均衡

大家好,我是咕噜铁蛋,今天我想和大家聊聊MySQL主从复制如何帮助我们实现高可用性和负载均衡。在如今的大数据时代,数据库的稳定性和性能成为了企业关注的重点,而MySQL主从复制正是解决这两个问题的重要工具。 一、MySQL主从复制简…

Linux进程和任务管理

目录 一.程序和进程的关系 程序 进程 线程 线程与进程的区别 二.查看进程信息ps 方法一 常用选项 方法二 三.TOP动态查看进程信息 进程信息区各列解释 top常用命令 系统查看命令总结 查看进程信息pgrep 查看进程树pstree 四.控制进程 进程的启动方式 进程的前…

[C语言实现]码林盟主秘籍——《手撕八大排序》

​ ​ 🥰作者: FlashRider 🌏专栏: 初阶数据结构 🍖知识概要:详解八大排序的原理、时间复杂度分析、以及代码实现。 目录 八大排序 插入排序 直接插入排序 希尔插入排序 选择排序 冒泡排序 计数排序 堆排序 快速排序 霍…

Gather:基于 DePIN 体系构建的 Web3 社交生态

“Gather 通过搭建一套基于 DePIN 的 Web3 社交体系,正在成为 SocialFi 革命的早期推动者。” 基于互联网的社交,正在为人们提供了远距离沟通和连接的便利,打破了地理障碍,这种具备包容性、广泛性的线上连接,加速了信息…

Git禁止松散对象loose objects弹窗

打开仓库时,弹窗如图 This repository currently has approximately XXXX loose objects.解决办法:见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本,执行git config --global gui.gcwarning false

什么是XXE攻击?如何进行防护

安全性很难做到正确,即使在当今具有安全意识的世界中,也存在一些严重的漏洞,例如 XML 外部实体 (XXE),它们被忽视并最终成为破坏的原因。 XML 外部实体 (XXE) 攻击是一种计算机安全漏洞,通常存在于 Web 应用程序中&…

Uds诊断协议的请求和响应的寻址

一根总线上挂载着很多ECU,那么基于CAN协议UDS的诊断请求报文,诊断仪是如何发给ECU的?如何精准的找到想要诊断的那个ECU?ECU又是如何将诊断响应的报文返回给诊断仪? 在UDS协议中,规定了诊断请求和响应报文发…

kerberos:适配华为FI

文章目录 一、hive1、hive thrift连接方式 一、hive 1、hive thrift连接方式 kerberos认证失败信息 缺少配置:{“hadoop.rpc.protection”:“privacy”},具体可参考:kerbros认证相关问题 华为FI参考资料: https://github.com…

Hive 解决数据倾斜方法

数据倾斜问题, 通常是指参与计算的数据分布不均, 即某个 key 或者某些 key 的数据量远超其他 key, 导致在 shuffle 阶段, 大量相同 key 的数据被发往同一个 Reduce, 进而导致该 Reduce 所需的时间远超其他 Reduce&…

easyui datagrid单元格点击进入编辑时,行会自动向上错位

现象描述,点击第20行可编辑的单元格进入编辑状态时,滚动条自动滚动到第19行了。导致第20行被分页遮挡,看不到无法编辑。 排查了一天百度AI说是滚动定位问题,最后发现是自己设置的列有问题,表格总共五列,全…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数(COUNT) 2. 求和(SUM) 3. 平均值(AVG) 4. 最大值&…