1.NandFlash分类

根据物理结构上的区别,NandFlash主要分为如下两类:
•SLC (Single Level Cell): 单层式存储
•MLC (Multi Level Cell): 多层式存储
SLC在存储格上只存一位数据,而MLC则存放两位数据。

2.MLC与SLC对比

价格:由于MLC采用了更高密度的存储方式,因此同容量的MLC价格上远低于SLC.
访问速度:SLC的访问速度一般要比MLC快3倍以上.
使用寿命:SLC能进行10万次的擦写,MLC能进行1万次
功耗:MLC功耗比SLC高15%左右

3.NandFlash初始化

3.1 设置时间参数TACLS 、TWRPH0、TWRPH1

3.2 使能NandFlash

3.3 NandFlash复位

3.3.1 选中芯片

3.3.2 清除RnB

3.3.3 发出复位信号(0xff)

3.3.4 等待就绪

3.3.5 取消选中

4.按页读取NandFlash的值

步骤:

1.选中芯片;2.清除RnB;3.发出命令0x00;4.发送列地址;5.发送行地址;6.发出命令0x30;7.等待就绪;8.读数据 ;9.取消片选

5.向NandFlash写入数据

5.1 擦除(写之前要进行擦除)

步骤:

1.选中芯片;2.清除RnB;3.发出命令0x60;4.发送行地址(3个周期);5.发送命令D0;6.等待RnB;7.发送命令70;8.读取擦除结果;9.取消片选

5.2 写入数据

步骤:

1.选中芯片;2.清除RnB;3.发出命令0x80;4.发送列地址(2个周期);5.发送行地址(3个周期);6.写入数据;7.发送命令0x10;8.等待RnB;9.发送命令70;10.读取写入结果;10.取消片选

6.代码

nand.c

 /*
tiny6410用的nandflash为 一页2K
*/ #define NFCONF (*((volatile unsigned long*)0x70200000))
#define NFCONT (*((volatile unsigned long*)0x70200004))
#define NFCMMD (*((volatile unsigned char*)0x70200008))
#define NFSTAT (*((volatile unsigned char*)0x70200028))
#define NFADDR (*((volatile unsigned char*)0x7020000c))
#define NFDATA (*((volatile unsigned char*)0x70200010)) void select_ship(void)
{
NFCONT &= ~(<<);
} void delselect_ship(void)
{
NFCONT |= (<<);
} void clean_RnB()
{
NFSTAT |= (<<);
}
void nand_cmd(unsigned char cmd)
{
NFCMMD = cmd;
} void wait_RnB(void)
{
while(!(NFSTAT & 0x1));
} void nand_addr(unsigned char addr)
{
NFADDR = addr;
} void nand_reset(void)
{
/* 选中 */
select_ship(); /* 清除RnB */
clean_RnB(); /* 发出复位信号 */
nand_cmd(0xff); /* 等待就绪 */
wait_RnB(); /* 取消选中 */
delselect_ship();
} void nand_init(void)
{ /* 设置时间参数 */
#define TACLS 7
#define TWRPH0 7
#define TWRPH1 7 NFCONF &= ~((<<)|(<<)|(<<));
NFCONF |= (TACLS<<)|(TWRPH0<<)|(TWRPH1<<); /* 使能 nandflash controller*/
NFCONT = | (<<); /* 复位 */
nand_reset();
} void NF_PageRead(unsigned long addr,unsigned char* buff)
{
int i; /* 选中芯片 */
select_ship(); /* 清除RnB */
clean_RnB(); /* 发出命令0x00 */
nand_cmd(0x00); /* 发出列地址 */
nand_addr(0x00);
nand_addr(0x00); /* 发出行地址 */
nand_addr(addr&0xff);
nand_addr((addr >> ) & (0xff));
nand_addr((addr >> ) & (0xff)); /* 发出命令0x30 */
nand_cmd(0x30); /* 等待就绪 */
wait_RnB(); /* 读数据 */
for(i = ; i<*; i++)
{
*buff++ = NFDATA;
} /* 取消片选 */ delselect_ship(); } int NF_Erase(unsigned long addr)
{
int ret; //选中flash芯片
select_ship(); //清除RnB
clean_RnB(); //发送命令60
nand_cmd(0x60); //发送行地址(3个周期)
nand_addr(addr&0xff);
nand_addr((addr >> ) & (0xff));
nand_addr((addr >> ) & (0xff)); //发送命令D0
nand_cmd(0xD0); //等待RnB
wait_RnB(); //发送命令70
nand_cmd(0x70); //读取擦除结果
ret = NFDATA; //取消选中flash芯片
delselect_ship(); return ret;
} int NF_WritePage(unsigned long addr,unsigned char* buff)
{
int ret,i; //选中flash芯片
select_ship(); //清除RnB
clean_RnB(); //发送命令80
nand_cmd(0x80); //发送列地址(2个周期)
nand_addr(0x00);
nand_addr(0x00); //发送行地址(3个周期)
nand_addr(addr&0xff);
nand_addr((addr >> ) & (0xff));
nand_addr((addr >> ) & (0xff)); //写入数据
for(i=;i<*;i++)
{
NFDATA = buff[i];
} //发送命令10
nand_cmd(0x10); //等待RnB
wait_RnB(); //发送命令70
nand_cmd(0x70); //读取写入结果
ret = NFDATA; //取消选中flash芯片
delselect_ship(); return ret;
}

