关于STM32F405驱动华邦W25N01GVZE1G的简介与驱动代码

W25N01G简介

常用flash可分为NOR flash和NAND flash等。比如华邦(winbond)的W25Qxx系列的flash就是NOR系列的,本篇所讲述的W25N01G就是NAND flash系列的。

通过上图可以看到该flash的驱动方式和最高clk频率。这篇文章主要是基于标准SPI的驱动方式,下面就是此次教程的芯片封装和引脚分配。

引脚分配的说明:

1、/CS(Clip Select) :片选线

2、DO(Serial Data Output(Data Input Output 1)) :串行数据输出线

3、/WP(Write Protect Input (Data Input Output 2)) :写数据保护线

4、GND :地线

5、DI(Serial Data Input(Data Input Output 0)) :串行数据输入线

6、CLK(Serial Clock) :时钟线

7、/Hold(Hold Input (Data Input Output 3)) :数据输入保持线

8、VCC :电源输入

~~下面介绍W25N01G的架构和寻址~~

这部分是重点也是难点!!!

从上面两图可以看出,W25N01G的寻址方式是页地址+列地址(Page Add + Column Add),即下图红框中的部分:

它的列地址大小为2112Byte,由2048Byte的数据缓冲区和64Byte的备用区域(Spare Area)组成。

它的页地址大小1024 x 64 x 2KB,即该flash共有1024个块(Block),每个块包含64页(Page),每页大小为2KB。(对应flash的大小,1024x64x2/1024=128M)

由于NAND Flash在设定上存在坏块,所以就有Spare Area,它被用于标记坏块(bad block)和保存对MainArray中main区的ECC码(Error Checking and Correcting,纠错码)。

W25N01G读写前的必要配置

上图是设备操作流程,其中BUF、ECC-E的状态会影响选择哪种读取数据的方式Continuous Read或是Buffer Read,这在后面的指令码选择会有用。注意上图紫色方框,读写缓冲区是需要一定的时间的!!

W25N01GV为读取操作提供了两种不同的模式,缓冲读取模式(BUF=1)和连续读取模式(BUF=0)。在进行任何读操作之前,需要一个页数据读命令来启动从内存数组中的指定页到数据缓冲区的数据传输。默认情况下,在电源启动后,第0页中的数据将自动加载到数据缓冲区中,设备已准备好接受任何读命令。

缓冲区读模式(BUF=1)需要一个列地址来开始输出数据缓冲区内的现有数据,并且一旦到达数据缓冲区的末端(字节2,111),DO (IO1) pin将变为high-Z状态。

连续读取模式(BUF=0)不需要起始列地址。设备总是从数据缓冲区的第一列(字节0)开始输出数据,一旦到达数据缓冲区的末尾(字节2,048),数据将进入下一个内存页继续输出。在连续读取模式下,可以使用单个读命令读取整个内存阵列。

接下来就是重头戏了,配置SPI和读写flash:

如上图,标准的SPI指令使用DI输入引脚将指令、地址或数据串行地写入CLK上升沿上的设备。DO输出引脚用于从CLK下降沿上的设备读取数据或状态。支持SPI总线操作模式0(0,0)和3(1,1)。模式0和模式3的主要区别在于CLK的电平,当SPI总线主设备处于待机且数据没有被传输时,对于模式0,CLK信号通常在/CS的下降和上升边缘处是低电平状态的;对于模式3,CLK信号通常在/CS的下降和上升边缘处是高电平状态的。

接下来配置一些必须的寄存器,解除flash的保护状态,看芯片手册可知,W25N01GV提供三个状态寄存器:保护寄存器(SR-1)、配置寄存器(SR-2)和状态寄存器(SR-3)。每个寄存器分别由读状态寄存器和写状态寄存器命令以及1字节寄存器地址访问。读写状态寄存器的命令为 05h 或 0Fh。下面开始介绍这三个寄存器:

