esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)

2023-05-16

本文

ESP8266 和 ESP32 支持四种不同的 SPI flash 访问模式:DIO、DOUT、QIO 和 QOUT。 这些可以通过 esptool.py write_flash--flash_mode 选项设置。

这些控制选项决定哪些 I/O 引脚与连接的 SPI 闪存芯片进行通信,以及使用哪些 SPI 命令。

ESP8266 和 ESP32 在从 SPI 闪存芯片读取或执行代码和数据时使用这些命令。 读取数据然后缓存到芯片内部。

概要

按性能排序:

可选项模式名称引脚速度(ESP8266 & ESP32)
qio Quad I/O地址和数据 4pins最快
qout Quad Output数据 4pins约比 qio 模式下慢 15%
dio Dual I/O地址和数据 2pins约比 qio 模式下慢 45%
doutDual Output数据 2pins约比 qio 模式下慢 50%

通常选择与设备相适应的最快的工作模式, 并非所有设备都支持所有模式。 有关详细信息,请参阅下文中的常见问题解答。

模式说明 

 正常SPI
传统的“单”SPI(串行外设接口)总线使用 4 个引脚进行通信:

ᴥ 时钟 (CLK)
ᴥ 主出从入 (MOSI)
ᴥ 主进从出 (MISO)
ᴥ 片选 (CS)
维基百科有相当完整的描述。

所有这些信号都是单向的。 在单 SPI 模式下,数据从设备发送到主机使用 MISO 引脚,从主机发送到设备使用 MOSI 引脚。

正常 SPI 的最大数据速率是以位为单位的时钟速率 ,因此 40MHz 时钟 = 40Mbits/sec = 5Mbytes/sec。

Dual SPI

为了提高性能,SPI 闪存制造商推出了“Dual SPI”。在Dual SPI 模式下,MOSI 和 MISO 引脚都用于以每个时钟周期两位的方式同时读取或写入数据。与单个 SPI 相比,这使某些命令的数据速率加倍。

dout模式下,主机使用“双输出快速读取”(3BH)命令来读取数据。每个读取命令和读取地址通过正常的 SPI 从主机发送到闪存芯片,然后主机通过 MOSI 和 MISO 引脚同时读取数据,每个时钟两位。与仅使用 MISO 读取数据的单个 SPI 相比,这使数据传输速率加倍。

dio模式下,主机使用“双I/O快速读取”(BBH)命令来读取数据。每个读取命令都通过正常的 SPI 从主机发送到闪存芯片,然后地址通过 MOSI 和 MISO 引脚以每个时钟两位的方式发送到闪存芯片。此后,主机以与“双输出快速读取”相同的方式读取每个时钟两位的数据位。

对于 ESP8266 和 ESP32,每个命令读取 32 个字节,dio 模式比 dout 快大约 5%。

请查阅您的特定 SPI 闪存芯片的数据表,以确定它是否支持这些命令中的一个或两个。

Quad SPI

为了进一步提高SPI flash数据传输的性能,SPI flash厂商推出了“Quad SPI”模式。这种模式增加了两个额外的引脚(否则使用闪存芯片 WP 和 HOLD 信号)用于数据传输。这允许双 SPI 的数据速率加倍。

并非所有闪存芯片都支持 Quad SPI 模式,并且并非所有 ESP8266 和 ESP32 芯片都将这些引脚连接到 SPI 闪存芯片。一些闪存芯片需要特殊命令来启用quad modes(见下文)。

qout 模式下,主机使用“四输出快速读取”(6BH)命令读取数据。此命令与“双输出快速读取”相同,区别在每个时钟周期 在 4 个引脚上读取数据,而不是在2 个引脚上读取数据。这使得数据传输的速度恰好是“双输出快速读取”的两倍。

qio模式下,主机使用“Quad I/O Fast Read”(EBH)命令来读取数据。此命令与“双 I/O 快速读取”相同,只是地址和数据每个时钟周期都在 4 个引脚上传输,而不是用 2 个引脚。这使得地址和数据传输速度是“双 I/O 快速读取”的两倍。

常见问题解答

为什么 qio 和 qout 模式不适用于我的乐鑫芯片/模块? 

通常是以下原因之一:

