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 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...
随机推荐
- C++ Daily 《3》----构造函数可否是虚函数
C++ 中构造函数可否是虚函数? 绝不要!! 而且,在构造函数中调用虚函数也是不提倡的行为,因为会引发预想不到的结果. 因为,在 derived class 对象构造的过程中,首先调用的是基类的构造函 ...
- 跟大牛之间关于hibernate的一些探讨记录
hibernate的工作原理!! 1.读取配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transcation 5.持久化操作 6.提交事务 ...
- NSFetchedResultsControllerDelegate不执行
熬了2 ,3个小时 才解决这个问题 在进行IM 设置时候 NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@&q ...
- Gym 100851K
Problem King's Inspection 题目大意 给一张n个点m条边的无向图,问是否存在一条欧拉回路. n<=10^5, 0<=m<=n+20. 解题分析 注意到数据范围 ...
- LNMP安装一键安装包
系统需求: CentOS/Debian/Ubuntu Linux系统 需要2GB以上硬盘剩余空间 128M以上内存,OpenVZ的建议192MB以上(小内存请勿使用64位系统) VPS或服务器必须已经 ...
- Android 学习第11课,android 实现拨打电话的功能
1. 先布局界面,界面采用线性垂直方式来布局 在layout 界面文件中 activity_main.xml 中 <LinearLayout xmlns:android="http:/ ...
- 一些JavaScript的技巧、秘诀和最佳实践
文章分享一些JavaScript的技巧.秘诀和最佳实践,除了少数几个外,不管是浏览器的JavaScript引擎,还是服务器端JavaScript解释器,均适用. 本文中的示例代码,通过了在Google ...
- Selenium定位一 --单个元素定位方法
Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法. 单个对象的定位方法 多个对象的定位方法 层级定位 定位单个元素在定位单个元素时,selenium-webdriver ...
- Opencv读取与显示图片
#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "hi ...
- windows下在yii中使用mongodb
1.编译或下载对应dll动态链接库拓展文件,下载地址:点我,不知道如何编译windows下的dll拓展->点我 2.找到web服务器软件,如apache,nginx等webserver处理浏览器 ...