微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > Nand-flash存储器工作原理及其操作实例(以K9F1208UOB为例)

Nand-flash存储器工作原理及其操作实例(以K9F1208UOB为例)

时间:09-11 来源: 点击:

串行数据写入完成后,需要写入"页写入确认"指令10h,这条指令将初始化器件的内部写入操作。如果单独写入10h而没有前面的步骤,则10h不起作用。10h写入之后,K9F1208UOB的内部写控制器将自动执行内部写入和校验中必要的算法和时序,这时系统控制器就可以去做别的事了。

  内部写入操作开始后,器件自动进入"读状态寄存器"模式。在这一模式下,当RE和CE为低电平时,系统可以读取状态寄存器。可以通过检测R/B的输出,或读状态寄存器的状态位(I/O 6)来判断内部写入是否结束。在器件进行内部写入操作时,只有读状态寄存器指令和复位指令会被响应。当页写入操作完成,应该检测写状态位(I/O 0)的电平。

  内部写校验只对没有成功地写为0的情况进行检测。指令寄存器始终保持着读状态寄存器模式,直到其他有效的指令写入指令寄存器为止。

  1.2.3 块擦除

  擦除操作是以块为单位进行的。擦除的启动指令为60h,块地址的输入通过两个时钟周期完成。这时只有地址位A14到A24是有效的,A9到A13则被忽略。块地址载入之后执行擦除确认指令D0h,它用来初始化内部擦除操作。擦除确认命令还用来防止外部干扰产生擦除操作的意外情况。器件检测到擦除确认命令输入后,在WE的上升沿启动内部写控制器开始执行擦除和擦除校验。内部擦除操作完成后,检测写状态位(I/O 0),从而了解擦除操作是否有错误发生。

  1.2.4 读状态寄存器

  K9F1208UOB包含一个状态寄存器,该寄存器反应了写入或擦除操作是否完成,或写入和擦除操作是否无错。写入70h指令,启动读状态寄存器周期。状态寄存器的内容将在CE或RE的下降沿处送出至I/O端口。

  器件一旦接收到读状态寄存器的指令,它就将保持状态寄存器在读状态,直到有其他的指令输入。因此,如果在任意读操作中采用了状态寄存器渎操作,则在连续页读的过程中,必须重发00h或50h指令。

  1.2.5 读器件ID

  K9F1208UOB器件具有一个产品鉴定识别码(ID),系统控制器可以读出这个ID,从而起到识别器件的作用。读ID的步骤是:写入90h指令,然后写入一个地址00h.在两个读周期下,厂商代码和器件代码将被连续输出至I/O口。

  同样,一旦进入这种命令模式,器件将保持这种命令状态,直到接收到其他的指令为止。

  1.2.6 复位

  器件提供一个复位(RESET)指令,通过向指令寄存器写入FFh来完成对器件的复位。当器件处于任意读模式、写入或擦除模式的忙状态时,发送复位指令可以使器件中止当前的操作,正在被修改的存储器宏单元的内容不再有效,指令寄存器被清零并等待下一条指令的到来。当WP为高时,状态寄存器被清为C0h.

  2 系统硬件连线及软件设计

  2.1硬件连线

  K9F1208UOB和S3C2440A的接口电路如图2所示。

  

  图2 K9F1208UOB与S3C2440A硬件电路

  2.2 软件设计

  步骤1:Nand-Flash初始化

  利用ADS1.2等工具建立工程文件nandflash_test.mcp,在Nand.c文件中Test_K9S1208子函数实现了主要测试功能。

  gpacon = rGPACON;

  rGPACON=(rGPACON &~(0x3f《17))|(0x3f《17);

  首先备份rGPACON的内容,再设置GPA17-22的工作方式。然后调用Nand-Flash初始化函数。

  NF8_Init0;//初始化函数

  初始化函数的实现源码如下:

  rNFCONF=(TACLS《12)|(TWRPH0《8)I(TWRPH1《4)|(0《0):

  rNFCONT=(0《13)|(0《12)|(0《10)|(0《9)|(0《8)|(1《6)|(1《5)|(1《4)|(1《1)|(1《0):

  步骤2:读器件ID码

  由于S3C2440A中没有像支持SDRAM 一样提供直接与Nand-flash存储器的接口,读写的过程要靠软件编程来完成。初始化Nand-Flash后,就可以对Nand-Flash进行操作了。

  程序调用NF8_Print_Id()子函数读出器件ID码。

  id=NF8_CheckId(); //继续调用子函数

  device=(U8)id;

  maker=(U8)(id》8):

  Uart_Printf("Maker:%x,Device:%x ",maker,device);

  NF8_Print_Id()源码如下:

  NF_CMD(0x90);//写入90h指令

  NF_ADDR(0x0);//写入地址00h

  for(i=0;i《10;i++);

  Uart_Printf("NFSTAT:0x%x ",rNFSTAT);

  id=NF_RDDATA8()《8;//Maker code 0xec读出ID值

  id |=NF_RDDATA8();

  //Devide code(K9S1208V:0x76),(K9K2G16U0M:0xca)

  步骤3:页读写程序

  本实验实现了某页的写及读出验证功能。Test_NFS_Rw子函数实现这一功能。

  程序首先初始化要写入的数据,*dstPt是要读出验证的数据,先填0;*srcPt是要写入的数据,先用随机数填满。

for(i=0;i《512;i++) *dstPt++=

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top