NandFlash读写
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读写的更多相关文章
- (转)Nandflash读写
------------------------------------------------------------------------------------------文章1------- ...
- 【ARM】arm系列知识框架
[ARM编程模型] 硬件: 电路原理图 软件: 体系结构, 指令集, 寄存器组 [ARM编程技术] 汇编/C语言 编译, 链接, 烧写和调试 windows: MDK linux : gcc [AR ...
- u-boot懂你并不难
转载:http://blog.chinaunix.net/uid-28236237-id-3865045.html u-boot第一阶段分析(一) u-boot 第一阶段分析(二) u-boot 第二 ...
- 04.移植u-boot
1.读readme获取信息 1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器 ifeq ($(HOSTARCH),$(ARCH)) ...
- 外设:K9F2G08 nandflash 底层读写、控制驱动程序,可随机读写
/****************************************************************************** Copyright (C), 2001- ...
- nandflash的读写(2440)
说明: 根据物理结构上的区别 , NandFlash主要分为如下两类:1)•SLC (Single Level Cell): 单层式存储2)•MLC (Multi Level Cell): 多层式存储 ...
- 使用jlink直接烧norflash或者nandflash不借助uboot的猜想
由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...
- NorFlash和NandFlash区别
Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位 ...
- uboot在nandflash和norflash是如何运行的
转自:http://www.aiuxian.com/article/p-2796357.html 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...
随机推荐
- java EE实现动态SQL的
结果图 情况一:
- a few changes of Android 5.0
1.Service Intent must be explicit Intent serviceIntent = new Intent(context,MyService.class);context ...
- 【C++ STL编程】queue小例子
STL是标准化组件,现在已经是C++的一部分,因此不用额外安装什么. #include <queue> #include <iostream> using namespace ...
- [Java Basics2] Iterable, Socket, Reflection, Proxy, Factory DP
Parent interface of Collection: Iterable Interface A class that implements the Iterable can be used ...
- echo、print、sprint、sprintf输出
echo() 函数 定义和用法 echo() 函数输出一个或多个字符串. 语法 echo(strings) 参数 描述 strings 必需.一个或多个要发送到输出的字符串. 提示和注释 注释:ech ...
- SQL视图与触发器
视图(虚拟的表) select查询出来的结果集可以用as起别名当作虚拟表来使用 视图只能添加使用不能添加修改 视图不能建在其他视图上,只能一其他实体表作为基础 视图表的数据会随实体表的变动而变动 视图 ...
- php实现文件下载
<?php $filename = '路径+实际文件名'; //文件的类型 header('Content-type: application/octstream'); //下载显示的名字 he ...
- ecshop安装常见问题及解决办法
一,Ecshop首页出现报错:Only variables should be passed by referen 最近想安装一个ECSHOP商城上去,老是报错,出现下面这就话: Strict Sta ...
- MetaPhlAn 2:宏基因组进化分析
描述 MetaPhlAn是分析从物种水平分辨率宏基因组鸟枪法测序数据的微生物群落(细菌,古细菌,真核细胞和病毒)的组成的计算工具.从版本2.0,MetaPhlAn还能够确定具体的菌株(在将样品含有先前 ...
- JavaBean用JSP调用和使用JSP动作标签的区别
javabean的类可以用jsp动作标签实例化并使用. <!-- 下面这句是对Javabean类person的引用,引用的实例是p2 --> <jsp:useBean id=&quo ...