W25N01GV 芯片应用

项目中处于成本考虑,要把Nor Flash换成低成本的Nand Flash。

这里总结下芯片应用。

总体概述:

1)W25N01(NandFlash)和W25Q(Nor Flash)的操作大不一样。

NandFlash擦除以块(128KB)为单位,读写以页(2KB)为单位,适合存储大量数据,且明确会产生坏块,需要进行坏块管理。 -- 而Nor Flash擦除单元大小最小为4KB,读写最小单位可以是1字节,更方便处理数据。

2)W25N01有内部2KB缓冲区机制,数据要先写缓冲区,再从缓冲区导入物理地址;读取与之相反。

3)基本指令的实现,都一个鸟样。按照指令表的内容和时序,收发数据即可。

目录

1. 芯片特性

2. 针脚定义

3. 芯片架构

4. 芯片寄存器

5. 芯片指令表

5.1 读取ID

5.2 读写寄存器

5.3 复位&写使能&写失能

5.4 页读取

5.5 页写入

5.6 块擦除

6. 芯片时间参数


1. 芯片特性

见下图,这里简单说下主要特性:

1)W25N01,为1Gbit大小,即128M字节

2)104MHz的标准时钟速度

3)50MB/S的传输速率

4)擦除的最小单位是块,128KB大小

5)读写的最小单位是页,2KB大小。即1G Bit分为 1024个块,每个块64页

2. 针脚定义

1)注意标准SPI和Quad SPI

我们把标准的SPI接口,CS/CLK/MOSI/MISO 称为2线式接口(即数据线只有MOSI和MISO),此外还有Quad SPI接口,它将WP和HOLD复用为数据传输线,称为4线式接口(数据收发从1bit变成2bit)

3. 芯片架构

这是第一个必须要理解的图,很重要,不要跳过请先看懂它

简述下图(框图):

1)Data Buffer,是芯片内部的缓冲区,总共2112字节(分为2048字节 + 64字节)。

        a)其中64字节,是备用区域,一是用于标记坏块,二是用于保存ECC码(纠错码)

        b)2048字节的数据缓冲区。

                在读取时,要先从物理地址读到缓冲区,然后再读取缓冲区。

                在写入时,要先将数据写入缓冲区,再将缓冲区数据写入物理地址。

        c)Column Address CA[11:0],即缓冲区的地址。在读写缓冲区的参数 CA 即表示该值。


2)页地址

        Page Address (PA) [15:0],即页面地址,其高10bit表示块号索引(10bit的最大值为1023),低6bit表示页索引(6bit的最大值为63)。

        标黄的两个参数很重要,后面的寄存器表都会用到这两个参数。

4. 芯片寄存器

寄存器如下3张图,

1)SR1为保护寄存器,地址为0xAx(0xA0),,,一般写0x00关闭保护即可

如果需要保护特定块,需要按照章节 7.4 W25N01GV Status Register Memory Protection 配置保护寄存器。

2)SR2为配置寄存器,地址为0xBx(0xB0),,,一般写0x18即可,即默认使能ECC校验和BUF=1模式

3)SR3为状态寄存器,只读的

        a)其中BUSY位用于判断写、擦除等指令是否结束

        b)FAIL位用于判断写失败和擦除失败

        c)ECC用于判断读取数据是否正确

5. 芯片指令表

这是第二个必须要理解的图,很重要,不要跳过请先看懂它

下面简述下指令表该怎么看:

1)第1列为命令类型

2)第2列OpCode表示操作码,是发送的第一个字节数据(CMD)

3)后序列Byte2/3/4……,表示后续的发送字节

4)实现单个命令功能时,只需要按照该指令表发送字节数据。。

上层的读写功能需要多个命令组合实现……

下面再简述下关键指令:

5.1 读取ID

就以这个命令简述下,每个命令的时序该怎样看:

1)DI一行表示要发送的数据,DO一行表示要接收的数据。

2)只要数据是按照时序图发的就没问题。

3)每一个指令的开始,都要以CS拉低开始,最后1字节发送结束之后马上拉高CS。

对于这个 Read JEDEC ID 命令,可知:

先发送0x9F,再发送Dummy(空字节、数据任意),然后再发送3个字节任意字节数据,对端依次响应3个字节数据。

对于W25N01,回复固定,依次是0xEF,0xAA,0x21。

5.2 读写寄存器

读寄存器:发送0x0F或0x05,再发送寄存器地址,然后读取1字节数据 - 即为寄存器值

写寄存器:发送0x1F或0x01,再发送寄存器地址,然后发送1字节数据 - 即为寄存器设定值

5.3 复位&写使能&写失能

CS拉低,发1字节,CS再拉高,结束。

复位是0xFF,控制芯片复位。

写使能0x06,在写缓冲区、块擦除之前,必须要先写使能。使能之后状态寄存器会置位bit1。

写失能0x04,恢复写保护。

5.4 页读取

基本操作概述:

