• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

    電路連接如下圖:


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

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

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

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

    1、命令寫入時(shí)序如下:

    對(duì)應(yīng)函數(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í)序如下:

    對(duì)應(yīng)函數(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í)序如下:

    對(duì)應(yīng)函數(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í)序如下:

    對(duì)應(yīng)函數(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);
    }

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

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

    實(shí)現(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,即設(shè)備代碼。

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


    關(guān)鍵詞: IO模擬方式 NANDFlash

    評(píng)論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 邓州市| 张掖市| 麟游县| 上饶县| 肥东县| 宁远县| 邹平县| 南投市| 石楼县| 兴化市| 县级市| 井研县| 汶上县| 平度市| 巴林左旗| 屏东市| 曲阜市| 贡觉县| 崇义县| 阿勒泰市| 土默特右旗| 泸西县| 长海县| 广东省| 峨眉山市| 清原| 民丰县| 化州市| 连州市| 肇州县| 孟州市| 睢宁县| 德钦县| 泸西县| 正镶白旗| 孝昌县| 富源县| 南投县| 桦南县| 荣昌县| 黎川县|