NandFlash
一、概述
1、NandFlash
NAND结构能提供极高的单元密度,可以达到高存储密度,比如能达到256M,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理需要特殊的系统接口。
2、NandFlash和NorFlash对比
| Nor | Nand | |
| 容量 | 1MB~32MB | 16M~512MB |
| XIP | Yes | No |
| 擦除 | 非常慢(5S) | 快(3ms) |
| 写 | 慢 | 快 |
| 读 | 快 | 快 |
| 可靠性 | 比较高,位反转的比例小于NandFlash的10% | 比较低,位反转比较常见,必须有校验措施,比如TNR必须有坏块管理措施 |
| 可擦除次数 | 10000~100000 | 100000~1000000 |
| 生命周期 | 低于NandFlash的10% | 是NorFlash的10倍以上 |
| 接口 | 与RAM接口相同 | I/O接口 |
| 访问方法 | 随机访问 | 顺序访问 |
| 易用性 | 容易 | 复杂 |
| 主要用途 | 常用于保存代码和关键数据 | 用于保存数据 |
| 价格 | 贵 | 便宜 |
二、NandFlash常见引脚
1、输入输出(I/O0~I/O7)
数据输入/输出
2、芯片使能(Chip Enable,CE#)
如果没有检测到CE信号,那么NAND器件就保持待机模式,不对任何控制信号作出响应
3、写使能(Write Enable, WE#)
WE#负责将数据、地址或指令写入NAND之中
4.读使能(Read Enable, RE#)
允许输出数据缓冲器。
5.指令锁存使能(Command Latch Enable, CLE)
当CLE为高时,在WE#信号的上升沿,指令被锁存到NAND指令寄存器中
6.地址锁存使能(Address Latch Enable, ALE)
当ALE为高时,在W6.地址锁存使能(Address Latch Enable, ALE)E#信号的上升沿,地址被锁存到NAND地址寄存器中
7.就绪/忙(Ready/Busy, R/B#)
如果NAND器件忙,R/B#信号将变低。该信号是漏极开路,需要采用上拉电阻
三、NandFlash的物理结构
以下内容皆以K9F2G08U0B为例进行说明。
1、结构框图
2、存储结构
1 Page = (2K+64)Bytes
1 Block = 64 Pages
= (128K + 4K) Byte
1 Device= 2048 Blocks
= 128K Pages
= (256M + 8M)Byte
= 2112 Mbits
ECC
Linux系统中,一般叫做OOB(Out Of Band)。NandFlash在操作过程中容易出错,为了保证数据的正确性,需要有检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),因此设计了多余的区域,用于放置数据的校验值。
3、地址序列
A0~A11 页内寻址 不仅可以寻址到有效数据,还能寻址到校验区
A12~A28 页寻址
其中:
A12~A17 块内页寻址
A18~A28 块寻址
四、NandFlash相对于RAM使用的特殊性
|
RAM |
NandFlash |
|
|
读取/写入的叫法 |
读取/写入 |
读取/编程(Program)① |
|
读取/写入的最小单位 |
字节 |
Page/页 |
|
擦除(Erase)操作的最小单位 |
字节 |
Block/块② |
|
擦除操作的含义 |
将数据删除/全部写入0 |
将整个块都擦除成全是1,也就是里面的数据都是0xFF ③ |
|
对于写操作 |
直接写即可 |
在写数据之前,要先擦除,然后再写 |
注:
①之所以将写操作叫做编程,是因为,flash 和之前的EPROM,EEPROM继承发展而来,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往里面写入数据,就叫做编程Program,之所以这么称呼,是因为其对数据的写入,是需要用电去擦除/写入的,就叫做编程。
②对于目前常见的页大小是2K/4K的Nand Flash,其块的大小有128KB/256KB/512KB等。而对于Nor Flash,常见的块大小有64K/32K等。
③在写数据之前,要先擦除,内部就都变成0xFF了,然后才能写入数据,也就是将对应位由1变成0。
五、实验代码
1、擦除操作
/* *********************擦除函数*******************************
参数说明:
block 要擦除的块
返回参数:
0 擦除失败
1 擦除成功
*/
unsigned char EraseBlock(unsigned int block)
{
unsigned int blockpage = ;
blockpage = block << ;
/* 选中芯片 */
nand_select_chip();
/* 发出WRITE0命令 */
write_cmd(0x60);
/* Write Address */
NFADDR = blockpage & 0xff; /* Row Address A12~A19 */
NFADDR = (blockpage >> ) & 0xff; /* Row Address A20~A27 */
NFADDR = (blockpage >> ) & 0x01; /* Row Address A28 */
write_cmd(0xD0);
wait_idle();
write_cmd(0x70);
wait_idle();
if(read_data()&0x1) // Page write error
{
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
else
{
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
}
2、页读操作
/* *********************页读函数*******************************
参数说明:
buf 存放读取数据的目的地址
addr 从nandflash中读取数据的源地址
*/
static unsigned char ReadPage(unsigned char * buf,unsigned int addr)
{
int j;
if (addr & NAND_BLOCK_MASK) {
return ; /* 地址或长度不对齐 */
}
/* 选中芯片 */
nand_select_chip(); /* 发出READ0命令 */
write_cmd();
/* Write Address */
write_addr(addr);
write_cmd(0x30);
wait_idle(); for(j=;j < NAND_SECTOR_SIZE; j++) {
*buf = read_data();
buf++; /*i每经过一个大循环就增加NAND_SECTOR_SIZE*/
}
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
3、页写操作
/* *********************页写函数*******************************
参数说明:
buf 源地址
addr 写入nandflash的目的地址
*/
static unsigned char WritePage(unsigned char * buf,unsigned int addr)
{
unsigned int i = ;
if (addr & NAND_BLOCK_MASK) {
return ; /* 地址或长度不对齐 */
}
/* 选中芯片 */
nand_select_chip();
/* 发出WRITE0命令 */
write_cmd(0x80);
/* Write Address */
write_addr(addr);
/* Write Data */
for(i=;i<;i++)
{
write_data(*buf);
buf++;
}
write_cmd(0x10);
wait_idle();
write_cmd(0x70);
wait_idle();
if(read_data()&0x1) // Page write error
{
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
else
{
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
}
4、打印页内容(调试用)
/* *********************打印出指定地址的一个页的内容********************
*/
void nand_printf()
{ unsigned int i;
unsigned char block=, page=;
unsigned char * downPt;
downPt=(unsigned char *)_NONCACHE_STARTADDRESS; printf("\n\rK9F2G08 NAND Page Read.\n");
printf("\nBlock # to read: ");
block = getc()-;
printf("%d\n\r", block);
printf("\nPage # to read: ");
page = getc()-;
printf("%d\n\r", page); if(ReadPage(downPt,((block<<)+page)<<)==) {
printf("\nRead error.\n");
} else {
printf("\nRead OK.\n");
}
// Print data.
printf("Read data(%d-block,%d-page)\n", block, page); for(i=; i<; i++) {
if((i%)==) printf("\n\r%4x: ", i);
printf("%02x ", *downPt++);
}
printf("\n");
}
5、发送地址函数
static void write_addr(unsigned int addr)
{
int i;
unsigned int col, page; col = addr & NAND_BLOCK_MASK;
page = addr / NAND_SECTOR_SIZE; NFADDR = col & 0xff; /* Column Address A0~A7 */
for(i=; i<; i++); NFADDR = (col >> ) & 0x0f; /* Column Address A8~A11 */
for(i=; i<; i++); NFADDR = page & 0xff; /* Row Address A12~A19 */
for(i=; i<; i++); NFADDR = (page >> ) & 0xff; /* Row Address A20~A27 */
for(i=; i<; i++); NFADDR = (page >> ) & 0x01; /* Row Address A28 */
for(i=; i<; i++);
}
着重强调一下,“for(i=0; i<10; i++); ”延时代码绝不能省略。笔者发现,当S3C2440的主频在12MHz时,如果没有延时代码,NandFlash发送地址还能正常工作;一旦主频在400MHz,没有延时代码,地址就不能正常发送。
附:实现NandFlash程序下载的代码(nand.zip)
NandFlash的更多相关文章
- nandflash的读写(2440)
说明: 根据物理结构上的区别 , NandFlash主要分为如下两类:1)•SLC (Single Level Cell): 单层式存储2)•MLC (Multi Level Cell): 多层式存储 ...
- 使用jlink直接烧norflash或者nandflash不借助uboot的猜想
由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...
- 关于NOR-FLASH和NAND-fLASH的区别。——Arvin
NANDFLASH: Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NAND flash结构.其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案.N ...
- NandFlash读写
1.NandFlash分类 根据物理结构上的区别,NandFlash主要分为如下两类:•SLC (Single Level Cell): 单层式存储•MLC (Multi Level Cell): 多 ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
- 路由器 NorFlash与NandFlash区别
在淘宝上买修改openwrt的路由器,基本上都是改的16MB flash,那么为什么不改到1GB呢? 现在U盘的价格也很便宜啊. 于是我调查了一下,发现flash分为两种,NorFlash与NandF ...
- WinCE开机Logo的实现(USB下载图片到nandflash)
WinCE开机启动Logo使用Eboot读取NandFlash中的图片数据,然后显示的方式.对于开机logo的方式网友http://jazka.blog.51cto.com/809003/664131 ...
- 通过NORFLASH中的uboot烧写uboot到nandFlash
在mini2440的教程中,在构建nandflash系统的时候是首先通过supervivi借助dnw烧写uboot.bin到nand flash 第零块, 由于我使用的是64位操作系统,usb驱动没安 ...
- NorFlash和NandFlash区别
Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位 ...
- uboot在nandflash和norflash是如何运行的
转自:http://www.aiuxian.com/article/p-2796357.html 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...
随机推荐
- C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏
1. 概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...
- C#多线程(下) 分类: C# 线程 2015-03-09 10:41 153人阅读 评论(0) 收藏
四.多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线 ...
- Java HexString
byte[]和十六进制字符串相互转换 Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示. 所以我们就可以把每个byte转换成两个相应的16进制字符,即把by ...
- leetcode第一刷_Validate Binary Search Tree
有了上面的教训,这道题就简单多了,什么时候该更新pre是明白的了,倒是有个细节,二叉搜索树中是不同意有相等节点的,所以题目的要求用黑体字标明了.写的时候注意就能够了. class Solution { ...
- PC机安装Qt以及QT交叉编译环境 分类: OpenCV ZedBoard shell ubuntu Eye_Detection 2014-11-08 18:57 246人阅读 评论(0) 收藏
PC: apt-get install qtcreator Qt Embedded for ZedBoard: 下载qt-everywhere-opensource-src-4.7.3.tar.gz, ...
- 创建文档和自定义的qt assistant
利用qt制作帮助文档 1. 创建文档即是一些html文件,这里可以使用qt提供的工具像是qdoc 和Doxygen生成帮助的html文档. 2. 组织文档结构用于qt ...
- [转] Understanding Twitter Bootstrap 3
Bootstrap is a popular, open source framework. Complete with pre-built components it allows web desi ...
- 拿走不谢!22 个 Android Studio 优秀插件汇总
Google 在2013年5月的I/O开发者大会推出了基于IntelliJ IDEA java ide上的Android Studio.AndroidStudio是一个功能齐全的开发工具,还提供了第三 ...
- date和long的相互转换
import java.text.SimpleDateFormat; import java.util.Date; public class T { public static void main(S ...
- C#--Session用完如何清除
Session.Abandon();//清除全部Session//清除某个SessionSession["UserName"] = null;Session.Remove(&quo ...