1、保护寄存器(SR-1)

如上图,S7-S2为块保护位,主要提供写保护控制和状态。块保护位上电后的默认值是1,以保护整个flash。如果配置寄存器(SR-2)中的SR1-L位被设置为1,那么其默认值将是OTP锁定的值。WP-E(S1)是写保护启用位,它与SRP1和SRP0(S0)配合使用,用来控制写保护的方式:软件保护或者硬件保护,当WP-E = 0(默认值)时,设备处于软件保护模式,当WP-E = 1时,设备处于硬件保护模式。具体请看手册。

2、配置寄存器(SR-2)

在SR2中,OTP-L(S7)位主要是锁定OTP区域,设置为1,整个OTP区域将被锁定,以防止数据被更改。如果要使用OPT区域,OPT-E(S6)位必须设置为1,以便使用标准的程序/读取命令来访问OTP区域以及读取唯一的ID或参数页信息,该位开机或复位命令后的默认值为0。SR1-L(S5)位用于OTP锁定保护寄存器(SR-1)中的值。ECC-E(S4)位作用是选择是否启用ECC算法,上电和复位后默认为1,启用算法。BUF(S3)位为读取操作选择位,对应上面说的设备操作流程,及缓冲读取模式(BUF=1)和连续读取模式(BUF=0)。其模式选择对照表如下:

3、状态寄存器(SR-3)

SR3都是一些只读位,表示了当前flash的一些状态。LUT-F(S6)位表示20个内存块链接是否被充分利用。LUT-F的默认值是0,一旦使用了所有20个链接,LUT-F将变成1,并且不能建立更多的内存块链接。在NAND闪存中使用ECC函数来纠正读取操作期间有限的内存错误,ECC状态位(ECC-1、ECC-0)应该在读取操作完成后进行检查,以验证数据的完整性。ECC状态位的值不关心ECC- e是否等于0,因为一个电源周期或复位命令后,这些位将被置0。P-FAIL(S3)和E-FAIL(S2)位主要用于指示内部控制的编程或擦除操作是否成功执行,这两个位将在程序执行或块擦除指令以及设备复位指令开始时被清除。WEL(S1)位为写使能指示位,它在执行写使能指令后被设置为1。当设备写被禁用时,WEL状态位被清除为0。写禁用状态发生在电源启动时或以下任何指令之后:写禁用,程序执行,块擦除,页数据读取,程序执行和OTP页的坏块管理。BUSY(S0)位为忙检测位,当设备正在通电或执行数据读写时,该位被置1,空闲时被清0。

设置好这些寄存器,就可以开干了。

**

W25N01GV常用命令表

**

W25N01GV常用命令如上图所示。

**

W25N01GV读写示例

**

我们以读取设备ID为例,先看时序图:

具体操作步骤如下:

1、/CS拉低,选中IC

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拉高,退出

上代码

/***********************************************************************************************

** name: W25_ReadID

** function: 读取芯片ID

**parameter: void

** return: 返回值如下:

0XAA21,表示芯片型号为W25N01GV

** date: 2019/8/27

** create: @曼珠沙华

************************************************************************************************/

u16 W25_ReadID(void){

u32 Temp = 0;

FLASH_CS = 0;

SPI1_ReadWriteByte(W25X_JedecDeviceID); //发送读取ID命令

SPI1_ReadWriteByte(0x00);

Temp |= SPI1_ReadWriteByte(0xFF) << 16;

Temp |= SPI1_ReadWriteByte(0xFF) << 8;

Temp |= SPI1_ReadWriteByte(0xFF);

FLASH_CS = 1;

return Temp;

}

就是这么简单的哟。

**

使用过程中遇到的问题总结

**

1、在编写程序时要注意列地址(Column Address)和页地址(Page Address)的组合及搭配,我在程序中将它们分离开了。