1)先发送0x13指令,将指定物理地址的数据读到内部缓冲区;

        先发送0x13,再发送0x00,发送页地址PA的高8位,最后发送页地址PA的低8位。

        发完结束,等待完成即可。

2)再发送0x03指令,将缓冲区的数据读到用户的Buff中;

        先发送0x03,发送列地址CA的高8位,然后发送列地址CA的低8位,最后发送0x00。

        发完结束,等待完成即可。

3)读取完毕之后,检查状态寄存器的ECC校验位,判断是否读取正确。

下面是我的可用代码:

uint8_t W25N01_PageRead(uint16_t blocks, uint16_t pages, uint8_t *Buff)
{uint16_t PA = (blocks << 6) + (pages & 0x3F);SPI_FLASH_CS_LOW();SpiReadWriteByte(0x13);SpiReadWriteByte(0x00);SpiReadWriteByte((uint8_t)(PA>>8));SpiReadWriteByte((uint8_t)(PA&0xFF));SPI_FLASH_CS_HIGH();HAL_Delay(1);SPI_FLASH_CS_LOW();SpiReadWriteByte(0x03);SpiReadWriteByte(0x00);SpiReadWriteByte(0x00);SpiReadWriteByte(0x00);SpiFlashReceive(Buff, 2048);SPI_FLASH_CS_HIGH();if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) & 0x30) >= 0x20)return W25N01XX_FAIL;return W25N01XX_OK;
}

5.5 页写入

1)Buff写缓冲区

        必须先发送0x06写使能命令

        再发送0x02命令,发送2个 0x00,然后传输2048字节数据

2)缓冲区写物理地址

        先发送0x10,发送0x00,

        然后发送页地址PA的高8位,最后发送页地址PA的低8位,结束,

        等待传输完成

下面是我的可用代码:

uint8_t W25N01_PageWrite(uint16_t blocks, uint16_t pages, uint8_t *Buff)
{uint16_t PA = (blocks << 6) + (pages & 0x3F);W25N01_WriteEnable();HAL_Delay(1);SPI_FLASH_CS_LOW();SpiReadWriteByte(0x02);SpiReadWriteByte(0x00);SpiReadWriteByte(0x00);SpiFlashTrans(Buff, 2048);SPI_FLASH_CS_HIGH();HAL_Delay(1);SPI_FLASH_CS_LOW();SpiReadWriteByte(0x10);SpiReadWriteByte(0x00);SpiReadWriteByte((uint8_t)(PA>>8));SpiReadWriteByte((uint8_t)(PA&0xFF));SPI_FLASH_CS_HIGH();W25N01_WaitBusy();if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) & FLASH_SR_WRITE_FAIL)== FLASH_SR_WRITE_FAIL)return W25N01XX_FAIL;return W25N01XX_OK;
}

5.6 块擦除

必须先发送0x06写使能命令

然后发送0xD8,发送0x00,然后发送页地址PA的高8位,最后发送页地址PA的低8位,结束,

等待擦除完成

uint8_t W25N01_BlockErase(uint16_t blocks, uint16_t pages)
{uint16_t PA = (blocks << 6) + (pages & 0x3F);W25N01_WriteEnable();HAL_Delay(1);SPI_FLASH_CS_LOW();SpiReadWriteByte(0xD8);SpiReadWriteByte(0x00);SpiReadWriteByte((uint8_t)(PA>>8));SpiReadWriteByte((uint8_t)(PA&0xFF));SPI_FLASH_CS_HIGH();W25N01_WaitBusy();if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) & FLASH_SR_ERASE_FAIL)== FLASH_SR_ERASE_FAIL)return W25N01XX_FAIL;return W25N01XX_OK;
}

6. 芯片时间参数

其中,

tRD表示读操作的时间,最大60us,最快7us

tPP表示写操作的时间,最大700us

tBE表示擦除操作的时间,最大10ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外包干了3年,技术退步明显。。。

前言 简单说下我的情况吧&#xff01;普通本科的科班生&#xff0c;19年的时候通过校招进了一家小自研&#xff0c;工资还凑合&#xff0c;在里面带了一年多&#xff0c;公司没了&#xff0c;疫情期间找工作很麻烦&#xff0c;后面就开始自己近3年的外包生涯&#xff0c;这三年…

如果你找不到东西,请先确保你在正确的地方寻找

之前我们在几篇文章中描述了如何进行”思想”调试&#xff0c;今天的文章我将不会这样做。 因为下面的编程错误大部分人都会遇到&#xff0c;如果你看一眼下面的代码&#xff0c;你不会发现有什么问题&#xff0c;这仅仅是因为你的的大脑只给你希望看到的&#xff0c;而不是那…

多线程 (上) - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

seaborn库图形进行数据分析(基于tips数据集)

Seaborn 是一个基于 matplotlib 的数据可视化库&#xff0c;可以用来绘制各种统计图表&#xff0c;包括散点图、条形图、折线图、箱线图等。Seaborn 提供了一些用于美化图表的默认样式和颜色主题&#xff0c;使得生成的图表更具有吸引力。下面是一些 Seaborn 库的常用功能和用法…

