图片:
最开始看2440test里的nand.c代码,对照datasheet 一直没弄明白它里面的地址周期的指令(如上图),后来看到http://aiothome.net/read.php?tid-3795.html帖子,里面版主说K9F1G08U0B 是每页2K,column地址应该是(A0~A10) 而A11~A26为page和block地址,A27可以不要。我觉得这样就可以解释Nand_ReadSectorPage2048()函数,如下STATIC int Nand_ReadSectorPage2048(U32 sector, U8 *buffer)
{
U32 page, data_addr;
Nand_Reset();
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(0x00);
page = sector/4;
data_addr = 512 *(sector%4);
NF_ADDR(data_addr&0xff);
NF_ADDR((data_addr>>8)&0xff);
NF_ADDR(page&0xff);
NF_ADDR((page>>8)&0xff);
NF_ADDR((page>>16)&0xff);
NF_CMD(0x30);
NF_DETECT_RB();
__RdPage512(buffer);
NF_nFCE_H();
return OK;
}
上面第5个地址周期是针对大于128MB的flash设计的,K9F1G08U0B会自己忽略,也就是说可以去掉!
但是当我看到Nand_IsBadBlockPage2048()函数时,发现函数读到column地址是2048(Spare feild),我知道K9F1G08U0B flash PAGE READ 命令是将整个页column地址后面的数据都可以读出来,包括Main和Spare。由于上面对地址周期的认识,column地址的寻址范围就只有0~2047,也就是Spare Field不能随机读取。但是这里的代码寻址为2048,就感觉不符合上面的解释。
于是我猜想K9F1G08U0B的column地址就是A0~A11(0~4095),这样就可以随机访问2048以后的数据;而page和block地址为A12~A27。但是这里需要注意:A11是不会反映在PAGE READ的读取地址里,它只有在具体函数命令里根据需要才有意义(如Nand_IsBadBlockPage2048()函数),而PAGE READ地址数据的A11~A26才是page和block地址。如果是这样,那么就可以很好解释datasheet和nand.c里的程序!!
不知道我的理解是不是正确的,希望大家给个答复,谢谢!!!!STATIC int Nand_IsBadBlockPage2048(U32 block)
{
U32 Page;
U8 BAD;
Page = block << 6;
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(0x00);
NF_ADDR(0);
NF_ADDR((2048>>8)&0xff);
NF_ADDR(Page&0xff);
NF_ADDR((Page>>8)&0xff);
NF_ADDR((Page>>16)&0xff);
NF_CMD(0x30);
NF_DETECT_RB();
BAD = NF_RDDATA8();
NF_nFCE_H();
return BAD != 0xff;
}
以下是根据我的理解,写的一个示例int NAND_READ_PAGE(U32 addr)
{
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(0x00);
NF_ADDR();
NF_ADDR(); //1st和2nd地址周期发送column地址(0~2111),若是访问Main feild,NF_ADDR(addr&0xff);NF_ADDR((addr>>8)&07);
NF_ADDR((addr>>11)&0xff);
NF_ADDR((addr>>19)&0xff);
NF_ADDR ((addr >> 27) & 0xff); // >128M flash 有效
NF_CMD(0x30);
NF_DETECT_RB();
·········
}
[ 此帖被shell110在2010-03-10 20:17重新编辑 ]