Nand Flash内存结构分析
/*
*硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
*软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统,
*参考资料:K9F2G08U0C datasheet,http://blog.chinaunix.net/uid-28834618-id-3620422.html
*/
一、芯片图分析
对于我们所使用的这块K9F2G08U0C芯片,通过电路与原理图可以知道如下信息:
1、I/O线只有8条,位宽位8位(bit0-bit7)
2、1 Nand Flash = 2048 Blocks = 2112Mbits = 256MB = 2Gb
3、1 Block = 64 Pages = 132KB
4、1 Page = 2112 B = 2KB(datafield)+ 64B(OOB)
二、Page分析
在CPU进行读、写、擦除操作时,只关心数据,不需要看OOB,这里就没有画出OOB区。
1 Page = 2112 B = 2KB(datafield)+ 64B(OOB)
2112B -1 = 1000 0011 1111,共12bits,对应上图的A[11:0]
结论一:1st与2nd Cycle发出的是一个Page中,该列与该Page第一个列的相对地址,即图中对应的0,1,2…2047列。
三、Block分析
在CPU进行读、写、擦除操作时,只关心数据,不需要看OOB,这里就没有画出OOB区。
1 Block = 64 Pages = 132KB
64 = 11 1111,共6bits,对应图中的A[12:17]
结论二:3rd Cycle发出对应的是:一个Block中,该Page与该Block第一个Page的相对地址,即上图所画的0,1,2…63 Page。
四、Device分析
1 Device = 2048 Blocks = 2112Mbits = 256MB = 2Gb
2048 = 111 1111 1111,共11bits,对应图中的A[18:28]
结论三:3rd Cycle的A[18:19],4th Cycle的A[20:27]与5th的A[28]对应:一个Device中,该Block与该Device第一个Block的相对地址,即上图所画的0,1,2…2047Block。
五、读、写、擦除操作分析
对于flash的读写都是以一个page开始的,而擦写则是以一个block为单位的。按照这种组织方式形成三类地址:
Column Address:列地址——对应结论一的A[0:7]
Page Address: 页地址——对应结论二的A[8:17]
Block Address: 块地址——对应结论三的A[18:28]
1、读写操作
读写都是以一个page为单位,加上由于自身位反转的特性,所以我们写入的数据操大于2048Bytes时,也是可以成功写入。
下面使用上一篇文章中所编写写操作程序进行分析:
void nand_write(unsigned int addr,unsigned char *buf,int len);
void do_write_nand_flash(void)
{
unsigned int addr;
unsigned char str[100];
/* 获取地址 */
printf("Enter the address of sector to write: ");
addr = get_uint();
/* 获取写入信息 */
printf("Enter the address to write: ");
gets(str);
nand_write(addr,str,strlen(str)+1);
printf("writing ...\n\r");
}
unsigned char str[100] 这一个参数,是用来存储我们所写入到Nand Flash的数据,数据类型为:unsigned char,即对于字符数组中,每一位str[n]的数据大小都为1Byte。即是1个Page中一列可以存储的数据大小。
通过运行截图可以印证:
2、擦除操作
擦写则是以一个block为单位的,这个可通过时序图与具体程序运行进行验证:
时序图中,发送的地址只有Row Address,即结论三中的地址:
具体运行程序截图:
可以发现,当我们擦除地址为0x100100中的数据时,会擦除0x100000对应的块的数据。