W25N01GV 芯片应用

news2024/11/14 19:53:25

项目中处于成本考虑,要把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.coloradmin.cn/o/1315947.html

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

相关文章

计算BMI指数-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第19讲。 计算BMI指数&…

【TB作品】基于单片机的机械通风控制系统,实时温度和二氧化碳浓度

硬件&#xff1a; &#xff08;1&#xff09;51系列单片机&#xff0c;拟采用STC89C52RC&#xff1b; &#xff08;2&#xff09;DS18B20温度传感器&#xff1b; &#xff08;3&#xff09;二氧化碳浓度传感器&#xff1a;https://item.taobao.com/item.htm?spma21n57.1.0.0.1…

DS八大排序之冒泡排序和快速排序

前言 前两期我们已经对"插入排序"&#xff08;直接插入排序和希尔排序&#xff09; 和 "选择排序"&#xff08;直接选择排序和堆排序&#xff09;进行了详细的介绍~&#xff01;这一期我们再来详细介绍一组排序 &#xff1a;"交换排序"即耳熟能…

lv12 uboot移植深化 9

u-boot-2013.01移植 【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1 建立自己的平台 1.…

在线客服系统定价因素解析:影响价格的关键因素

跨境电子商务公司必不可少的工具就是在线客服系统。企业选择在线客服系统的时候免不了要对不同产品的功能性、价格、服务等因素进行考量。今天这篇文章&#xff0c;我们就来探讨一下在线客服系统的定价因素有哪些&#xff1f;探究市面上的在线客服系统价格各异的影响因素。为大…

libp2p 快速开始

文章目录 第一部分&#xff1a;libp2p 快速入门一、什么是libp2plibp2p 发展历程libp2p的特性p2p 网络和我们熟悉的 client/server 网络的区别&#xff1a; 二、Libp2p的实现目标三、Libp2p的用途四、运行 Libp2p 协议流程libp2p 分为三层libp2p 还有一个局域网节点发现协议 mD…

27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频

针对高清晰度的模拟信号摄像头视频画面的显示需求&#xff0c;迪文特推出27系列DGUS智能屏。该系列智能屏可适配常见的AHD摄像头、CVBS摄像头&#xff0c;支持单路1080P高清显示、两路720P同屏显示&#xff08;同一类型摄像头&#xff09;。用户通过DGUS简单开发即可实现摄像头…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解&#xff1a;流程总结&#xff1a;条件匹配解释&#xff1a;其他解释&#xff1a; SpringBoot 自动装配原理 源码流程详解&#xff1a; 1、先看启动类&#xff0c;启动这个main方法&#xff0c;然后调用这个run方法。 2、把 启动类作…

一文了解Tomcat

文章目录 1、Tomcat介绍2、Tomcat使用配置2.1、Tomcat下载启动2.2、Tomcat启动乱码2.3、Tomcat端口号修改 3、Tomcat项目部署4、IDEA中使用Tomcat方式 1、Tomcat介绍 什么是Tomcat ​ Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级web服务器&#x…

Networkx实现小世界网络的分析

Networkx实现小世界网络的分析 小世界网络 小世界现象&#xff0c;也被称为六度分离原则&#xff0c;即如果你在地球上的任何地方随便选择任何两个人&#xff0c;你会发现一条至多由他们之间的6个熟人形成的路径。在网络科学语言中&#xff0c;六度也被称为小世界性质&#x…

C++相关闲碎记录(16)

1、正则表达式 &#xff08;1&#xff09;regex的匹配和查找接口 #include <regex> #include <iostream> using namespace std;void out (bool b) {cout << ( b ? "found" : "not found") << endl; }int main() {// find XML/H…

【C++干货铺】继承后的多态 | 抽象类

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 多态的概念 多态的定义和实现 多态的定义条件 虚函数 虚函数的重写 特殊情况 协变&#xff08;基类和派生类的虚函数返回值不同&#xff09; 析构函数的重…

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

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

分数约分-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第20讲。 分数约分&#xf…

算法模板之单链表图文讲解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️使用数组模拟单链表讲解1.1 &#x1f514;为什么我们要使用数组去模拟单链表…

appium2.0.1安装完整教程+uiautomator2安装教程

第一步&#xff1a;根据官网命令安装appium&#xff08;Install Appium - Appium Documentation&#xff09; 注意npm前提是设置淘宝镜像&#xff1a; npm config set registry https://registry.npmmirror.com/ 会魔法的除外。。。 npm i --locationglobal appium或者 npm…

多线程 (上) - 学习笔记

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

Element-Ui定制Dropdown组件

1.效果 说明&#xff1a;移入后新增图标&#xff0c;然后移入后图标变色。当然大家可以想到用mouseover移入事件来实现移入颜色的变化&#xff0c;但是在使用Dropdown组件的时候&#xff0c;不支持这种写法。因此采用了原生的遍历对象的形式&#xff0c;为每一个item对象绑定鼠…

通过WinCC基本功能实现批次查询及批次报表

谈到WinCC中的批次数据处理和批次报表&#xff0c;也许有人会想到PM-Quality这款专业的批次报表软件。但如果你的银子有限&#xff0c;批次报表要求又比较简单&#xff0c;不妨看看此文。 —《通过 WinCC 基本功能实现批次数据过滤查询以及打印批次数据报表》 实现的功能描述 …