2、在读写的时候要注意,因为写入数据需要两步,先写缓冲,再写flash。有缓冲区的存在,要先写入缓冲区,再执行写入flash指令,要有一定的延时时间,不然会写不进去或者读不出来数据。

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

比如写数据代码:

/***********************************************************************************************

** name: W25_WriteData

** function: SPI在一页(0~65535)内写入少于256个字节的数据

在指定地址开始写入最大256字节的数据

**parameter: pBuffer 数据存储区

BytesAddr 写入的具体字节地址(0-1023)

BlockAddr 写入的块地址(0-1023)

PageAddr 写入的页地址(0-63)

NumByteToWrite 要写入的数据个数(0-65535),该数不应该超过该页的剩余字节数!!!

** return: void

** date: 2019/8/27

** create: @曼珠沙华

************************************************************************************************/

void W25_WriteData(u8* pBuffer,u16 BytesAddr, u16 BlockAddr, u8 PageAddr,u16 NumByteToWrite){

W25_Write_Enable(); //SET WEL

delay_xms(20);

W25_WriteBuff(BytesAddr,pBuffer,NumByteToWrite); //先写到buff

delay_xms(20);

FLASH_CS = 0; //使能器件

SPI1_ReadWriteByte(W25X_ProgramExecute); //发送写命令

SPI1_ReadWriteByte(0); //8-bit dummy clocks

SPI1_ReadWriteByte((u8)((BlockAddr >> 2) & 0xFF)); //发送16bit地址

SPI1_ReadWriteByte((u8)((BlockAddr << 6) | PageAddr) & 0xFF);

FLASH_CS = 1; //取消片选

W25_Wait_Busy(); //等待写入结束

W25_Write_Disable();

delay_xms(20);

}

/***********************************************************************************************

** name: W25_WriteBuff

** function: 将数据写入W25的数据缓冲区,数据不超过2048byte

**parameter: CA_add 写入的具体字节地址(0-2047)

pBuffer 欲写入的数据地址

NumByteToWrite 要写入的数据个数(0-65535),该数不应该超过该页的剩余字节数!!!

** return: void

** date: 2019/8/29

** create: @曼珠沙华

************************************************************************************************/

void W25_WriteBuff(u16 CA_add,u8 *pBuffer,u16 NumByteToWrite){

u16 i;

FLASH_CS = 0; //使能器件

SPI1_ReadWriteByte(W25X_PageProgram); //发送写缓冲区命令

SPI1_ReadWriteByte((u8)((CA_add >> 8) & 0x07)); //发送16bit地址

SPI1_ReadWriteByte((u8)CA_add & 0xFF);

for(i = 0; i < NumByteToWrite; i++){

SPI1_ReadWriteByte(pBuffer[i]); //循环写数

}

FLASH_CS = 1; //取消片选

}

写入是要两步的,一定要有延时。

以上都是我个人的一些总结,如有错误,还请各位大佬多多指正,感谢。

最后,附上驱动代码,没有带坏块管理的,就是普通驱动代码、SPI的配置代码和芯片手册:

https://download.csdn.net/download/cxieyunsky/12258945

----------------------------------------------------------------------------------------------------------2020/3/20

-----------------------------------------------------------------[email protected]

