我的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,
大家不要搞错了,发现国人抄袭严重啊,却不真正实践。
发现不能上传源代码,没法与大家共享代码了。