ᴥ SPI flash 芯片的 WP 和 HOLD 引脚未连接到乐鑫芯片的正确 GPIO。这些引脚必须正确连接才能使四路模式工作,而且并非所有板子/模块都连接它们。
ᴥ SPI 闪存芯片不支持四模式。查看闪存芯片数据表以了解它支持哪些模式。您可以直观地识别闪存芯片,或使用 esptool.py flash_id 命令来识别闪存芯片。
ᴥ 此芯片型号未正确启用quad mode模式。 SPI 闪存不是标准,因此每个制造商实现的方式都是不同的。大多数闪存芯片需要发送某些命令才能启用 Quad SPI 模式,这些命令各不相同。对于 ESP8266 和 ESP32,这通常意味着芯片首先以Dual SPI 模式启动,然后软件(ESP32 的引导加载程序或 ESP8266 的 SDK)检测芯片类型并尝试启用 Quad SPI 模式。如果软件不支持特定的芯片型号,那么它将无法进入quad mode。

为什么 qout/dout 模式有效,而 qio/dio 模式无效?

某些 SPI 闪存芯片型号仅支持“双输出快速读取”和/或“四输出快速读取”命令,而不支持qio/dio模式。

与 Quad SPI 相比,我的代码在 Dual SPI 模式下的运行速度会减半吗?


不。ESP8266 和 ESP32 都直接从 Flash 执行代码,但是因为从 Flash 读取数据很慢,所以数据被透明地缓存在 RAM 中。闪存读取命令仅在发生缓存未命中时发送。但是,使用Dual SPI 读取重新填充缓存的速度大约是其 Quad SPI 等效项的一半。

如果您无法使用 Quad SPI 模式,请确保您正在配置在您的板子/模块上可靠运行的最快 SPI Flash 时钟速率。 Dual I/O 模式下的 80MHz SPI 时钟比 Quad I/O 模式下的 40MHz SPI 时钟快。

Flash 模式如何与 ESP8266/ESP32 通信?

烧录到SPI flash上的bootloader.bin文件包含一个标头,其中包含闪存速度、闪存模式和一些其他数据。复位后由 ROM 代码读取此标头时确定主机的模式。将“-flash_mode”参数传递给 esptool.py 将在文件写入闪存时更新此标头。

这仅确定用于从复位初始引导的模式。然后,作为引导过程的一部分,软件可能会以不同方式配置闪存模式。

例如,在 ESP32 上,如果 ESP-IDF 配置为 qio/qout 模式,那么 IDF 软件引导加载程序实际上是使用 dio/dout 模式刷新的。当 ROM 代码从闪存引导此引导加载程序时,引导加载程序软件会检查闪存芯片模型并为引导过程的其余部分启用正确的 Quad SPI 模式。这是因为在不同芯片型号上启用 Quad SPI 的方法有多种。

