ESP32 硬件开发指北 -- 外接FLASH使用指北

news/2024/7/5 19:55:01

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指南。


http://www.niftyadmin.cn/n/1102378.html

相关文章

Pytorch —— 基础指北_壹 [什么是Torch]

Pytorch ——基础指北_壹 系列文章目录 Pytorch ——基础指北_零 Pytorch ——基础指北_壹 Pytorch ——基础指北_贰 Pytorch ——基础指北_叁 软件环境: pytorch 1.10pycharmCUDA 10.2 提示: 使用配套教程体验更好: youtobe教程&#…

Web开发实战——spring 应用笔记(壹)

Spring_前传(1) 软件环境: IDE:IDEA插件:spring InitializermongoDB:v5.0.6驱动项目类型:校园网项目 使用Lombok简化领域对象 领域对象(Domain Object)也被称为实体类,代表了业务的状态,贯穿表现层、业…

Spark快速大数据分析——Scala语言基础(壹)

Spark快速大数据分析——Scala语言基础(壹) 文章目录Spark快速大数据分析——Scala语言基础(壹)前记Scala的历史环境搭建:1、SBT构建工具和REPL:2、使用IDE:Scala 入门:一点点补充&a…

项目风险管理落地

发现很多做项目的同学,会忽略对项目风险的管理,以至于成为项目的救火队长,处理各种应急事件。为了让项目开展更顺畅,避免出现项目既乱又累的问题,不应以战术上的勤奋,掩盖战略上的懒惰,梳理总结…

2018年OpenStack用户调查报告出炉:Kubernetes仍居首

这份报告来自由OpenStack基金会发起的全球OpenStack用户调查项目,汇总了2017年8月至2018年8月期间1483个已完成的调查(代表858个部署,来自441个独特的用户组织)。作为第11次OpenStack用户调查,本次调查重点关注了全球用…

python爬虫笔记-day5

mongodb插入数据db.collecion.insert({}) 插入数据,_id存在就报错 db.collection.save({}) 插入数据,_id存在会更新 mongodb的更新操作db.test1000.update({name:"xiaowang"},{name:"xiaozhao"})把name为xiaowang的数据替换为{name:…

深入解析webpack 插件html-webpack-plugin

这个插件用来简化创建服务于 webpack bundle 的 HTML 文件,尤其是对于在文件名中包含了 hash 值,而这个值在每次编译的时候都发生变化的情况。你既可以让这个插件来帮助你自动生成 HTML 文件,也可以使用 lodash 模板加载生成的 bundles&#…

zabbix之 zabbix server 跟 agent 更换ip地址

描述: zabbix server端跟agent端更改 ip 。 改完之后,相应配置文件 (zabbix_agentd.conf、zabbix_server.conf)的ip也进行了替换 但是依旧报错,如图 解决: (PHP的配置文件没有更新) vi /home/bm…