您的位置 首页 新能源

STM32单片机对NAND Flash的读写以及在ASF中的运用

STM32单片机对NAND Flash的读写以及在ASF中的使用-NAND Flash的容量较大。整片Flash分为若干个块(Block),每个Block分为若干个页(Page)。在每个页中,除了数据区域,也包含若干“多余”的区域,用来进行ECC等操作。在进行擦除操作是,基本单位是“块”;而编程的基本单位是“页”。

这次大约介绍了一下NAND Flash,以及在ASF中运用它的办法。

一、 接线

这个开发板搭载了一个256 MB,8位的NAND Flash(MT29F2G08ABAEA)。引脚接线如下:

STM32单片机对NAND Flash的读写以及在ASF中的运用

偷个懒,直接上引脚复用的图。其间PC14标明该NAND FLASH需求作为SMC的外设0运用。经过运用NANDOE和NANDWE引脚阐明需求运用芯片的NAND Flash操控逻辑。别的,PC18复用为输入引脚,用以查询芯片的状况。

STM32单片机对NAND Flash的读写以及在ASF中的运用

二、 NAND Flash

安排结构与寻址

NAND Flash的容量较大。整片Flash分为若干个块(Block),每个Block分为若干个页(Page)。在每个页中,除了数据区域,也包括若干“剩余”的区域,用来进行ECC等操作。在进行擦除操作是,根本单位是“块”;而编程的根本单位是“页”。

别的,NAND Flash的物理特性决议了其在编程时,每个bit只能从1变成0。所以在写入前,必须先对该块进行擦除(擦除时把一切方位为1)。

该Flash的结构如下(疏忽plane):

STM32单片机对NAND Flash的读写以及在ASF中的运用

在寻址时,是经过行地址和列地址指定贮存单元的。其间行地址表明页的编号,列地址表明指定在方针地址在该页的方位。

读写时序

由于没有地址线,所以读写较为杂乱。读写时,需求先发送相应操作指令,然后发送地址,才干进行数据传输。一个简略的“页读取”操作时序图如下:

STM32单片机对NAND Flash的读写以及在ASF中的运用

该指令首要复制整个页到NAND Flash的cache寄存器中,然后在需求输出的时分,再从指定的列地址开端输出。

PS,该NAND Flash支撑在上电的时分主动送出第一页的数据,所以经过恰当的装备,也是能够经过它进行Boot的。

CE# Don’t Care

在给NAND Flash发送完指令后,Flash需求一个预备的进程。在这个进程中,需求坚持片选信号的有用。(听说不然Flash就会进入低功耗状况)

一个简略的办法是运用GPIO直接操控这个引脚。在ASF中运用的便是这个办法。

别的的办法便是运用Flash的“CE# Don’t Care”功用。敞开这个功用后,即便片选无效,Flash也会进行作业。这样做的优点是不必再手动操控片选信号线外;一起能够在Flash进行内部操作时,能够进行其他的片选。比如在一块Flash忙时,能够给别的一块Flash发送指令。可是,敞开这个功用可能会增加Flash的功耗。

三、 ASF中NAND Flash运用

预备

在ASF Wizard中增加“NAND Flash on EBI”模块。

在conf_board.h中进行如下声明,记住调用board_init():

1#define CONF_BOARD_NAND

Flash 初始化

在board_init()之后,调用nand_flash_raw_iniTIalize()即可完结NAND Flash的初始化作业。

12345678structnand_flash_raw nf_raw;memset((void*)&nf_raw, 0, sizeof(nf_raw));// Init NAND Flash, and get informaTIons into nf_rawif(nand_flash_raw_iniTIalize(&nf_raw, 0,BOARD_NF_COMMAND_ADDR, BOARD_NF_ADDRESS_ADDR, BOARD_NF_DATA_ADDR)) {MainExit();}

该函数中,会对SMC和若干引脚进行装备;一起对Bus matrix进行设置,以运用芯片供给的NAND Flash逻辑功用。

然后会对NAND Flash进行重置。接着就会读取该Flash的ID,并依据该ID检测Flash的参数,如page巨细,block数目等。

根本操作

在nand_flash_raw.h中还供给了一些比较根底的操作。

以下代码对一切的块进行擦除,若在擦除中碰到过错,则打印出来(这儿printf会经过UART0口打印,今后有时机会说怎样完成):

12345678910111213// Get NAND‘s informaTIon from nf_rawconststructnand_flash_model* nf_mod = &(nf_raw.model);intnum_block = nand_flash_model_get_device_size_in_blocks(nf_mod);// Erase all blockprintf(“Erasing NAND Flash.。.\n\r”);interror;for(inti = 0; i 《 num_block; i++) {error = nand_flash_raw_erase_block(&nf_raw, i);if(error == NAND_COMMON_ERROR_BADBLOCK) {printf(“-E- Block %u is BAD block. \n\r”, i);}}

还有page的写入、读取和复制等操作就不一一列举了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/346412.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部