新聞中心

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

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

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

        電路連接如下圖:


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

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

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

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

        1、命令寫入時序如下:

        對應函數為:
        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、數據寫入時序如下:

        對應函數為:
        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、數據讀出時序如下:

        對應函數為:
        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、地址寫入時序如下:

        對應函數為:
        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);
        }

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

        下面以讀K9F2808芯片ID為例調用以上函數完成。
        讀芯片ID的時序如下圖:

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

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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 东平县| 渝中区| 菏泽市| 左云县| 灌云县| 久治县| 辽阳市| 马公市| 永丰县| 荔浦县| 宜兰市| 东乡| 临漳县| 卢氏县| 大邑县| 盐源县| 兴仁县| 淳化县| 中西区| 碌曲县| 凤冈县| 原阳县| 旌德县| 阿勒泰市| 凤翔县| 靖安县| 佛坪县| 南召县| 银川市| 青州市| 琼结县| 青阳县| 多伦县| 龙川县| 乌鲁木齐县| 会东县| 哈巴河县| 本溪市| 济源市| 巫溪县| 亚东县|