IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ESP32 硬件开发指北 -- 外接FLASH使用指北 -> 正文阅读

[嵌入式]ESP32 硬件开发指北 -- 外接FLASH使用指北

ESP32 硬件开发指北 ----外接FLASH权威指北

硬件环境:

  • ESP32-D0WD
  • ESP32-D0WD-V3
  • P25Q32H-UXH-IR USON8封装

软件环境:

  • ESP-IDF V4.3 VScode插件版本

一、选型

ESP32选型:

??ESP32External FlashExternal SRAM 作为片外存储器。图1 列出了两个 CPU 的数据总线指令总线中 的各段地址通过 Cache 与 MMU 所能访问的片外存储器。两个 CPU 通过 Cache 与 MMU 对片外存储器进行访 问时,Cache 将根据 MMU 中的设置把 CPU 的地址变换为 External FlashExternal SRAM 的实地址。经过变换之后的实地址最大支持 16 MBExternal Flash8 MBExternal SRAM

图1.ESP32 FLASH分布

片外存储器 -额外的补充:

??片外存储器 对片外闪存和片外 SPI RAM 的访问通过 Cache 实现,并且由 MMU 管理。根据进程的 PID 以及运行该进程的 CPU,Cache MMU 可以实现不同的映射,做法类似于片上存储器 MMU。即,对于存储器的每个虚地址页,都 有对应寄存器详细说明该虚地址页应映射到哪一个实地址页。但管理片上存储器的 MMU 和 Cache MMU 之间 存在差异。首先,Cache MMU 具有固定的页面大小片外闪存页大小为 64 KB,片外 RAM 页大小为 32 KB); 其次,Cache MMU 具有用于每个 PID 和处理器内核的显式映射表,不通过 MMU 配置项来控制访问权限。在下 文中,MMU 映射配置寄存器将被统称为“配置项”。这些寄存器只能由 PID 为 0 或 1 的进程访问;PID 为 2 到 7 的进程必须通过 PID 为 0 或 1 的进程来改变它们的 MMU 设置。 如上所述,MMU 配置项用于将对存储器虚地址页的访问映射到对存储器实地址页的访问。MMU 控制虚地址空间的五个区域,详见图2。地址范围 V Addr1 到 V Addr4 用于访问片外闪存,V AddrRAM 用于访问片外 RAM。注意 V Addr4 是 V Addr0 的子集。

图2.ESP32 FLASH映射

??总的来说ESP32选择时如果需要2MB以上的FLASH大小,我建议的是选择ESP32-D0WDV3/D0WD的型号主要是封装小的前提下还能保持双核的性能。

FLASH选型:

FLASH选择时我们往往注意这几个问题就可以了。

  • 工作电压
  • 容量
  • 工作模式
  • 封装体积

工作电压:

W25Q系列为例子:

如果能直接找到其 DATASHEET 可以在封面上看到:

在这里插入图片描述

图3.FLASH DATASHEET

??红色框住的就是工作电压1.8V,蓝色就是其大小32M-bit约等于4MB的flash,绿色框的就是其工作模式支持双线、四线模式也就是QIO\DIO模式。

这里要提醒的是:ESP32支持3.3V或者1.8V的FLASH当使用1.8V的FLASH的时候应通过设置Strapping的电平来改变LDO的输出值。

在这里插入图片描述

图4.内置LDO 电压

如果你找不到他的FLASH手册,可以参考一下其型号代码来进行更具体的识别。

当然了这里还是以Winbond为例子:

在这里插入图片描述

图5.Winbond编号

这里再给一个我常用的FLASH的厂商型号代码:

在这里插入图片描述

图6.PUYA编号

可以看到的是每一家厂商编码代表意思都是差不多的主要差别就在于封装上,这一点多注意就好了。

容量:

??在ESP32的开发过程中我们很少的选择很大的FLASH,类似于4MB以上都已经很大了,随着容量的增大FLASH的封装体积、价格也逐渐增大

这一部分需要注意的是有些单位是 M-bit ,但是我们常用的时M-byte 对应的就是8倍 的关系这一点尤其需要注意。

工作模式:

Flash 常用的工作模式有 4 种:DOUT/DIO/QOUT/QIO

  • DOUT:地址为 1 线模式输入,数据为 2 线模式输出
  • DIO:地址为 2 线模式输入,数据为 2 线模式输出
  • QOUT:地址为 1 线模式输入,数据为 4 线模式输出
  • QIO:地址为 4 线模式输入,数据为 4 线模式输出

用户如果需要使用 QIO 模式,则需要在选择 Flash 时确认该 Flash 是否支持 QIO 模式。

这里需要注意的是,QIO模式在40mhz工作的时候相当于两倍的DIO模式等价速度相当于普通SPI的4倍就是160MHZ.

封装体积:

对于一些特殊场景下的flash使用体积显得尤为重要,这里实际给大家举两个例子:

P25Q32H-UXH-IRW25Q32JVSSIQ

在这里插入图片描述

图7.不同封装比较图

