我的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,
大家不要搞錯了,發現國人抄襲嚴重啊,卻不真正實踐。
發現不能上傳源代碼,沒法與大家共享代碼了。