这次大概介绍了一下NAND Flash,以及在ASF中使用它的方法。

一、 接线

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

偷个懒,直接上引脚复用的图。其中PC14表明该NAND FLASH需要作为SMC的外设0使用。通过使用NANDOE和NANDWE引脚说明需要使用芯片的NAND Flash控制逻辑。另外,PC18复用为输入引脚,用以查询芯片的状态。

二、 NAND Flash

  • 组织结构与寻址

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

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

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

    在寻址时,是通过行地址和列地址指定储存单元的。其中行地址表示页的编号,列地址表示指定在目标地址在该页的位置。

  • 读写时序

    因为没有地址线,所以读写较为复杂。读写时,需要先发送相应操作命令,然后发送地址,才能进行数据传输。一个简单的“页读取”操作时序图如下:

    该命令首先拷贝整个页到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使用

  1. 准备

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

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

    #define CONF_BOARD_NAND
  2. Flash 初始化

    在board_init()之后,调用nand_flash_raw_initialize() 即可完成NAND Flash的初始化工作。

    struct nand_flash_raw nf_raw;
    memset((void*)&nf_raw, 0, sizeof(nf_raw)); // Init NAND Flash, and get informations into nf_raw
    if (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数目等。

  3. 基本操作

    nand_flash_raw.h中还提供了一些比较基础的操作。

    以下代码对所有的块进行擦除,若在擦除中碰到错误,则打印出来(这里printf会通过UART0口打印,以后有机会会说怎么实现):

    // Get NAND's information from nf_raw
    const struct nand_flash_model* nf_mod = &(nf_raw.model);
    int num_block = nand_flash_model_get_device_size_in_blocks(nf_mod);
    // Erase all block
    printf("Erasing NAND Flash...\n\r");
    int error;
    for (int i = 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的写入、读取和拷贝等操作就不一一列举了……

SAM4E单片机之旅——16、NAND Flash读写的更多相关文章

  1. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  2. SAM4E单片机之旅——23、在AS6(GCC)中使用FPU

    浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...

  3. SAM4E单片机之旅——3、LED闪烁之定时器中断

    让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...

  4. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  5. SAM4E单片机之旅——24、使用DSP库求向量数量积

    DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算.Cortex-M4中,配置了一些强大的部件,以提高DSP能力.同时CMSIS提供了一个DSP库,提供了 ...

  6. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  7. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...

  8. SAM4E单片机之旅——21、DMAC之USART回显

    DMAC也可以和外设进行数据交互.之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作.而且由于DMAC有内部的缓冲区,实现起来更为简单. 一. USART设置 因为之前已经 ...

  9. SAM4E单片机之旅——19、CAN间通信

    CAN协议具有良好的可靠性,在工业中应用广泛.这次就先熟悉CAN的基本功能. 开发板有两个CAN,每个CAN有8个信箱.这次内容是从CAN0的信箱0发送数据到CAN1的信箱0. 除本次使用的功能外,C ...

随机推荐

  1. Xcode-显示代码行数

    在Xcode菜单中选择Preferences命令,单击Text Editing选项图标,选中Linenumbers复选框.(快捷键苹果键+逗号打开preferences --> Text Edi ...

  2. iOS-UITextField-通知

    二.处理文本框与键盘之间的关系(当键盘弹出遮挡到文本框的时候进行调整) 原理: 首先要明白: 1,键盘隐藏的时候,键盘上边界紧贴屏幕最低端,键盘在屏幕正下方. 2:键盘弹起的时候,键盘下边界跟屏幕下边 ...

  3. Firefox中一个很好用的host工具--HostAdmin

    支持分组的功能超级好用 host中如下添加 [#] 17 [# COMMENT]#==== 17#192.168.0.17 www.xxx.com#192.168.0.17 1.xxx.com#192 ...

  4. Android程序ToDoList

    本文的目的是创建一个简单的ToDoList列表. 这个应用的功能是记录我的代办事项,简单到不需要本地存储,所有的代办事项都只是存储在内存中,就是只有程序打开的时候可以增加查看代办事项,当程序关闭的时候 ...

  5. AutoTransformHandler

    public static ObservableCollection<F> Transform<T, F>(List<T> target) where F : ne ...

  6. 常见浏览器兼容问题、盒模型2种模式以及css hack知识讲解

    什么是浏览器兼容问题?所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们 ...

  7. ADO.NET学习系列(二)

    这次我使用ADO.NET来插入一条数据,到数据库中.主用到存储过程.我不想每次都是用SQL文本的形式了,那样始终没有进步--- 下面首先,我把我这次练习要用到的数据库脚本,贴出来: USE maste ...

  8. AEAI CRM客户关系管理升级说明

    本次发版的AEAI CRM_v1.5.1版本为AEAI CRM_v1.5.0版本的升级版本,该产品现已开源并上传至开源社区http://www.oschina.net/p/aeaicrm. 1 升级说 ...

  9. 泛函编程(21)-泛函数据类型-Monoid

    Monoid是数学范畴理论(category theory)中的一个特殊范畴(category).不过我并没有打算花时间从范畴理论的角度去介绍Monoid,而是希望从一个程序员的角度去分析Monoid ...

  10. git 使用笔记(二)

    续 2.15 删除文件 $ rm testDel.txt删除掉工作区的testDel.txt文件, 1)这时可以通过git checkout -- testDel.txt从版本库恢复该文件到工作区 2 ...