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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-反转链表问题

1.反转链表 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路&#xff1a; 反转链表也就是链表倒置&#xff0c;我一直以来的办法就是先建立一个头节点&#xff0c;之后再遍历链表来进行头插。 代码&#xff1…

HBuilderX 配置 夜神模拟器 详细图文教程

在电脑端查看App的效果&#xff0c;不用真机调试&#xff0c;下载一个模拟器就可以了 --- Nox Player&#xff0c;夜神模拟器&#xff0c;是一款 Android 模拟器。他的使用非常安全&#xff0c;最重要的是完全免费。 一. 安装模拟器 官网地址&#xff1a; (yeshen.com) 二.配…

也许你不需要人工智能

已经不记得我是什么时候开始使用谷歌搜索引擎的&#xff0c; 在刚开始的时候&#xff0c;我看到了一本书&#xff0c;里面有各种各样的搜索技巧。在考虑到如果我不会搜索引擎这种关键技能&#xff0c;那么我将在这个信息时代落后&#xff0c;我读了那本书。 从那本书中我学到了…

运行软件时提示msvcp140.dll丢失的5个解决方法

电脑打开软件提示找不到msvcp140.dll丢失&#xff0c;这是许多用户在使用电脑过程中会遇到的问题。本文将为您介绍五个详细的解决方法&#xff0c;以及msvcp140.dll丢失的原因、作用和是什么。 一、msvcp140.dll丢失原因 系统损坏&#xff1a;操作系统在使用过程中&#xff0…

使用SPSS的McNemar检验两种深度学习模型的差异性

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 使用SPSS的McNemar检验两种深度学习模型的差异性 前言简述&#xff1a;一、McNemar检验1.1来源1.2 两配对样本的McNemar(麦克尼马尔)变化显著性检验1.3 适用范围&#xff1a;…

机器学习之无监督学习

聚类&#xff1a;发掘纵向结构的某种模式信息&#xff0c;某些x属于相同的分布或者类别 特征学习&#xff1a;发掘横向结构的某种模式信息&#xff0c;每一行都可以看成是一种属性或特征 密度估计&#xff1a;发掘底层数据分布&#xff0c;x都是从某个未知分布p(x)采出来的&a…

Mysql数据库 19.Mysql 锁

MySQL锁 锁&#xff1a;锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制&#xff0c;在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源&#xff0c;如何保证数据并发访问的一…

C#中的封装、继承和多态

1.引言 在面向对象的编程中&#xff0c;封装、继承和多态是三个重要的概念。它们是C#语言中的基本特性&#xff0c;用于设计和实现具有高内聚和低耦合的代码。本文将详细介绍C#中的封装、继承和多态的相关知识。 目录 1.引言2. 封装2.1 类2.2 访问修饰符 3. 继承4. 多态4.1 虚方…

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核&#xff0c;其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1)&#xff0c;但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例&#xff0c;其输入频率FCLKIN50MHz&#xff0c;要输出80MHz&am…

鸿蒙原生应用/元服务开发-Stage模型能力接口(三)

一、说明 AbilityLifecycleCallback模块提供应用上下文ApplicationContext的生命周期发生变化时触发相应回调的能力&#xff0c;包括onAbilityCreate、onWindowStageCreate、onWindowStageActive、onWindowStageInactive、onWindowStageDestroy、onAbilityDestroy、onAbilityFo…

一文弄懂自编码器 -- Autoencoders

1. 引言 近年来&#xff0c;自编码器&#xff08;Autoencoder&#xff09;一词在许多人工智能相关的研究论文、期刊和学位论文中被频繁提及。自动编码器于1980年推出&#xff0c;是一种用于神经网络的无监督学习技术&#xff0c;可以从未被标注的训练集中学习。 本文重点介绍…

指针进阶篇

指针的基本概念&#xff1a; 指针是一个变量&#xff0c;对应内存中唯一的一个地址指针在32位平台下的大小是4字节&#xff0c;在64位平台下是8字节指针是有类型的&#xff0c;指针类型决定该指针的步长&#xff0c;即走一步是多长指针运算&#xff1a;指针-指针表示的是两个指…

协方差和相关系数,还有信号与系统里的 互相关函数

协方差和相关系数参考&#xff1a;https://www.bilibili.com/video/BV1vK411N7Yp/ 协方差和相关系数的思想就是&#xff1a;同增同减&#xff0c;找相关的变量 协方差公式是如下图老师的板书 可以发现&#xff0c;当 X Y 同增同减趋势明显时&#xff0c;协方差的值就越大 所…

STM32_启动流程详解

目录标题 前言 启动流程概述复位中断函数详解SystemInit函数详解 __main函数详解 附录 stm32单片机的存储器映像中断向量表的映射 前言 最近在学习IAP远程OTA升级单片机固件程序&#xff0c;发现自己对单片机的启动流程还不是那么了解&#xff0c;就总结整理一下吧。 启动流程…

记录一次API报文替换点滴

1. 需求 各位盆友在日常开发中&#xff0c;有没有遇到上游接口突然不合作了&#xff0c;临时需要切换其他接口的情况&#xff1f;这不巧了&#xff0c;博主团队近期遇到了&#xff0c;又尴尬又忐忑。 尴尬的是临时通知不合作了&#xff0c;事前没有任何提醒&#xff1b; 忐忑…

位图、布隆过滤器、海量数据处理

文章目录 位图布隆过滤器海量数据处理 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 位图 概念&#xff1a;所谓位图&#xff0c;就是用每一…

【Spring】08 BeanNameAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一就是 Bean 生命周期中的回调接口。本文将聚焦于其中的一个接口 BeanNameAware&#xff0c;介绍它的作…

深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。

问题描述&#xff1a;深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。 问题解答&#xff1a; 目标框&#xff08;Bounding Box&#xff09;&#xff1a; 描述目标位置的矩形边界框。 类别标签&#xff1a; 表示模型认为目标属于哪个类别&#xff08;例如&#…

opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代码…

[Verilog] 设计方法和设计流程

主页&#xff1a; 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法&#xff08;top-down&#xff09;。设计流程是指从一个项目开始从项目需求分析&#xff0c;架构设计&#xff0c;功能验证&#…