日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何正确nandflash的块地址和页地址

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何正确nandflash的块地址和页地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[初級知識]如何正確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的块地址和页地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。