原文链接:https://github.com/espressif/esptool/wiki/SPI-Flash-Modes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT) 的相关文章

  • flash/flex:渐进式下载与 rtmp

    我试图理解并真正确定何时在 Flex flash 中使用渐进式下载与 rtmp 看来主要的一点是 rtmp 不与 http 一起提供服务 而渐进式下载则由 http 提供 由于它不是 rtmp 因此资源受到保护 因为无法从 swf 外部连接
  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • 更改 AS3 中的 TextField 选择颜色

    如何更改 ActionScript 3 中 TextField 的选择 突出显示 颜色 我有一个输入文本字段 黑色背景上有白色文本 因此 选择是不可见的 这对于可用性来说非常糟糕 谢谢 另一种方法是使用文本布局框架 特别是使用 Select
  • 在 WordPress 页面上嵌入 swf

    我正在尝试将 swf 嵌入到 WordPress 页面中 这听起来很简单 但它不起作用 我不明白为什么 我已将所有相关文件上传到服务器上 并且我相当确定所有文件路径都是正确的 包含 fla 和 swf 文件的文件夹还包含一个 index h
  • KAA 0.10.0 中使用 ESP8266 SDK 编译错误

    我根据以下内容构建了ESP8266 SDK这个文件 https kaaproject github io kaa docs v0 10 0 Programming guide Using Kaa endpoint SDKs C SDK ES
  • 为什么反编译swf文件时jpexs工具不起作用?

    有人知道如何反编译 SWF 文件吗 我尝试过 JPEXS 和 Sothink SWF Decompiler 但不起作用 我把这个 swf在这个link https drive google com file d 1ehHprPOqR0QnR
  • 如何从 JW Player 5.1 中提取 .flv 流?

    问题是我的互联网连接速度很慢 并且视频不像 YouTube 那样缓冲 因此我想知道是否可以提取 JW Player 中正在流式传输的 flv 文件的 url 并直接下载它 做了一些初步研究 我发现了以下信息 主要视频网址 http ijf1
  • Microsoft Surface 支持 Flash 网站吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我搜索过谷歌但没有找到明确的答案 我或我工作的 Flash 网站 应用程序可以在 Microsoft Surface 平板电脑上运行吗 看来微软 Su
  • 无法在 BeagleBone Green Wireless 上配置 SPI0

    注 所选答案为解决该问题的原始答案 更多详细信息请参阅下面的补充答案 我无法在 BeagleBone Green Wireless BBGW 上配置 SPI0 我试图在不使用覆盖层的情况下实现这一目标 仅使用纯 DeviceTree dev
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • getElementById 无法在 的 Google Chrome 扩展中工作

    在我的 Google Chrome 扩展内容脚本中 我有以下内容 jQuery document ready function var player document getElementById player console log pl
  • 如何打开/关闭 iPhone 相机闪光灯 swift 2?

    我正在寻找如何打开 关闭 iPhone 的相机闪光灯 我发现了这个 IBAction func didTouchFlashButton sender AnyObject let avDevice AVCaptureDevice defaul
  • 在浏览器上录制视频并上传到LAMP服务器

    我已经尝试了很多东西 red5 jquery 网络摄像头 html5 但这些解决方案都没有录制视频并准备好上传到服务器 无论如何 html5 flash 等等 更好的跨浏览器解决方案 最好的 上传视频 音频 并将结果上传到服务器 我猜是通过
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • Javascript 通过ExternalInterface 来刷新

    我想知道是否有人可以查看我的代码 我正在尝试使用以下代码将虚拟变量从 javascript 传递到 actionscript 3 HTML
  • 使用 Javascript 自定义上下文菜单?

    有没有办法使用 Javascript 将自定义字段添加到内置浏览器上下文菜单中 我知道 flash actionscript 可以做到这一点 他们是如何做到的 示例 右键单击http josephjewell com http joseph
  • ActionScript 2 移动对象

    我对 ActionScript 知之甚少 我有一个电影剪辑 我希望当我按下按钮 按钮或影片剪辑 时它沿 x 轴移动我不知道要使用什么代码 因为它需要是 Action Script 2 是否有教程或其他东西可以完成此任务 我找到了一个教程 当
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • Flash Action Script 3 设计自定义MovieClip作为按钮

    我是 Flash AS3 的新手 我正在尝试创建一个应该充当按钮的影片剪辑 请参阅下图以供参考 我想知道如何为此自定义按钮创建一个包 以便我可以通过在参数中指定 名称 图像 来使用此包创建所需数量的按钮 Main movieclip mc
  • 避免滚轮被嵌入的 youtube / flash 视频劫持

    我正在对主页中嵌入 YouTube 视频的网站进行一些改进 我自己没有添加此代码 但它看起来像

