乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。
Posted 半颗心脏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。相关的知识,希望对你有一定的参考价值。
- 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
系列一:ESP32系列模组基础学习系列笔记
1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。
18、入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
19、重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!
20、一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。
21、 esp32蓝牙配网blufi的高度封装,集成简单、使用简单、容易上手,提高开发效率!
22、讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等!
23、安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。
25、分享在 esp32 SDK实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。
26、分享下如何在window下使用CMake编译,编译速度提高传统 make 编译一个档次,支持 ESP32 和 ESP32-C3。
27、windows10平台下自带的Linux安装 ESP8266/ESP32 环境,再无需额外安装虚拟机了。
28、分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,轻松集成到您的项目去。
系列二:ESP32-Camera 摄像头开发板系列笔记
1、安信可 ESP32-Cam 摄像头开发板二次开发 C SDK编程,实现MQTT远程拍照传输到私有服务器。
2、安信可 ESP32-Cam 摄像头开发板二次开发 C SDK编程,实现本地视频流监控。
3、安信可 ESP32-Cam 摄像头开发板二次开发 C SDK编程,拍照图片通过有线串口传到上位机PC端。
系列三:ESP32-C3 模组系列笔记
1、【蓝牙Mesh笔记 ①】ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。
系列四:ESP32-S3 模组系列笔记
1、安信可 ESP32-S3 模组上驱动摄像头 OV2640,实现远程拍照并 HTTP 传输到阿里云对象存储OSS,并显示在微信小程序上。。
系列四:ESP32模组系列笔记 LVGL LittlevGL
1、【LittlevGL ESP32 学习笔记 ①】移植最新的 LVGL 到安信可ESP32\\C3模组,显示一个二维码。
文章目录
一、前言
最近遇到好多粉丝的感谢,我也感谢大家的支持,不管在哪工作,写博客是我一直坚持下来的习惯,把现学的、所学的,总结出来,共勉大家!
最近遇到客户需要在 ESP32-C3 模组外置驱动一个 Flash,于是乎,翻阅了下之前学的正点原子 STM32 资料,很快就适配移植了在安信可的 ESP-C3-12F、ESP32、ESP32S2系列模组,现在也分享给大家。
二、再回顾 Flash W25QXX系列
在2019年,我就写过一篇博客,很详细写明了里面的flash空间情况。
一般情况,对于ESP类产品,我们在内置的Flash增加即可容量,即可达到需求。但是,有些应用场景,会用到大空间,像64MB这么大,就需要2个flash了。
那么,我们就需要外挂一个FLASH,那么你也需要本文拉。这里我们选择Flash,而不是EEPROM呢。因为两者之间有所区别的。
①、w25q系列生产的加工的商家很多,但是里面的分布和命名规则都是一样的。比如华邦的w25q64,spi通讯接口,64就是指64Mbit也就是8M的容量。而我们平时的8266-12f的32Mbit就是4M容量。
②、w25q64为例,我分析下里面的存储分布。w25q64把8M容量分为了128块,每一块又分为16个扇区,而每个扇区占4K大小。由此可计算到,w25q64有 64Mbit / 8 * 1024 / 16 / 4 = 128 块 ,有128 * 16 = 2048 个扇区,此计算原理后面我会提到。
③、w25q64为例,我们在擦除数据时候,最少擦除单位为一个扇区,也就是每次必须擦除 4K 字节。写数据也是一样,必须一个扇区一个扇区去写,所以有我们的esp8266文档提到为什么要4的倍数去写读一个数据。
④、w25q64为例,我们在往某个地址写之前必须确保这个地址上的值是0xFF,否则说明这个地址以前被写过数据,还没有被擦除。w25q64擦除的最小单位是Sector也就是4k个字节,也就是说如果要想往某个地址写一个值,如果这个地址上的值不是0xFF,那么就要把整个扇区都擦除,然后在写。
⑤、w25q64为例,给w25q64开辟一个4k的缓存,比如定义一个4k的数组,然后在写数据之前先判断如果这个地址上的数据不是0xFF,就先把这个地址所在的Sector里的数据全部保存在4k缓存中,再擦除这个扇区,再把缓存中对应的地址上的数据更新,再把这个4k缓存区的所有数据一次性的写入到这个Sector中。因此我们在esp8266操作存储时候,要注意先擦除再写数据。
⑥、w25q64为例,一共是8M字节=810241024=8388608(Byte),分为128块(64K),每一块有分为16个扇区(4K),所以扇区的个数是:12816=2048(个),那么我们选择扇区的范围就是0-2047,假如要擦除第1000个的扇区,那么这个扇区的字节起始就是10004096=4096000,然后W25Q64就从4096000开始往下擦除4K大小的数据空间,计算地址的时候是使用字节来计算的。
下面是我用心画的一个示意图,方便大家去了解下:
这个多少块的计算公式的得来主要后面推导过来的,我们仔细发现,后面都是一个4K为一个扇区,16个扇区为一块,所以我们先将我们的64Mbit换算为64/8*1024= 8192k的容量去除于每个扇区的大小就是一共有多少块了!
Flash与EEPROM的区别
1、 FLASH按扇区操作,EEPROM则按字节操作
2、 FLASH写入时间长,EEPROM写入时间短
3、 FLASH擦写次数少(10000次),EEPROM次数多(1000000次)
4、 FLASH的电路结构简单,成本低,EEPROM工艺复杂,成本高
三、驱动的一些常见知识
这次的代码,移植来自正点原子,我也将PPT整理放给大家看看。
3.2 获取芯片信息:
Byte1 : 厂商ID(0xef=Winbond)
Byte2 : 内存信息(0x40=SPI/0x60=QPI)
Byte3 : 容量 (20x14=220=0x100000=1M Byte=8M Bit)
- First 10Byte : ASCII 0-9
- Next 32Byte : ASCII A-Z
3.3 华邦 Winbond flash 信息
Device | Byte容量s | Address range | 4K-Sectors数量 | 32K-Blocks数量 | 64K-Blocks数量 | JEDEC ID |
---|---|---|---|---|---|---|
W25Q80 | 1M | 0x0FFFFF | 256 | 32 | 16 | EF-40-14 |
W25Q16 | 2M | 0x1FFFFF | 512 | 64 | 32 | EF-40-15 |
W25Q32 | 4M | 0x3FFFFF | 1024 | 128 | 64 | EF-40-16 |
W25Q64 | 8M | 0x7FFFFF | 2048 | 256 | 128 | EF-40-17 |
W25Q128 | 16M | 0xFFFFFF | 4096 | 512 | 256 | EF-40-18 |
四、接线
您可以通过 menuconfig 配置您的GPIO.
W25Q64 | ESP32 | ESP32-S2 | ESP32-C3 | ||
---|---|---|---|---|---|
1 | CS | – | GPIO5 | GPIO34 | GPIO9 |
2 | MISO | – | GPIO19 | GPIO33 | GPIO18 |
3 | WP | – | 3.3V | 3.3V | 3.3V |
4 | GND | – | GND | GND | GND |
5 | MOSI | – | GPIO23 | GPIO35 | GPIO19 |
6 | SCK | – | GPIO18 | GPIO36 | GPIO10 |
7 | HOLD | – | 3.3V | 3.3V | 3.3V |
8 | VCC | – | 3.3V | 3.3V | 3.3V |
实物图:
五、使用以及日志串口输出
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "my_spi_flash.h"
#define TAG "AiThinker-W25QXX::"
const uint8_t TEXT_Buffer[] = "I am aithinker xuhongv";
#define SIZE sizeof(TEXT_Buffer)
void app_main()
SPI_FLASH_Init();
uint8_t datatemp[256] = 0;
uint16_t FLASH_SIZE = 8 * 1024 * 1024; //FLASH 大小为8M字节
ESP_LOGI(TAG, "Write mySaveBuff length:%d", SIZE);
ESP_LOGI(TAG, "Write mySaveBuff:%s\\n", TEXT_Buffer);
W25QXX_Write(TEXT_Buffer, FLASH_SIZE - 100, SIZE);
W25QXX_Read(datatemp, FLASH_SIZE - 100, SIZE);
ESP_LOGI(TAG, "Get mySaveBuff:%s \\n", datatemp);
乐鑫官方仓库也集成了驱动文件系统:examples/storage/ext_flash_fatfs
本文章源码免费下载:https://github.com/xuhongv/StudyInEsp32/tree/master/25_esp32c3_flash_w25q32
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
- 玩转无线物联网带你飞、免费加千人群讨论,群里众多国内ESP开发者,找到你一份归属,免费白嫖。
- QQ讨论一群,点击加群:434878850
- QQ讨论二群,点击加群:623325168
- 个人微信公众号:徐宏blog , 不定时推送干货文章,不推送任何广告。
- 个人邮箱:xuhongv@yeah.net 24小时在线,有发必回复!
- esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 关注下面微信公众号二维码,干货多多,第一时间推送!
以上是关于乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。的主要内容,如果未能解决你的问题,请参考以下文章
乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。
乐鑫Esp32学习之旅28 分享在 esp32 SDK实现驱动 Flash W25Q32 的封装,扩大容量存储更多的资源。(开源源码工程)。
乐鑫Esp32学习之旅⑧ esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。(附带Demo)
乐鑫Esp32学习之旅⑨ esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。(附带Demo)
乐鑫Esp32学习之旅 乐鑫 ESP-S2/S3 模组的实现 USB 无线网卡上网,为你的台式机装上无线WiFI上网吧。(附带源码)
乐鑫Esp32学习之旅 乐鑫 ESP-S2/S3 模组的实现 USB 无线网卡上网,为你的台式机装上无线WiFI上网吧。(附带源码)