NANDFlash-W25N01GVZEIG的学习笔记

2023-11-14

文章目录

一、NAND Flash和NOR Flash

Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。

他们的区别如下。

NAND Flash NOR Flash
读速度
写速度 ↑↑↑ ↓↓↓
擦写速度/次数 ↑↑ ↓↓
擦写电路 ↓以块为擦写单位
易用性 ↓↓ ↑↑
体型/价格 ↓↓ ↑↑
接口 共用地址数据线 带SRAM接口,有足够的地址引脚来寻址,地址数据线独立,可直接寻址
位反转/坏块处理 坏块较多且随机分布,采用错误探测/错误更正(EDC/ECC)算法 坏块少,采用冗余比特替换法
浮栅充电 F-N隧道效应(Fowler Nordheim tunneling) 热电子注入(hot electron injection)
特点 能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理需要特殊的系统接口 可在芯片内执行代码,传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能
基本单元 读操作-页page 擦写操作-块block 读写操作-扇区sector

NAND Flash和NOR Flash的区别中有三点很关键:
1、首先,NAND Flash在出厂时就有一定的坏块,而且是随机分布,这是由NANDFlash的工艺造成的,以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。所以,NAND Flash被允许在出厂时有很少量的坏块。
2、其次,NAND Flash在应用中会出现位翻转错误(bit failture)。虽然概率很低,大约每100亿次写操作才会出现一次,但是对于用作系统根文件系统的存储设备,这种错误是绝对不允许的。因为这种错误万一发生在系统配置文件上,则会影响系统的运行。但是作为流媒体文件的存储器,位翻转的问题并不大。
3、最后,NAND Flash和NORFlash在应用接口上有着本质的区别,NAND Flash是I/O方式,NOR Flash是总线方式,这是它们除了价格以外最主要的差别。

二、W25N01GVZEIG引脚说明

想要实现对NAND FLASH和NOR FLASH等存储器实现读写操作,可以采用STM32的FSMC(Flexible Static Memory Controller)可变静态存储控制器,它会自动对时序等操作进行处理,使用起来会比较方便。当然有的存储器支持SPI接口进行数据的传输,而我选择的NAND FLASH W25N01GVZEIG(数据手册在下载文件那里)支持Standard/DUAL/QUAD SPI。
以下是他们的引脚信息。

传输模式 引脚
Standard SPI CLK、/CS、DI、DO、/WP、/Hold
DUAL SPI CLK、/CS、IO0、IO1、/WP、/Hold
QUAD SPI CLK、/CS、IO0、IO1、IO2、IO3

接口说明:
CLK(Serial Clock):时钟线
/CS(Clip Select):片选线
DI(Serial Data Input(Data Input Output 0)):串行数据输入线
DO(Serial Data Output(Data Input Output 1)):串行数据输出线
/WP(Write Protect Input (Data Input Output 2)):写数据保护线
/Hold(Hold Input (Data Input Output 3)):数据输入保持线

下面是W25N01GVZEIG的引脚和对应引脚详细描述:
在这里插入图片描述

三、SPI配置