随机推荐

  • TCP报文结构

    TCP报文结构 TCP报文由俩部分组成 xff1a TCP报头和TCP数据 TCP报文是TCP传输的数据单元 端口号 xff1a 用来标识一台主机的不同进程 1 xff09 源端端口号 xff1a 源端口和IP层解析出来的IP地址标识报文的
  • 【算法】洗牌算法

    碎碎念 xff1a 面试的时候 xff0c 让写这道题 xff0c 快写完了 xff0c 面试官告诉我 xff0c 这是洗牌算法 xff0c 1 介绍 洗牌算法是将原来的数组进行打散 xff0c 使原数组的某个数在打散后的数组中的每个位置上
  • 【操作系统】第一章总结

    1 1 操作系统介绍 1 1 1 操作系统的概念 功能和目标 1 1 1 操作系统的概念 功能和目标 xff08 系统资源的管理者 提供接口 作为扩充机器 虚拟机 xff09 StudyWinter的博客 CSDN博客 1 1 2 操作系统
  • 【操作系统】2.1 进程与线程总结

    2 1 1 操作系统之进程的定义 特征 组成 组织 2 1 1 操作系统之进程的定义 特征 组成 组织 StudyWinter的博客 CSDN博客 进程由程序段 数据段 进程控制块 xff08 PCB xff09 三部分组成 进程是进程实体
  • 【操作系统】2.2 操作系统的调度

    2 2 1 操作系统之处理机调度的概念及层次 2 2 1操作系统之处理机调度的概念及层次 StudyWinter的博客 CSDN博客 操作系统调度的层次 高级调度 xff08 作业调度 xff09 xff1a 外存 内存 中级调度 xff0
  • 【操作系统】2.4 死锁

    这一节也非常重要 2 4 1 死锁的概念 2 4 1 死锁的概念 StudyWinter的博客 CSDN博客 在并发环境下 xff0c 各种进程因竞争资源而造成的一种互相等待对方手里的资源 xff0c 导致各进程都阻塞 xff0c 都无法向
  • 3.1.1 什么是内存?进程的基本原理,深入指令理解其过程

    0 思维导图 1 什么是内存 xff1f 有何作用 xff1f xff08 1 xff09 存储单元 内存 Memory 是计算机的重要部件 xff0c 也称内存储器和主存储器 xff0c 它用于暂时存放CPU中的运算数据 xff0c 以及
  • 怎样用AT指令查询本机手机号码

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • 3.1.2 操作系统内存管理管些什么?

    0 思维导图 1 内存空间的分配与回收 2 内存空间的扩展 xff08 实现虚拟性 xff09 3 地址转换 4 内存保护 1 操作系统负责内存空间的分配和回收 xff1b 2 操作系统需要提供某种技术从逻辑上对内存空间进行扩充 xff1b
  • C++11特性

    最近打算照着源文档学习C 43 43 特性 xff0c 先从C 43 43 11的特性开始 学习 xff1a C 43 43 11 cppreference com C 43 43 11 C 43 43 11是继C 43 43 98之后的最
  • C++11特性之auto

    占位符类型说明 对变量而言 xff0c 指定要声明的变量的类型将从其初始值中自动推导出来 对于函数而言 xff0c 指定的返回类型将从其返回语句中推导出来 xff08 从C 43 43 14开始 xff09 对于非模版类型的参数而言 xff
  • C++11特性之decltype

    检查一个实体的声明类型或者检查表达式类型和值类别 语法 strong decltype strong entity strong strong 1 since C 43 43 11 strong decltype strong expres
  • 【算法】151. 反转字符串中的单词

    链接 xff1a https leetcode cn problems reverse words in a string 给你一个字符串 s xff0c 请你反转字符串中 单词 的顺序 单词 是由非空格字符组成的字符串 s 中使用至少一个
  • TensorFlow中numpy与tensor数据相互转化

    numpy与tensor数据相互转化 xff1a Numpy2Tensor 虽然TensorFlow网络在输入Numpy数据时会自动转换为Tensor来处理 xff0c 但是我们自己也可以去显式的转换 xff1a data tensor 6
  • ESP32环境搭建 HomeKit 平台搭建 苹果智能家居HomeKit

    本文所有操作环境在linux下 xff0c 参考README文档 xff0c 官方sdk获取连接 https github com espressif esp apple homekit adk HomeKit是Apple开发的框架 xff
  • 乐鑫代码中Ring Buffers (环形缓冲区)说明

    本文翻译自乐鑫文档 xff0c 详见链接地址 xff0c 结合用例自行测试 xff0c 欢迎交流 源码链接ringbuf c 项目中用乐鑫的wifi模组 xff0c esp8266 xff0c esp32中发现ringbuf的身影 xff0
  • Qt界面程序中嵌入其他可执行exe程序

    背景 xff1a 本文实验环境 windows10 xff0c qt5 14 由于工作需要写了一个小的qt程序 xff0c 然后在实际使用过程中还要和其他小工具来回切换 xff0c 就想能不能把其他工具代码集成 xff0c 最后发现对我来说
  • Windows10系统旧电脑打包迁移新电脑

    由于需要换了一台新电脑 xff0c 但是配置系统是个繁琐的大工程 xff0c 想想windows的环境变量啥的就头大 xff0c 就想偷懒把系统直接转移到新电脑 xff0c 网上搜索了一下是可行的 xff0c 好多ghost备份还原 xff
  • 线程池1.0和any类

    threadpool h ifndef THREAD POOL H define THREAD POOL H include lt iostream gt include lt memory gt include lt functional
  • esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)

    本文 ESP8266 和 ESP32 支持四种不同的 SPI flash 访问模式 xff1a DIO DOUT QIO 和 QOUT 这些可以通过 esptool py write flash 的 flash mode 选项设置 这些控制