<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C2410讀寫NandFlash分析

          S3C2410讀寫NandFlash分析

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          一、結(jié)構(gòu)分析
          S3C2410處理器集成了8位NandFlash控制器。目前市場上常見的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k9f1g08、k9f2g08的數(shù)據(jù)頁大小分別為512Byte、2kByte、2kByte。它們在尋址方式上有一定差異,所以程序代碼并不通用。本文以S3C2410處理器和k9f1208系統(tǒng)為例,講述NandFlash的讀寫方法。
          NandFlash的數(shù)據(jù)是以bit 的方式保存在memory cell里的,一般來說,一個cell 中只能存儲一個bit,這些cell 以8 個或者16 個為單位,連成bit line,形成所謂的byte(x8)/word(x16),這就是NAND Device 的位寬。這些Line 組成Page, page 再組織形成一個Block。k9f1208的相關(guān)數(shù)據(jù)如下:
          1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。
          總?cè)萘繛?4096(block數(shù)量)*32(page/block)*512(byte/page)=64Mbyte
          NandFlash以頁為單位讀寫數(shù)據(jù),而以塊為單位擦除數(shù)據(jù)。按照k9f1208的組織方式可以分四類地址: Column Address、halfpage pointer、Page Address 、Block Address。A[0:25]表示數(shù)據(jù)在64M空間中的地址。
          Column Address表示數(shù)據(jù)在半頁中的地址,大小范圍0"255,用A[0:7]表示;
          halfpage pointer表示半頁在整頁中的位置,即在0"255空間還是在256"511空間,用A[8]表示;
          Page Address表示頁在塊中的地址,大小范圍0"31,用A[13:9]表示;
          Block Address表示塊在flash中的位置,大小范圍0"4095,A[25:14] 表示;
          二、讀操作過程
          K9f1208的尋址分為4個cycle。分別是:A[0:7]、A[9:16]、A[17:24]、A[25]。
          讀操作的過程為: 1、發(fā)送讀取指令;2、發(fā)送第1個cycle地址;3、發(fā)送第2個cycle地址;4、發(fā)送第3個cycle地址;5、發(fā)送第4個cycle地址;6、讀取數(shù)據(jù)至頁末。
          K9f1208提供了兩個讀指令,‘0x00’、‘0x01’。這兩個指令區(qū)別在于‘0x00’可以將A[8]置為0,選中上半頁;而‘0x01’可以將A[8]置為1,選中下半頁。
          雖然讀寫過程可以不從頁邊界開始,但在正式場合下還是建議從頁邊界開始讀寫至頁結(jié)束。下面通過分析讀取頁的代碼,闡述讀過程。
          static void ReadPage(U32 addr, U8 *buf) //addr表示flash中的第幾頁,即‘flash地址>>9’
          {
          U16 i;
          NFChipEn(); //使能NandFlash
          WrNFCmd(READCMD0); //發(fā)送讀指令‘0x00’,由于是整頁讀取,所以選用指令‘0x00’
          WrNFAddr(0); //寫地址的第1個cycle,即Column Address,由于是整頁讀取所以取0
          WrNFAddr(addr); //寫地址的第2個cycle,即A[9:16]
          WrNFAddr(addr>>8); //寫地址的第3個cycle,即A[17:24]
          WrNFAddr(addr>>16); //寫地址的第4個cycle,即A[25]。
          WaitNFBusy(); //等待系統(tǒng)不忙
          for(i=0; i<512; i++)
          buf[ i] = RdNFDat(); //循環(huán)讀出1頁數(shù)據(jù)
          NFChipDs(); //釋放NandFlash
          }
          三、寫操作過程
          寫操作的過程為: 1、發(fā)送寫開始指令;2、發(fā)送第1個cycle地址;3、發(fā)送第2個cycle地址;4、發(fā)送第3個cycle地址;5、發(fā)送第4個cycle地址;6、寫入數(shù)據(jù)至頁末;7、發(fā)送寫結(jié)束指令
          下面通過分析寫入頁的代碼,闡述讀寫過程。
          static void WritePage(U32 addr, U8 *buf) //addr表示flash中的第幾頁,即‘flash地址>>9’
          {
          U32 i;
          NFChipEn(); //使能NandFlash
          WrNFCmd(PROGCMD0); //發(fā)送寫開始指令’0x80’
          WrNFAddr(0); //寫地址的第1個cycle
          WrNFAddr(addr); //寫地址的第2個cycle
          WrNFAddr(addr>>8); //寫地址的第3個cycle
          WrNFAddr(addr>>16); 寫地址的第4個cycle
          WaitNFBusy(); //等待系統(tǒng)不忙
          for(i=0; i<512; i++)
          WrNFDat(buf[ i]); //循環(huán)寫入1頁數(shù)據(jù)
          WrNFCmd(PROGCMD1); //發(fā)送寫結(jié)束指令’0x10’
          NFChipDs(); //釋放NandFlash
          }
          四、總結(jié)
          本文以S3C2410處理器和k9f1208系統(tǒng)為例講述了nand flash的讀寫過程。在讀寫過程中沒有考慮到壞塊問題,有關(guān)ecc及壞塊處理問題將在下個專題中講述。


          關(guān)鍵詞: S3C2410讀寫NandFlas

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();