总结NAND FLASH控制器的操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NAND FLASH相对于NOR FLASH而言,其容量大,价格低廉,读写速度都比较快,因而得到广泛应用。NOR FLASH的特点是XIP,可直接执行应用程序,
1~4MB时应用具有很高的成本效益。但是其写入和擦除的速度很低直接影响了其性能。
NAND FLASH不能直接执行程序,用于存储数据。在嵌入式ARM应用中,存储在其中的数据通常是读取到SDROM中执行。因为NAND FLASH主要接口包括
几个I/O口,对其中的数据都是串行访问,无法实现随机访问,故而没有执行程序。
NAND FLASH接口电路是通过NAND FLAH控制器与ARM处理器相接的,许多ARM处理器都提供NAND FLASH控制器,为使用NAND FLASH带来巨大方便。
K9F2G08U0B是三星公司的一款NAND FLASH产品。
K9F2G08U0B包含8个I/O,Vss、Vcc、以及控制端口(CLE、ALE、CE、RE、WE、WP、R/B)。其存储结构分块。
共2K 块
每块大小16 页
每页大小2K + 64BYTE
即容量=块数×页数×每页大小=2K×16×(2K + 64BYTE)=256M BYTE + 8M BYTE
NAND FLASH控制器提供了OM[1:0]、NCON、GPG13、GPG14、GPG15共5个信号来选择NAND FLASH启动。
OM[1:0]=0b00时,选择从NAND FLASH启动。
NCON:NAND FLASH类型选择信号。
GPG13:NAND FLASH页容量选择信号。
GPG14:NAND FLASH地址周期选择信号。
GPG15:NAND FLASH接口线宽选择。0:8bit总线宽度;1:16bit总线宽度。
访问NAND FLASH
1)发生命令:读、写、还是擦除
2)发生地址:选择哪一页进行上述操作
3)发生数据:需要检测NAND FLASH内部忙状态
NAND FLASH支持的命令:
#define CMD_READ1 0x00 //页读命令周期1
#define CMD_READ2 0x30 //页读命令周期2
#define CMD_READID 0x90 //读ID 命令
#define CMD_WRITE1 0x80 //页写命令周期1
#define CMD_WRITE2 0x10 //页写命令周期2
#define CMD_ERASE1 0x60 //块擦除命令周期1
#define CMD_ERASE2 0xd0 //块擦除命令周期2
#define CMD_STATUS 0x70 //读状态命令
#define CMD_RESET 0xff //复位
#define CMD_RANDOMREAD1 0x05 //随意读命令周期1
#define CMD_RANDOMREAD2 0xE0 //随意读命令周期2
#define CMD_RANDOMWRITE 0x85 //随意写命令
将NAND FLASH与NAND FLASH控制器硬件连接好了,需要配置GPACON、NAND FLASH。
1)配置GPACON
将GPA17~GPA22设置为NAND FLASH控制器信号(即NAND FLASH的控制信号)。rGPBCON |= (0x3F<<17);
2)配置NAND FLASH
主要是初始化寄存器NFCONF中的TACLS、TWRPH0、TWRPH1这三个位。
TACLS:表征了CLE/ALE锁存信号优秀奥到写使能这段时间,= HCLK时钟周期 × TACLS TWRPH0:表征了写使能的持续时间。 = HCLK时钟周期 × (TWRPH0 + 1)
TWRPH1:表征了写无效到锁存无效之间的时间。 = HCLK时钟周期 × (TWRPH1 + 1) TACLS、TWRPH0、TWRPH1的值由NAND FLASH手册中的tCLS-tWP、tWP、tCLH确定。
初始化NAND FLASH:
1)寄存器NFCONT,用于开启NAND FLASH控制器;
2)向寄存器NFCMD写入命令;
3)向寄存器NFADDR写入地址;
4)使用寄存器NFDATA进行数据的读写,在此期间需要不断的检测寄存器NFSTAT来获知NAND FLASH的状态(忙/闲);
写NAND FLASH:
1)发送页写入命令0x80;
2)发送页地址;
3)发送要写入的数据;
4)发送写入确定命令0x10;
5)检测忙信号;
读NAND FLASH:
1)发送页读取命令0x00;
2)发送页地址;
3)发送页读取确认命令0x30;
4)检测忙信号;
5)从ARM处理器寄存器NFDATA中读取数据。
为什么读写读需要两次命令呢?
接收到第一个命令时数据先被写入到NAND FLASH的数据寄存器(Data regirester & S/A)里,接收到第二个命令后数据才写到对应的存储单元中。
接收到第一个读命令时先进行读读操作开始,接收到第二个读命令时数据从内部存储单元中复制到NAND FLASH的数据寄存器(Data regirester & S/A)里。
擦除NAND FLASH:
1)块擦除命令0x60;
2)发送块地址;
3)块擦除确认命令0xD0;
4)检测忙信号。
杨国文
2012年5月7日 15:03:15
void NF_Init(void)
{
rGPACON &= ~(0x3F<<17);//配置为NAND FLASH控制器
rGPACON |= (0x3F<<17);
rNFCONF = ((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4));//设置时序参数
rNFCONT = ((0<<12)|(1<<0));//关闭加密,使能NAND FLASH控制器
/*一定要关闭加密位,不然没有办法写入,加密位处在NFCONT第12位,
该位初始状态为1(加密),需要注意不能使用或,直接赋值*/
rNFSTAT = 0;//有关状态位清零
NF_Reset();
}
注意:
rNFCONT |= ((0<<12)|(1<<0));//这样写的话是一定不能实现向nandflash写入数据的!
今天下午因为没有仔细阅读数据手册,而误以为加密位的初始状态为0而使用或操作,造成不能正确读写nandflash。调试了一下午,才发现问题了。擦,原来就这么点问题!
下午的实验同时也练习了一下UART的使用,不过是其很简单的用法,采用查询的方式发送接收数据。