s3c2440 K9F2G NandFlash

我的NandFlash具體型號是:

K9F2G08U0C

希望訪問NandFlash的數據,發現NandFlash的配置非常容易:

 

NFCONF = (2<<12) | (2<<8) | (1<<4);

NFCONT = (1<<4) | (1<<1) | (1<<0);

手冊上說,需要reset, 可以加上

    //nand reset
    {
        int k = 0;
        NFCONT &= ~(1<<1);
        while(k++ < 10);
        NFCMMD = 0xff;
        while (!(NFSTAT & 1));
        NFCONT |= 1<<1;
    }

這樣就可以訪問NandFlash了,datasheet很重要,此flash讀數據需要5個地址指令。

我自己定義的函數:

nand_address_cmd(unsigned int address)

如果地址是0,沒有問題,可以正確讀取從Flash0x0開始的地址,但是如果

nand_address_cmd(4096);

希望讀取從4096開始的數據,發現不正確,經過調試,查找資料,終於發現原來的方法有問題,如下:

nand_address_cmd(unsigned int address)

{

  unsigned char ch;

  ch = address & 0xFF;

  NFADDR = ch;

  ch = (address >> 8) & 0x0F;

  NFADDR = ch;

  ch = (address >> 12)& 0xFF;

  NFADDR = ch;

  ch = (address >> 20) & 0xFF;

  NFADDR = ch;

  ch = (address >> 28) & 0x01;

  NFADDR = ch;

}

修改以後:

#define NAND_SECTOR_SIZE_LP    2048
#define NAND_BLOCK_MASK_LP     (NAND_SECTOR_SIZE_LP - 1)

        unsigned int ch;

        unsigned int col  = address & NAND_BLOCK_MASK_LP;
        unsigned page = address / NAND_SECTOR_SIZE_LP;

        ch = col & 0xff;
        NFADDR = ch;
        ch = (col >> 8) & 0x0f;
        NFADDR = ch;
        ch = page & 0xff;
        NFADDR = ch;
        ch = (page >> 8) & 0xff;
        NFADDR = ch;
        ch = (page >> 16) & 0x01;
        NFADDR = ch;

原因在於地址的讀取順序,先列,後行,所以需要轉換。大家可以在網上搜索找到更加詳細的分析,我就不獻醜了。

 

另外補充一點:

發現網上資料好多都是抄襲,丫的,明明s3c2440手冊定義:

NFDATA 一次讀取的int,不是char,

s3c2410讀取的纔是char,

大家不要搞錯了,發現國人抄襲嚴重啊,卻不真正實踐。

 

發現不能上傳源代碼,沒法與大家共享代碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章