[初级知识]如何正确nandflash的块地址和页地址

2016年09月07日 16:13:42

阅读数:1891

结论

  • 块地址 从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) ;    //小问号认为按照这句命令的理解:块地址就是块数,                                                        //求得块的数量就是块的地址,这个数量是一个块的总数量,                                                        //块总数量等于块的最大数,并且把最大块数定为块地址,                                                       //这与我们平常理解的定义地址一般是最小数(值)有些不                                                       //同,这一点要注意这一点。
                                                  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

有的时候,我们看网上有的人说,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; //小问号同样认为,此语句可以理解为页地址就是在给定Nand的某个地址后,求得页的数量就是
                            //页的地址,这个数量是一个页的总数量,总数量等于页的最大数,并且把最大页数定为页地址,                            //这与我们平常理解的定义地址一般是最小数(值)有些不同,要注意这一点。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

有的时候,我们看网上有的人说,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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

有人或许会很好奇,你这写法为什么跟我在数据手册上看到的不一样,数据手册明明跟这不一样,而且你这种写法如何对得上数据手册中的地址周期值呢?我们不妨先解决这个疑问,用数据手册上的地址周期写法来实现一组代码,我们就按照下面的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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

以上这两种实现方法其实大同小异,第一种方法是用page_addr来实现的,而第二种方法是用block_addr的方法实现的,这两种方法实现其实是一模一样的,并没有什么差别。(小问号认为这里为何出现了页擦除和块擦除两种方法?,老师不是讲擦除只能是块擦除吗?)

如何正确nandflash的块地址和页地址相关推荐

  1. RFID卡片的扇区与块地址的计算

    RFID卡片的扇区与块地址的计算 本文档为本人在自学RFID卡片数据读取过程中所写的笔记,RFID卡片的扇区与块地址如下表所示(RFID卡片数据读取原理请自行百度),本文档内容仅供学习参考.由于本人学 ...

  2. RFID卡片的扇区与块地址的关系

    RFID卡片的扇区与块地址的计算 本文档为本人在自学RFID卡片数据读取过程中所写的笔记,RFID卡片的扇区与块地址如下表所示(RFID卡片数据读取原理请自行百度),本文档内容仅供学习参考.由于本人学 ...

  3. 华为服务器如何设置网站dns,设置为正确的DNS 服务器地址

    设置为正确的DNS 服务器地址 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器.通过华为云注册成功的域名默认使用华为云DNS进行解析,详细内容,请参见华为云DNS对用户提供域 ...

  4. 如何正确获取 wifi mac地址

    获取wifi mac地址 今日研读讯飞 AIUI SDK 对其工具类的实现 进行一下简单记录 正式版本中使用的功能 值得我们借鉴 getWifiMac 为每一个设备设置对应唯一的SN(最好使用设备硬件 ...

  5. 如何正确获取手机IP地址

    随着手机功能的不断完善,手机网站的开发日趋简单,所以很多人都趋于用html不限定宽度的方式来写电脑网页.同样的,手机浏览器也不单单只支持wml格式的文件.除了不支持JS脚本程序以外,和电脑访问几乎没有 ...

  6. 计算机ip配置不正确怎么办,电脑ip地址不对该怎么办

    @ ECHO OFF color 0A :name set /p cname=请输入计算机名: echo REGEDIT4 c:\windows\reg.reg echo [HKEY_LOCAL_MA ...

  7. input输入邮箱使用正则限制正确格式的邮箱地址

    <input type="text" title="email" required pattern="^[a-z0-9]+([._\\-]*[a ...

  8. java soot_正确执行3个地址代码的SOOT API

    我在运行SOOT API时遇到问题 . 我正在使用 java -cp soot-2.5.0.jar soot.Main -f jimple test 我遇到以下错误: Exception in thr ...

  9. 纠正几个NANDFLASH很容易犯的错误

    今天在看别人如何根据物理地址计算NANDFLASH的列地址(column addres)和页地址(page address),结果看到这篇文章时,感觉有点不对劲.http://blog.csdn.ne ...

  10. NAND FLASH

    NAND Flash 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用. 1. 概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输.地址 ...

最新文章

  1. 关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题
  2. Intel Realsense D435小车避障 摄像头在高于一定平面h时的深度map公式计算(深度d与视场角视角α的关系)
  3. document.getElementsByName 标准
  4. c语言创建一个顺序表主函数,用C语言来创建一个顺序表(数据结构部分)
  5. 使用Architecture Explorer分析应用程序及使用层次图
  6. php add action,WordPress学习——add_action()详解
  7. 快速了解什么是RSA加密算法
  8. mysql没有索引删除一亿数据_mysql数据库如何实现亿级数据快速清理
  9. Mark:SQL Server关于CAST和CONVERT的区别和用法
  10. 2021五一建模a题完整论文
  11. Wireshark通过TCP协议抓取QQ好友IP以及定位
  12. 《Python编程-从入门到实践》
  13. mongodb php auth,mongodb 3.0改变了authMechanism
  14. いくつかの愛に心が飛作者が恋しい
  15. 学习 PixiJS — 小精灵冒险
  16. linux raid 找回文件,Linux下软RAID的实现与数据恢复
  17. Cannot access ‘router‘ before initialization
  18. IF/RF数据转换器中的数字信号处理
  19. Java学习: wait和notify方法、ThreadLocal
  20. 你是真的“C”——找单身狗~

热门文章

  1. C# Message类的属性Msg所关联的消息ID
  2. java中多线程介绍
  3. html 渐变背景色,渐变文字颜色
  4. VUE+Element学习笔记之登录页面跳转首页
  5. (二)mybatisPlus实现ActiveRecord(AR)操作
  6. php 星期几大写,php日期转大写
  7. gwt java_GWT中的Java 8支持
  8. UG二次开发之快速重量计算
  9. python 论坛自动发帖功能
  10. 创灵原始与鸿蒙,上古启示录