[初级知识]如何正确nandflash的块地址和页地址
来源:互联网 发布:windows下的dig工具 编辑:程序博客网 时间:2024/06/09 06:07
结论
- 块地址 从1开始,其范围位于1~2048(以2Gb nandflash为例)
- 页地址 从0到63, 其范围位于0~63(以2Gb nandflash为例)
背景
对于初次接触nandflash的新手而言,不管是做裸机的驱动还是复杂的Linux下的nand驱动,能看懂nandflash的数据手册中给出的时序图,已经是不错的,但要想正确的去实现功能,恐怕是还是有一道拦路虎的,当然,弄懂了,就一纸老虎,这老虎就是我们要说的 nandflash操作中的块地址跟页地址的正确设置。
块地址
nandflash中有块和页的概念,常见的表述如,
nandflash的大小=块总数x每块的页总数x每页的大小
这里的块大小和页大小,均会在相应的数据手册中查到,那么,我们关系的擦除、读写这几个重要的操作而言,其中的块地址该如何计算而来?
比如说,我们常在控制台上用nand erase addr size,而这个命令通常是直接传入addr,我们怎么从addr中解析出块地址呢?下面给出一份正确的实现代码
int addr = 0x0ffc0000 ; int block_addr = 0;int page_size = 2048;int page_count_per_block= 64;block_addr = addr/(page_size*page_count_per_block) ;
有的时候,我们看网上有的人说,nandflash的块地址等于页地址,其实这句话说的是有前提条件的,那就是第0块第0页的时候满足这个说法,其他的一概不满足
页地址
还是用上面的nand erase addr size,而这个命令通常是直接传入addr,我们怎么从addr中解析出页地址呢?下面给出一份正确的实现代码
int addr = 0x0ffc0000 ; int block_addr = 0;int page_size = 2048;int page_addr = 0;page_addr = addr/page_size;
有的时候,我们看网上有的人说,nandflash的块地址等于页地址,其实这句话说的是有前提条件的,那就是第0块第0页的时候满足这个说法,其他的一概不满足
实现nandflash的擦除
给出的已知条件为要擦除的地址,以及大小,要去实现擦除的伪代码
- 页大小page_size
- 每块的页总数page_count_per_block
int nand_erase_one_block(int addr, int size){ int page_addr = 0; page_addr = addr/(page_size); 伪代码: reset_nand(); write_erase_cmd(); write_addr(page_addr&0xff); write_addr(page_addr>>8&0xff); write_addr(page_addr>>16&0xff); write_erase_cmd(); wait_dev_ready(); check_nand_erase_stat();}
有人或许会很好奇,你这写法为什么跟我在数据手册上看到的不一样,数据手册明明跟这不一样,而且你这种写法如何对得上数据手册中的地址周期值呢?我们不妨先解决这个疑问,用数据手册上的地址周期写法来实现一组代码,我们就按照下面的5个地址周期的数据手册写法来实现一组:
因为我们都知道,在擦除程序时,只需要写三个行地址(为啥?因为数据手册的擦除时序图要求的,不会的看下面这张图)
int nand_erase_one_block(int addr, int size){ int block_addr = 0; block_addr = addr/(page_size*page_count_per_block); 伪代码: reset_nand(); write_erase_cmd(); write_addr((block_addr << 6) & 0xff);//按照5个地址周期值,我们来填充数据 write_addr((block_addr >> 2) & 0xff); write_addr((block_addr >> 10) & 0x01); write_erase_cmd(); wait_dev_ready(); check_nand_erase_stat();}
以上这两种实现方法其实大同小异,第一种方法是用page_addr来实现的,而第二种方法是用block_addr的方法实现的,这两种方法实现其实是一模一样的,并没有什么差别。
- [初级知识]如何正确nandflash的块地址和页地址
- nandflash的地址周期
- NandFlash---地址与区、块、页的关系-以MX30LF1G08AA为例
- 计算NandFlash要传入的行地址和列地址
- nandflash地址的物理地址,逻辑地址,spare地址等理解
- Nandflash存储结构和地址分配
- 关于MAC地址和IP地址的知识
- 如何判断一个字符串是否为正确的IP地址
- 正确的得到Mac地址
- 判断输入的Ip地址和子网掩码是否正确
- 如何找到MSSQL的地址和Database Publishing Service地址
- 如何查看小米手机的IP地址和MAC地址
- C语言多级指针的地址和所指向内存块的地址的理解
- 如何判断IP地址是否正确
- IP地址的相关知识
- .已知地址块中的一个地址是140.120.84.24/20。试求这个地址块中的最小地址和最大地址。地址掩码是什么?地址块中共有多少个地址?相当于多少个C类地址?
- u-boot中链接地址和加载地址的相关知识
- 做Talk!软件的知识点滴(1)--如何获取本机的机器名和IP地址?
- 实时弹幕系统的设计与实现
- POJ 3580 splay
- NSCache 缓存类源码分析
- Jstree增加刷新回调方法
- Postgresql删除重复数据
- [初级知识]如何正确nandflash的块地址和页地址
- 深浅拷贝解析
- 基础备忘:关于传值与传引用的讨论
- 策略模式详解——参考《Head First设计模式》
- mysql init_connect 参数的其他用处
- oracle学习笔记-表的管理-(8)
- 线性表的链式实现(单链表)——无独立表头的实现
- OPC同步读取和异步读取-------OPC(第七篇)
- 我整理的PHP 7.0主要新特性