w25n01g 代码_STM32F405驱动华邦W25N01G简介与demo相关推荐

  1. w25n01g 代码_W25N01GV 驱动

    最近在项目中用到 W25N01GV 这颗芯片.它是华邦公司的大容量 SPI 接口 Nand Flash,有 1Gbit (128M Bytes)大小,价格也不高.但是在网上找了很久也没找到相关的驱动代 ...

  2. linux内核支持多串口,基于华邦W90P710处理器的Linux内核应用及串口驱动的实现

    嵌入式Linux是一种很受欢迎的操作系统,具有开放源码.不存在黑箱技术.内核小.功能强大.运行稳定.效率高.易于定制裁减等特点[1],广泛应用于工控产品.很多工控产品需要和外部设备进行信息交换,而串口 ...

  3. linux串口驱动及应用程序,基于华邦W90P710处理器的Linux内核应用及串口驱动的实现-嵌入式系统-与非网...

    嵌入式Linux是一种很受欢迎的操作系统,具有开放源码.不存在黑箱技术.内核小.功能强大.运行稳定.效率高.易于定制裁减等特点[1],广泛应用于工控产品.很多工控产品需要和外部设备进行信息交换,而串口 ...

  4. WINBOND/华邦 W25Qxxx调试笔记

    项目场景: 项目中原来使用华邦W25Q128芯片,后因为flash容量续替换为W25Q256芯片.Bootloader使用自己分装的对W25Q128驱动程序,APP程序使用armink提供SFUD框架 ...

  5. 华邦存储器W25Q80, W25Q16, W25Q32系列的spi通讯

    华邦存储器W25Q80, W25Q16, W25Q32系列与stm32f1系列单片机的spi通讯 2020.4.9 spi通讯在配置好之后一定要开启spi使能,和串口的配置是一样的 2020.4.13 ...

  6. Openwrt读取spi-nand协议Flash芯片UniqueID(华邦为例)

    Flash芯片一般都有一个出厂时由制造商设定的Unique ID,唯一ID.获取到可以用来进行各类加密识别认证,作为设备唯一ID的一种. 本文以华邦品牌的flash芯片为例(W25N01GV.W25M ...

  7. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  8. 华邦电子2022年3月营收为新台币92.17亿元

    4月10日消息,华邦电子股份有限公司近日公布自行结算的2022年3月份营收报告.华邦含新唐科技等子公司,3月份合并营收为新台币92.17亿元,较上个月增加7.10%,较去年同期增加15.69%.累计2 ...

  9. 华邦电子2022年1月营收为新台币86.90亿元

    2月12日消息,华邦电子股份有限公司近日公布自行结算的2022年1月份营收报告.华邦含新唐科技等子公司,1月份合并营收为新台币86.90亿元,较上个月增加0.97%,较去年同期增加25.89%. 20 ...

最新文章

  1. oracle ORACLE_SID使用上的意义
  2. Unicode字段也有collation
  3. 从 2017 ChinaJoy 谈起,中国游戏如何数据化前行
  4. javascript——原型与原型链
  5. 超全的Android组件及UI框架
  6. OpenCV 之 直方图处理
  7. Open*** 安装脚本
  8. 重置Oracle密码
  9. DevEco Studio 切换黑色界面(两步搞定)
  10. 9.Shell 编程从入门到精通 --- 进程
  11. 拓端tecdat|R语言中Gibbs抽样的Bayesian贝叶斯简单线性回归
  12. jquery学习之$(document).ready()
  13. Maven下载安装旧版本
  14. oppo系统android版本下载,oppo手机助手
  15. 如何用流程图描述算法?
  16. 关于公共安全解决方案的思考
  17. python打开setting_Python3 - setting的默认配置和用户配置读取
  18. OpenAI 最强对话模型 ChatGPT 注册使用笔记
  19. windows如何截屏
  20. AIX上解压缩.tar.Z, .tar.gz, .zip

热门文章

  1. 使用camera2构建相机应用
  2. 04-Python之文件、异常和模块
  3. 收藏!!「自然语言处理(NLP)」全球学术界知名学者教授信息大盘点(全)!
  4. iphone刷linux教程视频,「干货」 iPhone 刷 Android10 详细教程来了
  5. OpenGL红宝书:第一个渲染程序Triangles常见问题归总
  6. 小程序内使用绝对路径
  7. 基于java(springboot)大学生体质测试管理系统(java毕业设计)
  8. 感谢众位豪杰不避凶 水浒
  9. Adobe Photoshop 22.3原生支持苹果 M1 Mac
  10. javascript:解决两个小数相乘出现无限小数