我使用的是标准SPI方式进行数据的传输(配置方法

四、W25N01GVZEIG的架构和寻址

下面为W25N01GVZEIG的架构图。
在这里插入图片描述

W25N01GVZEIG的寻址方式。
在这里插入图片描述

从上面两图可以看出,它的列地址大小为2112B,由2048B的数据缓冲区和64B的备用区域(Spare Area)组成。它的行地址大小1024*64*2KB,即1024个区块(Block),每个区块包含64页(Page),每页大小为2KB。
由于NAND Flash在设定上存在坏块(曾经想要消灭坏块,但由于成品率太低所以就这样了),所以就有Spare Area,它被用于标记坏块(bad block)和保存对MainArray中main区的ECC码(Error Checking and Correcting,纠错码)。

下面是设备操作流程,其中BUF、ECC-E的状态会影响选择哪种读取数据的方式Continuous Read或是Buffer Read,这在后面的指令码选择会有用。
在这里插入图片描述
我们可以通过修改状态寄存器2来改变BUF和ECC-E的状态。
在这里插入图片描述
在这里插入图片描述

五、W25N01GVZEIG的指令码

由于我使用的是W25N01GVZEIG即xxIG,按照默认方式的话就是如下的指令码。
在这里插入图片描述

以读取设备ID为例,可以从手册下面的时序图进行代码的编写。
在这里插入图片描述

根据时序我们编写读取芯片ID的顺序大致如下:
1、/CS拉低
2、发送指令0x9F
3、发送无用指令(0x00)占用8个虚拟时钟(dummy clock)
4、然后接收ID的高8位(temp|=data<<16、EFh为Winbond的ID)
5、再接收ID的中8位(temp|=data<<8)
6、最后接收ID的低8位(temp|=data,AA21h为设备的ID)
7、/CS拉高

六、W25N01GVZEIG各个指令的解析

(一)、Device RESET

作用:复位设备
指令码:0xFF
输入参数:无
返回值:无

(二)、JEDEC ID

作用:获取芯片的制造商和设备ID
指令码:0x9F
输入参数:无
返回值:制造商ID0xEF,设备ID0xAA21

(三)、Read Status Register

作用:读状态寄存器对应地址的数据
指令码:0x0f/0x05
输入参数:8位状态寄存器地址SR_Address
返回值:8位状态寄存器值

(四)、Write Status Register

作用:写状态寄存器对应地址的数据
指令码:0x1f/0x01
输入参数:8位状态寄存器地址SR_Address、8位写入对应地址的值
返回值:无

(五)、Write Enable

作用:写使能
指令码:0x06
输入参数:无
返回值:无

(六)、Write Disable

作用:写失能
指令码:0x04
输入参数:无
返回值:无

(七)、BB Management(Swap Blocks)

作用:坏块管理
指令码:0xA1
输入参数:16位逻辑块地址LBA(Logical Block Address)和16位物理块地址PBA(
Physical Block Address)
返回值:无
备注:在执行之前要执行写使能

(八)、Read BBM LUT

作用:读取坏块管理查阅表
指令码:0xA5
输入参数:无
返回值:依次输出LUT中逻辑块地址和物理块地址
(All block address links will be output sequentially starting from the first link (LBA0 & PBA0) in the LUT(Look Up Table))

(九)、Last ECC failure Page Address

作用:输出上一个ECC校验错误的页地址
指令码:0xA9
输入参数:无
返回值:16位上一个ECC校验错误的页地址

(十)、Block Erase

作用:擦写指定块(64页,128KB)内所有内存设置为1(FFh)
指令码:0xD8
输入参数:16位页地址
返回值:无
备注:在执行之前要执行写使能

(十一)、Program Data Load(Reset Buffer)

作用:将程序数据加载到数据缓冲器,然后发出程序执行指令,将数据从数据缓冲区传输到指定的内存页。
指令码:0x02
输入参数:16位列地址CA[15:0](其中只有CA[11:0]有效)、至少一字节的数据(1~2111Byte)
返回值:无
备注:
执行该条指令之前要先执行写使能操作使状态寄存器的WEL位置1。
如果启用内部ECC算法,所有2,112字节的数据都将被接受,但是额外的64字节部分中为ECC奇偶校验位指定的字节将被ECC计算覆盖。如果将ECC- e位设置为0以禁用内部ECC,则额外的64字节部分可用于外部ECC或其他用途。
它会重置未使用的数据缓冲区中的数据字节(FFh)

(十二)、Random Program Data Load

作用:同上
指令码:0x84
输入参数:同上
返回值:无
备注:部分同上,最后一句不同
只会更新数据字节命令指定的输入序列,其余的数据缓冲区将保持不变

(十三)、Quad Program Data Load (Reset Buffer)

作用:将从所有四个IO引脚输入数据字节,而不是单一数据输入引脚。当数据量较大时,该方法将显著减少将数据加载到数据缓冲区中的时间。
指令码:0x32
输入参数:列地址CA[15:0]
返回值:无
备注:它会重置未使用的数据缓冲区中的数据字节(FFh)

(十四)、Random Quad Program Data Load

作用:同上
指令码:0x34
输入参数:同上
返回值:无
备注:只会更新数据字节命令指定的输入序列,其余的数据缓冲区将保持不变

(十五)、Program Execute

作用:程序执行指令是程序操作的第二步。程序数据加载到2,112字节的数据缓冲区(启用ECC时为2,048字节)后,程序执行指令将把数据缓冲区内容编程到指令中指定的物理内存页
指令码:0x10
输入参数:页地址PA[15:0]
返回值:无

(十六)、Page Data Read

作用:页数据读取指令将指定内存页的数据传输到2,112字节的数据缓冲区
指令码:0x13
输入参数:页地址PA[15:0]
返回值:无

(十七)、Read

作用:读取数据指令允许在执行读取页数据指令后,从数据缓冲区中顺序读取一个或多个数据字节
指令码:0x03
输入参数:列地址CA[15:0]
返回值:返回最多2048字节的数据

(十八)、 Fast Read

作用:快速读取指令允许在执行读取页数据指令后,按顺序从数据缓冲区读取一个或多个数据字节
指令码:0x0B
输入参数:列地址CA[15:0]
返回值:返回最多2048字节的数据

七、使用中发现的问题

1、NOR FLASH和NAND FLASH在程序的编写上真的有很大区别,前者读写的单位比较小,很容易就可以对内存进行操作,但后者读写的单位为页,擦写的单位是块。

2、在编写程序时要注意列地址(Column Address)和页地址(Page Address),我在地址编写时将它们组合在一起为方形阵列,就如前面第四章的架构所示。地址xxxx xxx前16位为页地址(0-65535),后12位则为页內偏移(0-2111,注意当ECC-E=1时只到0-2047)。下面为将上述地址转化为列地址和页地址。

#define ADDR_Col_CA15_CA8(ADD)  (uint8_t)(((ADD) & 0x0F00) >> 8)
#define ADDR_Col_CA7_CA0(ADD)    (uint8_t)((ADD) & 0xFF)
#define ADDR_Row_PA15_PA8(ADD)   (uint8_t)(((ADD) & 0xFF00000) >> 20)
#define ADDR_Row_PA7_PA0(ADD)    (uint8_t)(((ADD) & 0xFF000) >> 12)

3、使用NAND FLASH最好是使用BBM(Bad Block Management)坏块管理,因为它本来生产就不可避免地出现坏块,这样做避免数据错误和系统崩溃。另外可以采取一些策略来提高它的寿命和效率,例如是磨损均衡管理等。

八、其他注意事项

1、SPI 的信号线最好加 1k 上拉电阻, 实测发现 W25N01GV 这颗芯片的驱动能力比较弱。在调试的时候这可能发生误导,因为 BUSY = 0 时表明命令执行完毕,实际上是读回来的虚假低电平。

2、Protection Register / Status Register-1 (Volatile Writable, OTP lockable) 此寄存器上电后的默认值是 0b01111100,也就是说 Flash 处于写保护状态。我们需要用 Write Status Register (1Fh/01h) 这条指令清除写保护。 否则擦写指令不起作用。

3、要注意两个型号的区别
W25N01GVxxIG, 默认 BUF = 1, 处于 Buffer Read Mode。
W25N01GVxxIT, 默认 BUF = 0,处于 Continous Read Mode。
两种模式可以用过命令切换。

4、写入数据分两步:1. 先把数据传入芯片内部的 2048 字节 RAM 缓冲区。比如通过 Quad Program Data Load (32h) 指令装载数据。 2 执行 Program Execute (10h)。如果只执行第一步,不执行第二步,数据还可以从缓冲区读出来,但是掉电后数据就没有了。

5、在执行 Block Erase,Program Execute等命令前要先执行Write Enable(06h)指令,否则指令不起作用。

参考资料:
百度百科
关于spare area的讨论
W25N01GV 驱动
NAND+Flash坏块管理算法及逻辑层驱动设计

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

NANDFlash-W25N01GVZEIG的学习笔记 的相关文章

  • UDP及TCP通信对比讲解

    概述 TCP是面向连接的协议 也就是说在通信发送数据前 必须和对方建立连接 以数据流的模式传播 传输过程中不会有数据丢失 速率上比UDP要慢不少 适用于对数据准确性要求高 速度可以相对慢的场景 如发送或接收邮件 打电话 微信消息传输等等 U
  • 一看就懂的网络协议五层模型(一)

    我们每天使用互联网 你是否想过 它是如何实现的 全世界几十亿台电脑 连接在一起 两两通信 上海的某一块网卡送出信号 洛杉矶的另一块网卡居然就收到了 两者实际上根本不知道对方的物理位置 你不觉得这是很神奇的事情吗 互联网的核心是一系列协议 总
  • 【VSCode远程调试】【Python】Linux/Ubuntu远程服务器使用plt.show()没有反应

    plt模块结合numpy数组的可视化的常见用法 import matplotlib pyplot as plt img np array 1 2 3 4 plt imshow img plt show 以上写法在linux或者ubuntu系
  • mysql重命名一个表

    使用rename table rename table table1 altered to table 这里的sql语句会将table1 altered 重命名为table rename语句还可以将表移到另一个数据库中 rename tab
  • 14. 函数返回值为引用?

    函数返回值可以是引用吗 当然可以 只是在函数返回引用的时候需要注意几点 以下给出讨论 函数在返回值的时候 会产生一个临时变量作为函数返回值的副本 而函数在返回引用的时候 不会产生副本 那么既然是引用 那么到底是引用谁呢 首先 我们知道要清楚
  • 解决dubbo注册zookepper服务IP乱入问题的三种方式

    最近做一个项目引入了dubbo zookepper的分布式服务治理框架 在应用的发布的时候出现一个怪问题 zookepper服务是起在开发服务器192 168 23 180上 本机起应用服务提供者注册到192 168 23 180上的dub
  • 第一课:k8s介绍安装

    第一课 k8s介绍安装 tags golang 2019尚硅谷 categories K8s 文章目录 第一课 k8s介绍安装 第一节 K8s发展流程 1 1 相关概念 1 2 K8s发展历史 1 3 K8s特点 1 4 课程架构 需要掌握
  • 【廖雪峰python入门笔记】list_倒序访问

    倒序访问list 我们还是用一个list按分数从高到低表示出班里的3个同学 L Adam Lisa Bart 这时 老师说 请分数最低的同学站出来 要写代码完成这个任务 我们可以先数一数这个 list 发现它包含3个元素 因此 最后一个元素
  • MySql中json类型数据的查询以及在MyBatis-Plus中的使用

    表结构和初始数据 新建表结构 CREATE TABLE json test id int NOT NULL AUTO INCREMENT roles json DEFAULT NULL COMMENT 角色 project json DEF
  • Java线程池中哪些事??

    需要提前把线程准备好 创建线程不是直接从系统申请 而是从池子里拿 等到线程不用了 也是还给池子 池子的目的是为了提高效率 线程的创建虽然比进程轻量 但是在频繁创建的情况下 开销也是不可忽略的 则希望还能进一步提高效率 那么 就需要用到线程池
  • gpio 上拉下拉

    每个gpio内部有三种状态 上拉 下拉 不拉 什么时候 需要选择上拉 下拉或不拉呢 1 如果是output 那个一般选择no pull 这样 引脚才能根据你的output数据 进行正确输出 2 如果是input 那么需要看具体应用的默认输入
  • printk函数的用法

    printk在内核源码中用来记录日志信息的函数 只能在内核源码范围内使用 用法和printf非常相似 printk函数主要做两件事情 第一件就是将信息记录到log中 而第二件事就是调用控制台驱动来将信息输出 1 日志级别 printk相比p
  • 设计模式(九)组合模式

    在数据结构中 有树这么一种结构 转换到设计模式中就是组合模式 组合模式的作用就是以统一的方式处理一组具有树形结构的对象 最典型的例子就是菜单项了 一个菜单下可能包括多个菜单项 每个菜单项都可能包含其他子菜单 下面我们来实现菜单项 由于每个菜
  • vector排序问题

    要对vector中的自定义类型进行排序 首先需要提供一个函数bool comp const Interval a const Interval b 来定义类型的排序准则 然后调用std sort intervals begin interv

随机推荐

  • linux下解压zip文件

    linux自带的unzip命令可以解压windows下的zip格式的压缩文件 unzip命令 语法 unzip 选项 压缩文件名 zip 各选项的含义分别为 x 文件列表 解压缩文件 但不包括指定的file文件 v 查看压缩文件目录 但不解
  • pycharm PyQt5报错 Process finished with exit code -1073740791 (0xC0000409) 解决方法

    在写python作业的时候他突然报错了 我觉得我是对的 想法没问题系列 界面也可以出来 是我想象中的样子 但是不能进行交互 所以我怀疑是环境问题或者是什么别的 反正不是我自身原因 蜜汁自信 然后我试了一下老师上课给的例子发现可以运行 我知道
  • GT1030和730哪个好?GT1030与GT730区别对比 (全文)

    对于显卡硬件厂商来说 当属NVIDIA可谓异常活跃 我们知道在游戏领域 N卡一直占据着绝大部分市场 旗下的显卡定位也非常明确 如最新的10系显卡 今年5月份NVIDIA低调发布了定位入门级显卡 GT1030 这款显卡上市之后立马引起了不少玩
  • android图片点击全屏显示,Android浏览图片,点击放大至全屏效果

    近期做一个项目类似于QQ空间 做到照片浏览的功能 对于QQ空间中点击图片放大至全屏 感觉效果非常赞 于是也做了个类似的效果 例如以下 我不知道QQ那个是怎么做的 我的思路例如以下 首先 从图片缩略界面跳转到图片详情页面 应该是从一个Acti
  • 概率论在实际生活的例子_概率论学习笔记

    一 从古典概型开始引入概率论的基本概念 古典概型 全称古典概率模型 也叫等可能模型 是人们最早研究的概率 也是学习概率论的起点 古典概型通过随机实验获得结果 而古典概率研究的问题有两个重要特点 结果有限 可能性一致 1 结果有限 指的是实验
  • C语言以字符形式读写文件

    一 字符读取函数 fgetc 一 函数介绍 fgetc 是 file get char 的缩写 意思是从指定的文件中读取一个字符 函数原型为 int fgetc FILE fp fp 为文件指针 fgetc 读取成功时返回读取到的字符 读取
  • Maven快速搭建GUI项目

    一 eclipse安装好maven插件 并将maven集成到eclipse之后 用maven的archetype 搭建好一个maven archetype queckstart项目的骨架 二 可执行jar文件分为两种 一种是可通过命令行ja
  • 【R语言】实验四 数据分析

    系列文章目录 实验一 R 语言数据结构 数据导入与数据处理 实验二 基本数据处理 实验三 数据可视化 实验四 数据分析 实验五 综合应用 实验数据 实验数据下载 1 hospital data 数据集 数据是关于一些医院的基础信息 数据包含
  • 如何降低APP卸载率?这里有七个方法

    如何降低APP卸载率 这里有七个方法 A A admin 2017 年 1 月 19 日 0 597 次浏览 业内资讯 APP卸载率 现在移动应用市场红海一片 获取用户越来越难 但据了解 更让开发者们为难的是 产品的高卸载率 高卸载率是用户
  • Spring事务及事务失效的部分场景

    简介 spring 有五个事务隔离级别 ISOLATION DEFAULT ISOLATION READ UNCOMMITTED ISOLATION READ COMMITTED ISOLATION REPEATABLE READ ISOL
  • 毕业设计 单片机农业土壤酸度检测系统

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 土壤酸碱度传感器 土壤pH传感器与Arduino的硬件连接 5 软件说明 土壤pH传感器的Arduino代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难
  • Javascript--位运算符

    文章转载自 http www cnblogs com oneword archive 2009 12 23 1631039 html 1 NOT 位运算符NOT由 表示 NOT运算符的实质是对数字求负 然后减1 位运算符NOT是三步的处理过
  • LeetCode(力扣)455. 分发饼干Python

    LeetCode20 有效的括号 题目链接 代码 题目链接 https leetcode cn problems assign cookies 代码 从大遍历 class Solution def findContentChildren s
  • 华为/荣耀 Magicbook/Matebook 开机经常弹出华为智能还原

    问题描述 今年开始 笔者的Magicbook开机时就会弹出华为智能还原 如下所示 检测之后显示是正常的 于是每次都点退出 退出之后就进入了正常的Win10桌面 但是发现 笔记本电脑存在以下问题 有线网络无法连接 网络里面只有无线WiFi可以
  • Nginx教程:配置TCP/IP转发

    安装nginx服务 检查是否编译时带with stream参数 nginx V grep with stream 有with stream参数 可以代理tcp协议 配置nginx的tcp代理 请注意 stream块和http块是两个不同的模
  • python和易语言的脚本哪门更实用?

    前言 每天我们都会面临许多需要高级的编程挑战 你不能用简单的 Python 基本语法来解决这些问题 在本文中 我将分享 13 个高级 Python 它们可以成为你项目中的便捷工具 如果你目前还用不到这些脚本 你可以先添加收藏 以备留用 文末
  • 使用cesium给地图实例添加精灵图图标

    前置条件 1 将精灵图存放在本地文件中 2 拿到对应的声明文件 该文件中存放了每一个类型的地图实例对应的图标在精灵图中的位置 我这里是json文件 这是某一个实例模型对应的数据 我的做法是 系统登录之后 就掉接口获取到该json文件 并存储
  • 云安全技术——Snort安装与配置

    目录 一 Snort简介 二 安装Centos7 Minimal系统 三 基本环境配置 四 安装Snort 五 下载规则 六 配置Snort 七 测试Snort 一 Snort简介 Snort是一个开源的网络入侵检测系统 主要用于监控网络数
  • 二叉排序树的基本操作

    二叉排序树的应用 利用二叉链表存储二叉排序树 输入一组任意序列 实现二叉排序树的创建 插入 删除 中序遍历 要求 有菜单进行选择 安排 2020 6 4 晴朗 二叉排序树的基本定义 1 左子树的所有节点小于根节点 2 若右子树非空 则右子树
  • NANDFlash-W25N01GVZEIG的学习笔记

    文章目录 一 NAND Flash和NOR Flash 二 W25N01GVZEIG引脚说明 三 SPI配置 四 W25N01GVZEIG的架构和寻址 五 W25N01GVZEIG的指令码 六 W25N01GVZEIG各个指令的解析 一 D