nand.c

nand_to_ram

汇编和C语言的参数传递,不超过4个的时候,直接用r0--r3传递,且顺序和从函数的形参一致

 copy_to_ram:
mov r0,#
ldr r1,=_start
ldr r2,=bss_end sub r2,r2,r1
mov ip,lr
bl nand_to_ram mov lr,ip mov pc,lr

start.S

 void nand_to_ram(unsigned long start_addr,unsigned char* sdram_addr,int size)
{
int i; for( i=(start_addr >>); size>;)
{
NF_PageRead(i,sdram_addr);
size -= ;
sdram_addr += ;
i++;
} }

nand_to_ram

NandFlash读写的更多相关文章

  1. (转)Nandflash读写

    ------------------------------------------------------------------------------------------文章1------- ...

  2. 【ARM】arm系列知识框架

    [ARM编程模型] 硬件: 电路原理图 软件: 体系结构, 指令集, 寄存器组 [ARM编程技术] 汇编/C语言 编译, 链接, 烧写和调试 windows: MDK linux  : gcc [AR ...

  3. u-boot懂你并不难

    转载:http://blog.chinaunix.net/uid-28236237-id-3865045.html u-boot第一阶段分析(一) u-boot 第一阶段分析(二) u-boot 第二 ...

  4. 04.移植u-boot

    1.读readme获取信息    1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器    ifeq ($(HOSTARCH),$(ARCH))   ...

  5. 外设:K9F2G08 nandflash 底层读写、控制驱动程序,可随机读写

    /****************************************************************************** Copyright (C), 2001- ...

  6. nandflash的读写(2440)

    说明: 根据物理结构上的区别 , NandFlash主要分为如下两类:1)•SLC (Single Level Cell): 单层式存储2)•MLC (Multi Level Cell): 多层式存储 ...

  7. 使用jlink直接烧norflash或者nandflash不借助uboot的猜想

    由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...

  8. NorFlash和NandFlash区别

      Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位 ...

  9. uboot在nandflash和norflash是如何运行的

    转自:http://www.aiuxian.com/article/p-2796357.html 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...

随机推荐

  1. Wireshark找不到网络接口问题

    Wireshark找不到网络接口问题 在运行Wireshark工具抓包时,需要有管理员用户权限.如果是普通用户启动的话,将会提示找不到网络接口.

  2. 在Mac OSX 10.10 上安装opencv

    http://blog.csdn.net/wdkirchhoff/article/details/41910553 在Mac OSX上如果想使用OpenCV,可以通过自己手动编译源码的方式,但比较繁琐 ...

  3. Ubuntu远程连接windows

    一般情况下都是使用windows系统,通过mstsc远程连接linux系统,但对于一些linuxer来说,有时候需要远程连接一下windows,最后采用的是rdesktop,一个非常好用的工具 sud ...

  4. 多个微信菜单都需要获取openId的时候如何处理回调页面的问题

    1.要建立一个特殊的页面处理这个逻辑 if (taskClassId == "6027") { Response.Redirect("./ProductAdvice.as ...

  5. 避免每次输入bundler Exec命令

    bundle在ruby的世界里是个好东西,它可以用来管理应用程序的依赖库.它能自动的下载和安装指定的gem,也可以随时更新指定的gem. rvm则是一个命令行工具,能帮助你轻松的安装,管理多个ruby ...

  6. BNUOJ 13105 nim博弈

    ncredible Chess Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on LightOJ. Ori ...

  7. mySql-通过group by分组

    当我们想查询主表和子表的信息时,我们首先会通过主表的id和子表中的主表id关联 如现有主表:tbl_enquire_price(询价表)和子表:tbl_enquire_price_detail(询价详 ...

  8. ✡ leetcode 157. Read N Characters Given Read4 利用read4实现read --------- java

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  9. jQuery的attr与prop,attribute和property区别

    jQuery1.6中新添加了一个prop方法,看起来和用起来都和attr方法一样,这两个方法有什么区别呢?这要从HTMl 的attribute与property区别说起,attr与prop正是这两个东 ...

  10. spring技术核心概念纪要

    一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...