??可以看到不同的FLASH 大小相同封装的方式有很大的差别,当然小的封装也是牺牲了烧写速度等来实现较小封装的,对于但是对于读取有很大要求的FLASH来说这些牺牲也是值得的。

二、Layout注意事项:

??说来惭愧,自己在第一次画的时候竟然画错了,疯狂报错找不到FLASH,原因是这样的:

ESP32对PAD的名命有些直接用用途来命名例如:
在这里插入图片描述

图8.FLASH 引脚

??这里的6个PAD就是其外置FLASH的连接引脚,我们知道QSPI下有四个数据脚分别对应SD_DATA_0 到SD_DATA_3

??问题就出在这里:SD_DATA的名命方式其实是遵循SDIO协议的,并不是QSPI的对应引脚,最开始我直接就按编号顺序连接了,其中各个引脚对应的如图9所示,效果就是图10这样:
在这里插入图片描述

图9.FLASH 引脚对应表

就是将SIO0——SD_DATA0,SIO1——SD_DATA1,这样一 一对应连接起来。
在这里插入图片描述

图10.FLASH 错误连接

焊接上去烧录就会报错:

在这里插入图片描述

图11.A fatal error occurred: Timed out waiting for packet content

Timed out waiting for packet content,后来我将FLASH拆下来,发现还报这个错误确定就是FLASH没有被检测到。

??仔细阅读了ESP32的Datasheet后发现其实链接并不是按号码顺序的,我才想起来这可能是针对SDIO的标号,这里实在无法理解为什么这样设计引脚标号:

在这里插入图片描述
在这里插入图片描述

图12.正确连接顺序

??但是我已经打板子了。。。这怎么办呢?四处查找找到了解决方案。

??原文地址:ESP32-D0WD FLASH PROBLEM,在这里我找到了可以通过烧写efues来REMAP这些引脚,如果你和我一样,按顺序连接了FLASH的引脚,你可以通过这样来改变

espefuse.py --port COMx burn_efuse SPI_PAD_CONFIG_CLK 6
espefuse.py --port COMx burn_efuse SPI_PAD_CONFIG_Q 8 
espefuse.py --port COMx burn_efuse SPI_PAD_CONFIG_D 7
espefuse.py --port COMx burn_efuse SPI_PAD_CONFIG_HD 10
espefuse.py --port COMx burn_efuse SPI_PAD_CONFIG_CS0 11

??这样就实现了交换引脚,正常完成下载。

??你以为这样就完成了吗?当然不是,下载完成后我想开启QIO模式怎么办?

三、ESP32到底如何开启QIO模式:

首先!你要确认你的连接正确且FLASH支持QIO模式,打开IDF的设置。

在这里插入图片描述

图13.FLASH 模式

??将红框部分改为QIO模式,频率依照你的FLASH参数来改变,我这里选择了40MHZ。下边就是大小也是依照你的FLASH参数来改。

修改完后编译,如果没有报错那好恭喜你已经成功开启QIOmode,如果有报错别急继续往下看:

在这里插入图片描述

图14.QIO模式开启失败

??qio_mode: Failed to set QIE bit, not enabling QIO mode,如果你的报错是这个,就说明你的ESP32光放并没有对你所选用的FLASH进行支持,当然你可以自己添加支持,具体如何添加可以参考这个:只看添加驱动部分

??我在这里简单说一说如何添加,打开你FLASH的手册找两个寄存器的位置:

??这里说明你的FLASH生产商ID和设备ID,就是图中的

Manufacturer ID:0X85

FLASH ID:0X6016

找到后写入对应位置

在这里插入图片描述
在这里插入图片描述

Status Register:
在这里插入图片描述

图15.Status Register

??需要看的就是QE位是第几位,结合引用文章写入对应位置。

??值得注意的是,许多厂商会存在双八位寄存器,或者单16位的情况,如果调用正确的函数将无法读取到正确的QE位信息,导致无法使用,如何识别自己厂商是什么情况的呢?就需要去看其对应的命令表:

在这里插入图片描述

图15.命令表

??可以看到虽然Status Register一共有16位但是是分开访问的,所以我这里使用的是 read_status_8b_rdsr2,值得注意的是虽然他在途中是S9这也代表着他是下一个寄存器的第2位。

还有你修改后重新编译一下,你以为就好了吗?当然不是此时你会发现你的ESP32虽然开启了QSPI模式但是还会报错:

在这里插入图片描述

图16.QIO模式报错

??竟然找不到分区表了。。。当然这个问题只会存在于被强制修改过QSPI引脚的ESP32,正常连接顺序是不会报错的。那这样怎么办呢?

??其实在上边的时候你就能发现少REMAP了一个脚 ——>WP。

??它并不是在efues里面更改的而是在配置里面设定的,如下图所示。

在这里插入图片描述

图17.WP引脚修改

按照更改后再次编译烧写,就可以成功。
在这里插入图片描述
??这个教程我会持续更新,做到最强FLASH指南。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:25:34  更:2021-12-06 15:26:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:17:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码