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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用IO模擬方式讀寫三星系列的NAND FLASH

          用IO模擬方式讀寫三星系列的NAND FLASH

          作者: 時間:2017-06-04 來源:網(wǎng)絡 收藏
          三星系列的NAND FLASH芯片容量從8MB到256MB(最近聽說有1G容量的了),對于需要大容量數(shù)據(jù)存儲的嵌入式系統(tǒng)是一個很好的選擇,尤其是其接近1MB/元的高性價比,更是普通nor flash無法比擬的。本文以K9F2808U0C為例,采用AVR芯片連接,進行了初步的讀寫試驗,完成了芯片的ID讀出功能。

          電路連接如下圖:


          左邊是所使用的AVR芯片ATmega16L的局部電路,右邊是K9F2808芯片的連接圖,數(shù)據(jù)/地址總線使用ATmega16的PORTB端口連接,其它全部所需信號線使用IO連接,組成了。

          K9F2808芯片的全部命令字如下:

          其中,Read1讀取的是普通數(shù)據(jù)存儲區(qū)域的數(shù)據(jù),Read2讀取的是每頁存儲器附加的16Bytes區(qū)域的數(shù)據(jù);Page Program可以編程一頁最大528Bytes的數(shù)據(jù),Block Erase擦除指定頁面數(shù)據(jù),Read Status可以讀取芯片狀態(tài)。

          芯片的整個讀寫時序可以分解為4個基本步驟,即1、命令寫入,2、數(shù)據(jù)寫入,3、數(shù)據(jù)讀出,4、地址寫入。

          1、命令寫入時序如下:

          對應函數(shù)為:
          void WriteCmd(unsigned char cmd)
          {
          nandPortD = 0xFF;
          ClsLine(nandSPortO,nandALE);
          ClsLine(nandSPortO,nandnCE);
          SetLine(nandSPortO,nandCLE);
          ClsLine(nandSPortO,nandnWE);
          nandPortO = cmd;
          SetLine(nandSPortO,nandnWE);
          ClsLine(nandSPortO,nandCLE);
          SetLine(nandSPortO,nandALE);
          }

          2、數(shù)據(jù)寫入時序如下:

          對應函數(shù)為:
          void WriteByte(unsigned char Wdata)
          {
          nandPortD = 0xFF;
          SetLine(nandSPortO,nandnWE);
          ClsLine(nandSPortO,nandCLE);
          ClsLine(nandSPortO,nandnCE);
          ClsLine(nandSPortO,nandALE);
          ClsLine(nandSPortO,nandnWE);
          while((nandSPortI nandRnB) != nandRnB); // wait busy end
          nandPortO = Wdata;
          while((nandSPortI nandRnB) != nandRnB); // wait busy end
          SetLine(nandSPortO,nandnWE);
          }

          3、數(shù)據(jù)讀出時序如下:

          對應函數(shù)為:
          unsigned char ReadByte(void)
          {
          unsigned char Rdata;
          nandPortD = 0x00;
          SetLine(nandSPortO,nandnWE);
          ClsLine(nandSPortO,nandCLE);
          ClsLine(nandSPortO,nandALE);
          ClsLine(nandSPortO,nandnCE);
          ClsLine(nandSPortO,nandnRE);
          while((nandSPortI nandRnB) != nandRnB); // wait busy end
          Rdata = nandPortI;
          while((nandSPortI nandRnB) != nandRnB); // wait busy end
          SetLine(nandSPortO,nandnRE);
          return Rdata;
          }

          4、地址寫入時序如下:

          對應函數(shù)為:
          void WriteByteAdd(unsigned char Add)
          {
          nandPortD = 0xFF;
          SetLine(nandSPortO,nandnWE);
          ClsLine(nandSPortO,nandnCE);
          ClsLine(nandSPortO,nandCLE);
          SetLine(nandSPortO,nandALE);
          ClsLine(nandSPortO,nandnWE);
          nandPortO = Add;
          SetLine(nandSPortO,nandnWE);
          while((nandSPortI nandRnB) != nandRnB); // wait busy end
          ClsLine(nandSPortO,nandALE);
          }

          其余操作方式均從這四種基本操作組合變化而來,適當調(diào)用或者重新編寫其中的某些語句就能完成全部的K9F2808芯片讀寫操作。

          下面以讀K9F2808芯片ID為例調(diào)用以上函數(shù)完成。
          讀芯片ID的時序如下圖:

          實現(xiàn)函數(shù)編寫為:
          void ReadId(unsigned char *ptr)
          {
          WriteCmd(0x90);
          WriteByteAdd(0x00);
          *ptr++ = ReadByte();
          *ptr = ReadByte();
          SetLine(nandSPortO,nandnCE);
          }
          函數(shù)調(diào)用后,*ptr的值為0xEC,即廠家代碼;*(ptr+1)的值為0x73,即設備代碼。

          實際在芯片的讀寫操作中,還要注意對壞扇區(qū)進行檢錯,并將檢錯結果存入芯片的第一個塊中,以確保數(shù)據(jù)的讀寫地址均為有效地址。


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();