SAM4E单片机之旅——16、NAND Flash读写
这次大概介绍了一下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使用
准备
在ASF Wizard中添加“NAND Flash on EBI”模块。
在conf_board.h中进行如下声明,记得调用board_init():
#define CONF_BOARD_NAND
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数目等。
基本操作
在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读写的更多相关文章
- u-boot分析(九)----nand flash初始化|nand flash读写分析
u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU
浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...
- SAM4E单片机之旅——3、LED闪烁之定时器中断
让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- SAM4E单片机之旅——24、使用DSP库求向量数量积
DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算.Cortex-M4中,配置了一些强大的部件,以提高DSP能力.同时CMSIS提供了一个DSP库,提供了 ...
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压
很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...
- SAM4E单片机之旅——13、LCD之ASF初步
在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...
- SAM4E单片机之旅——21、DMAC之USART回显
DMAC也可以和外设进行数据交互.之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作.而且由于DMAC有内部的缓冲区,实现起来更为简单. 一. USART设置 因为之前已经 ...
- SAM4E单片机之旅——19、CAN间通信
CAN协议具有良好的可靠性,在工业中应用广泛.这次就先熟悉CAN的基本功能. 开发板有两个CAN,每个CAN有8个信箱.这次内容是从CAN0的信箱0发送数据到CAN1的信箱0. 除本次使用的功能外,C ...
随机推荐
- iOS-定时器
一.定时器的作用 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 二.定时器的种类 大概有三种方法:NSTimer.CA ...
- Vue基础---->VueJS的使用(一)
Vue.js是一个构建数据驱动的web界面的库.它的目标是通过尽可能简单的API 实现响应的数据绑定和组合的视图组件,今天我们就开始vue.js的学习. vue的安装及使用 一.vue的下载地址:ht ...
- js实现页面a向页面b传参的方法
方法一:使用HTML5本地化存储(localStorage) 组件(本地最大能存储5M数据)localStorage是本地永久存储数据,是cookie的优化 方法二:使用cookie将数据存放在客户的 ...
- 转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
描述:作为一个写了几年c#的码农,咱的java水平实在不敢恭维,但是最近有个任务需要弄点java的代码,还要研究混淆.网上百度并实验了整整一天,终于算是有点成果了.其中混淆的时候由于用到了gson包, ...
- 2015百度之星 IP聚合
IP聚合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Descri ...
- jquery ajax给外部变量赋值 async: false
开发过程中用到检查是否存在手机号问题. //验证手机号是否注册 var bl = false; $.ajax({ type: ...
- Discuz的缓存体系
参考文档:<http://dev.discuz.org/wiki/index.php?title=缓存机制> Discuz中涉及数据缓存的地方有: 1. session Dz的sessio ...
- 从零开始学习Linux(cp 命令)
功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录, ...
- [PHP] PHP请求Socket接口测试
使用php读取socket接口的数据,通过php传递请求方法和请求参数,得到返回结果 PHP文件: <?php class Test{ const IP='127.0.0.1'; const p ...
- 访问WEB-INFO 目录注意事项
WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问.什么是客户端级别?什么是服务器级别呢? 转发就是服务器级别,浏览器的地址不会变,因为,客户端发送一个请求,服务器受理之后,发现要 ...