总结NAND FLASH控制器的操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的使用,不过是其很简单的用法,采用查询的方式发送接收数据。

相关文档
最新文档