使用三星公司的K9F1G08U0D芯片做文件系统,首先要对K9F1G08U0D Nand芯片比较熟悉,整个网络找遍了,都找不到完全相对应的文档,只能找到K9F1G08U0A的手册,看到网上人家说K9F1G08U0A与K9F1G08U0C、D是有区别的,实际也找不到C的手册,可以肯定的是D的程序跟C相同,但跟A不一样,主要在一个状态返回上,C、D表现为0x0C,而A表现为0x0E。
1、首先K9F1G08U0D的存储情况如下 :
1 Block = 64 Page、 1 Page = (2048 + 64)Byte、 一个芯片共有1024 Blocks
我相信上面一行比起文档里面一页的描述是来地简单的,主要要理解1Page里面怎么要2048+64,不直接用结果来表示,因为64字节是用于其它信息用的,比如保存坏块数等,从上面的空间得到有效存储区是128MByte = 1056Mbits。
2、接下来就是对K9F1G08U0D的读写操作了,其实对该芯片的操作可以参考8051 MCU的外部存储总线,原理图如下所示。
其实要比较注意的只有
CLE、ALE、WE、RE、CE这几个管脚,另外8个I/O是数据、址址复用的,这里分别解说一下:
CLE:命令使能管脚,当该管脚为高电平时,I/O上的操作为命令的读写操作;
ALE:地址使能管脚,当该管脚为高电平时,I/O上的操作为地址的读写操作(读写分别是操作芯片里面相关地址里的存储数据);
WE:写使能管脚,当该管脚为低电平时,I/O上为写操作;
RE:读使能管脚,当该管脚为低电平时,I/O上为读操作;
CE:是整个芯片的使能管脚,这里面接的是LPC1788的CS1,对应
0x90000000地址。
需要注意的是CLE、ALE这两个管脚接到LPC1788的EMC的A24、A25是很巧妙的,这样子就有了以下宏定义:
#define EMC_NAND_BASE 0x90000000
#define EMC_ALE_ADDR 0x01000000
#define EMC_CLE_ADDR 0x02000000
#define EMC_DATA8 *((volatile U8 *)(EMC_NAND_BASE)) // 数据
#define EMC_ADDR8 *((volatile U8 *)(EMC_NAND_BASE + EMC_ALE_ADDR)) // 地址
#define EMC_CMD8 *((volatile U8 *)(EMC_NAND_BASE + EMC_CLE_ADDR)) // 命令
3、
另外有个要注意的地方是芯片内部的地址
。
从上图可以看到,
Column Address、Row Address这两个概念,分别代表
列地址、行地址。可以这样理解,
Col地址是每个Page里面的详细字节位置;Row地址是整个芯片的Page绝对地址,这一句话是非常重要的,因为在写代码时,很多人就搞混乱了,包括NXP官网的例程。
4、另外读写里面数据就看芯片手册给的命令了。