TrustGeo代码理解(六)utils.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入常用库和模块 from __future__ import print_function from distutils.version import LooseVersion from matplotlib.scale import LogisticTransform import numpy as np import torch import warnings import t…

《Linux C编程实战》笔记:文件读写

Linux c下文件读写可用creat&#xff0c;open&#xff0c;close&#xff0c;read&#xff0c;write&#xff0c;lseek等函数。对于跨平台的程序还是用C标准库的fopen等。 open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open …

Linux——进程创建与进程终止

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程创建1、fork函数初识2、fork函数返回值3、写时拷贝4、fork常规用法5、fork调用失败的…

【产品经理】产品增效项目落地,项目反哺产品成长

产品和项目是相辅相成的关系&#xff0c;产品的规范、成熟&#xff0c;为项目的快速落地提供支撑&#xff0c;项目的落地反哺产品&#xff0c;促进产品的成长成熟。 软件工程的初期是&#xff0c;我们需要什么&#xff0c;就立项项目&#xff0c;通过项目实现需要。 随着项目的…

什么是前端国际化(internationalization)和本地化(localization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Python+Yolov8+onnx-deepsort方法物体人流量识别统计

程序示例精选 PythonYolov8onnx-deepsort方法物体人流量识别统计 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonYolov8onnx-deepsort方法物体人流量识别统计》编写代码&#xff0c;…

Oracle(2-15)RMAN Incomplete Recovery

文章目录 一、基础知识1、The Procedure 不完全恢复步骤2、UNTIL TIME Example 基于时间的恢复3、UNTIL SEOUENCE Example 基于序列的恢复4、什么是RMAN的不完全恢复 二、基础操作1、不完全恢复准备工作2、不完全恢复开始恢复 RMAN Incomplete Recovery RMAN的不完全恢复 目标&…

翻译: 工作使用ChatGPT的例子 Day-to-day usage of web UI LLMs

本周&#xff0c;我们将首先探讨生成型AI在商业中的作用&#xff0c;然后是其对社会的影响&#xff0c;例如对就业的影响。我们将从探讨如何在日常工作中使用网络用户界面访问生成型AI开始&#xff0c;然后再看看如何系统地分析一个企业&#xff0c;以识别使用生成型AI增强或自…

二叉搜索树的实现

本文旨在讲解如何编写一颗二叉搜索树&#xff0c;包括基本的增删查改的操作。 目录 一、二叉搜索树的概念 ​编辑二、二叉搜索树的编写 2.1节点的编写 2.2节点的插入 2.3节点的查找 2.4节点的删除 三、二叉搜索树的应用 四、 二叉搜索树的性能分析 五、完整代码 一、…

labelme标注json文件检查标注标签(修改imageWidth,imagePath,imageHeight)

# !/usr/bin/env python # -*- encoding: utf-8 -*- #---wzhimport os import json# 这里写你自己的存放照片和json文件的路径 json_dir =rC:\Users\Lenovo\Desktop\json3 json_files = os.listdir(json_dir

Java解决最小路径和

Java解决最小路径和 01 题目 给定一个包含非负整数的 *m* x *n* 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3…

Vue3报错: ‘defineProps‘ is not defined,解决方法

问题出现: 今天在使用 <script setup>组合式 API 的语法糖的时候&#xff0c;定义defineProps时候报错&#xff1a; ‘defineProps’ is not defined 查了一下资料&#xff0c;这是因为eslint的语法校验导致的问题。 解决方法1&#xff1a; 在项目根目录的文件.eslin…

大模型词向量:解析语义,助你成为沟通达人

文章目录 一、向量二、如何把词转换为向量三、如何把词转换为向量进阶 三、如何让向量具有语义信息 大家好&#xff0c;我是脚丫先生 (o^^o) 在研究大模型的时候&#xff0c;有一篇文章写得非常通俗易懂。 之前在其他地方不是怎么看懂&#xff0c;但是在这里懂了&#x1f604;…

flowable工作流看这一篇就够了(高级篇 下)

目录 三、候选人和候选人组 3.1、候选人 3.1.1、定义流程图 3.1.2、部署和启动流程实例 3.1.3、任务的查询 3.1.4、任务的拾取 3.1.5、任务的归还 3.1.6、任务的交接 3.1.7、任务的完成 3.2、候选人组 3.2.1、管理用户和组 用户管理 Group管理 为用户分配组 3.2…

深入理解网络 I/O:单 Group 混杂模式|多 Group 主从模式

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Linux 常用的操作命令

我们习惯的使用Windows,安装软件进行使用&#xff0c;比如 WPS&#xff0c;浏览器&#xff0c;一些工具&#xff0c;但是在Linux上就需要用命令去操作&#xff0c;也可以使用像Ubuntu 和 CentOS这类的可视化面板 Linux系统是开源的&#xff0c;所以开发人员可以反复的发现Bug以…