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 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...
随机推荐
- RDMA的ibv_post_send() 函数
函数原型为 int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr); 其中s ...
- javascript高级教程:如何优化javascript代码性能
在web前端开发中,为实现一些动态效果,减小页面大小,我们一般都会使用JavaScript技术来进行相关设置.但是初学者在编写JavaScript代码的时候,往往都是比较低质的代码,那如何才能提高Ja ...
- cassandra CQL 常用操作
1. CQL客户端链接 bin/cqlsh ip username password 2. (1)建立keyspace语句,keyspace类似于 mysql 中的数据库,一个数据库中可以有很多表: ...
- 网页版电子表格控件tmlxSpreadsheet免费下载地址
tmlxSpreadsheet 是一个由JavaScript 和 PHP 写成的电子表格控件(包含WP插件, Joomla插件等等).. 程序员可以容易的添加一个类似Excel功能的,可编辑的表格功能 ...
- 【LeetCode OJ】Convert Sorted Array to Binary Search Tree
Problem Link: http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ Same idea ...
- swift项目中使用OC/C的方法
假如有个OC类OCViewController : UIViewController类里有两个方法 //swift调用oc或c的混编是比较常用的,反过来的调用很少.这里只写了swift调用oc和c的方 ...
- php实现文件下载
<?php $filename = '路径+实际文件名'; //文件的类型 header('Content-type: application/octstream'); //下载显示的名字 he ...
- UE4 VR 模式下全屏解决办法
方法步骤: 1.打开关卡蓝图添加如下代码: 2.设置配置文件在工程目录里面找到 Config 文件夹在里面添加一个配置文件并命名为 DefaultGameUserSettings.ini 把如下内容贴 ...
- linux的软硬链接的特性
硬链接的特征: 1.拥有相同的i节点和储存block块,可以看作是同一个文件 2.可以通过i节点识别 3.不能跨分区 4.不能针对目录使用 软链接的特征: 1.类似于windows的快捷方式 2.软链 ...
- Reveal UI 分析工具分析手机 App
上篇文章介绍了: Reveal UI 分析工具简单使用 这里介绍如何使用 Reveal UI 分析工具来进行手机 App UI 界面的分析. 前提准备: (1)已安装 Reveal 的 Mac (2) ...