嵌入式系统中K9F5608U0MNAND闪速存储器的应用
内容导读:
嵌入式系统中K9F5608U0MNAND闪速存储器的应用 电子科技大学孙天亮陈伟元王豪才 摘要简要介绍SAMSUNG公司的NAND闪速存储器K9F5608U0M的结构、功能、接口特性、与微控制器的接口方式、内部数据的保护方法以及读写程序等。对在嵌入式系统中使用NAND闪速存储器有一定参考价值。 关键词闪速存储器器件操作数据保护驱动程序图1功能块图引言 K9F5608U0M是一个32M×8bit(附带有1024K×8bit的备用区)的NAND闪速存储器。它的NAND单元为固态大容量存储器市场提供了最合适的解决方案。编程操作编程528B(字节)页的典型时间为200μs,擦除操作在16KB的块上执行的典型时间是2ms。页中的数据可以每字节50ns的循环时间读出。I/O引脚作为地址和数据的输入/输出端口以及命令的输入端口。片上的写控制器自动化了所有的编程和擦除操作,这包括编程和擦除所要求的脉冲重复和内部数据的验证和合并(margining)。即使是写密集型的系统也能够通过提供ECC(Error Correcting Code)和实时映射算法来利用K9F5608U0M的具有100K编程/擦除周期的扩展可靠性。K9F5608U0M\ YCB0/YIB0是一个对(诸如固态文件存储和其它要求非易失性的便携式应用的)大容量非易失性存储应用的最好的解决方案。K9F5608U0M\ MCB0是卡式封装的,最适于在诸如智能电话和半导体音频播放器等便携式应用中作为外部存储扩展。本文着重讨论K9F5608U0M\ YCB0/YIB0的结构、功能、接口特性等及其在嵌入式系统中的应用。 一、 内部结构与引脚功能 图1是K9F5608U0M\ YCB0/YIB0的功能块图。图2是K9F5608U0M\ YCB0/YIB0的48引脚TSOP1封装图。 图248引脚的TSOP1封装图引脚功能如下: 命令锁存使能(CLE):高电平时,命令在WE信号的上升沿锁存入命令寄存器。 地址锁存使能(ALE):高电平时,地址在WE信号的上升沿锁存入地址寄存器。 片选(CE):低电平时选中该器件。 写使能(WE):命令、地址和数据在WE脉冲的上升沿被锁存。 读使能(RE):串行数据输出控制。高电平时,数据被驱动到I/O总线上。 备用区使能(SE):高电平时选中备用区。 输入/输出端口(I/O 0~I/O 7):用于输入命令、地址和数据,并在读周期中输出数据。当芯片未被选中或输出被禁止时,输出呈高阻。 写保护(WP):提供了写/擦除保护。低电平时,内部的高电压生成器被复位。 就绪/忙(R/):该输出指示了器件的操作状态。低电平时,表明一个编程、擦除或随机读操作正在进行;高电平时,表明操作已完成。 二、 接口方式 图3K9F5608U0M与微处理器的接口示意图K9F5608U0M通过数据总线与微控制器进行接口。命令、地址、数据通过数据总线发送到存储器。存储器的数据也通过数据总线传送给微控制器。K9F5608U0M与EP7209的接口示意图如图3所示。EP7209是美国Cirrus公司的产品,是一个用于个人数字音频解决方案的完全的片上集成系统(本利第10期《基于ARM核的音频解码器单芯片系统》一文中将具体介绍EP7209)。它被特别设计为在对功耗敏感的应用中实现音频处理算法。该器件的核心逻辑功能是建立在一个ARM720T嵌入式处理器之上的。 图3中,nMOE是内存输出使能端,低电平有效;nMWE是内存写使能端,低电平有效;nCS1是低电平有效的片选信号;PB4、PB5、PB6是通用输入/输出端口;D7~D0是数据总线的低8位。 在图3中,K9F5608U0M的WP引脚与一个跳线开关相连。正常工作时,跳线开关断开;需要进行硬件写保护时,跳线开关闭合。 三、 器件操作 K9F5608U0M的地址是多路复用进8个I/O端口,能有效地减少引脚数目,并允许系统在升级到将来的密度时能够维持系统板设计的一致性。 命令、地址和数据都是通过I/O端口写入的,条件是在CE为低电平时,将WE变为低电平。数据在WE的上升沿锁存。命令锁存使能(CLE)和地址锁存使能(ALE)分别是用于通过I/O引脚复用命令和地址的。 所有的命令要求一个总线周期。块擦除命令和页编程是例外,它们需要两个周期:一个周期用于建立,另一个周期用于执行操作。表1定义了K9F5608U0M的特有命令集。 表1命令集 功能[]第一个周期[]第二个周期[]器件忙时该命令是否可接受读1[]00h/01h[]-读2[]50h[]-读ID[]90h[]-复位[]FFh[]-[]是页编程[]80h[]10h块擦除[]60h[]D0h读状态[]70h[]-[]是1. 页读 图4读流程图刚上电时,器件处在默认的模式——Read1模式。一旦页读命令已锁存,它就不需要在以后的页读操作中再次写入。有三种类型的读操作:随机读、串行页读和连续行读。随机读模式在页地址改变时被使能。对连续行读来说,在最后一列的数据输出后,下一页会被自动选中。Read1和Read2命令的工作方法就如同将一个指针指向主区或备用区。读流程图如图4所示。 2. 页编程 器件的编程操作是以页为基础的,但在一个页编程周期中允许对多个部分页(一个字节或连续的多个字节)编程。一个页编程周期由一个串行数据加载阶段后接一个不可缺少的编程阶段组成;在数据加载阶段,多达528B的数据可以被加载到页寄存器;在编程阶段,已加载的数据编程入恰当的单元。 输入串行数据输入命令(80h)及紧随其后的三个周期的地址将开始串行数据加载。那些不进行编程的字节不需要加载。页编程确认命令(10h)启动编程过程。但单独输入10h而在此之前没有输入串行数据将不会启动编程过程,内部写控制器自动执行编程和检验所需要的算法和时序,这减轻了系统控制器的负担。 一旦编程过程开始,就可以输入读状态寄存器命令(RE和CE为低电平)以读出图5编程流程图状态寄存器的内容。通过检测R/输出或状态寄存器的状态位(I/O 6),系统控制器能够检测到编程周期的完成。在编程进行时,只有读状态命令和复位命令有效。 页编程结束时,可以检测写状态位(I/O 0)。内部写校验仅检测“1”没有被成功地编程为“0”的错误。编程结束后,命令寄存器保持在读状态命令模式直到另一个有效命令被写入到命令寄存器。页编程流程图如图5所示。 3. 块擦除 擦除操作以块为基础。块地址加载由擦除建立命令(60h)启动,在两个周期中完成。仅地址A14~A24有效,A9~A13被忽略。紧随块地址加载的擦除确认命令(D0h)启动内部擦除过程。这一先建立再执行的两图6擦除流程图步命令时序确保了内存内容不会由于外部噪声条件而意外擦除。擦除确认命令输入后,WE信号的上升沿将使内部写控制器开始处理擦除和擦除校验。当擦除操作完成后,可以检查写状态位(I/O 0)。块擦除流程图如图6所示。 4. 读状态 K9F5608U0M含有一个状态寄存器。通过检查状态寄存器的内容可以知道编程或擦除操作是否完成以及编程或擦除操作是否成功。在将命令70h写入命令寄存器后,一个读周期将状态寄存器的内容输出到I/O引脚(在CE或RE的下降沿,这取决于哪一个最后发生)。命令寄存器保持在读状态模式直到新的命令到来。 5. 读ID K9F5608U0M包含有一个产品鉴定模式,将90h写入命令寄存器并紧接着输入一个地址00h将启动这一模式。两个读周期顺序地输出产品代码(ECh)和器件代码(75h)。命令寄存器保持在读ID模式直到新的命令被写入。 6. 复位 K9F5608U0M提供了一个复位特性,通过将FFh写入命令寄存器来实施。当器件处于忙状态时(随机读、编程或擦除期间),复位操作将中断这些操作。正在被改变的内存单元的内容将不再有效,因为这一内容可能部分被编程或擦除了。命令寄存器被清除以等待下一条命令。 四、 片内数据写保护 K9F5608U0M被设计为能够对电源变化时的意外编程/擦除提供保护。在VCC小于大约2V时,一个内部电压探测器将使所有的功能无效。 WP引脚提供了硬件保护,并被推荐为在上电和关电时保持在VIL,如图7所示。编程/擦除的两步命令时序提供了额外的软件保护。 图7电源跳变的交流波形图五、 典型读写程序 采用图3所示的连接关系时,用ARM汇编语言编写的K9F5608U0M的典型读写程序如下: ;定义器件的内存位置 INTERNAL_REGISTERSEQU0x00200000 NAND_FLASHEQU0x00300000 ;数据从单元阵列拷贝到页寄存器所需要的延时 DELAYEQU0x00000100 AREA Assembly$$code , CODE, READONLY;表明 ;是只读代码区 ; ;函数NANDReadPage从NAND闪存器中读取一页数据。 ;页号传到寄存器r0,存放读回数据的地址传到r1。 ; EXPORTNANDReadPage NANDReadPage stmdb〖〗r13!, {r4-r6}〖〗;保存将要使用的寄存器〖1〗ldr〖〗r2, =INTERNAL_REGISTERS〖2〗;加载指向内部寄存器的指针〖1〗ldr〖〗r3, =NAND_FLASH〖2〗;加载指向NAND闪速存储器的指针〖1〗ldrb〖〗r4, \[r2, #1\]〖〗;获取端口B的当前值〖1〗bic〖〗r4, r4, #0x40〖〗;选择NAND闪速存储器〖1〗strb〖〗r4, \[r2, #1\]〖1〗orr〖〗r4, r4, #0x10〖〗;使CLE有效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r5, =0x00000000〖〗;写入read1命令〖1〗str〖〗r5, \[r3\]〖1〗bic〖〗r4, r4, #0x10〖〗;使CLE无效〖1〗strb〖〗r4, \[r2, #1\]〖1〗orr〖〗r4, r4, #0x20〖〗;使ALE有效〖1〗strb〖〗r4, \[r2, #1\]〖1〗str〖〗r5, \[r3\]〖〗;写入地址〖1〗and〖〗r5, r0, #0x000000ff〖1〗str〖〗r5, \[r3\]〖1〗mov〖〗r5, r0, lsr #8〖1〗and〖〗r5, r5, #0x000000ff〖1〗str〖〗r5, \[r3\]〖1〗bic〖〗r4, r4, #0x20〖〗;使ALE无效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r5,=DELAY;等待数据从单元阵列拷贝到页寄存器1 subsr5, r5, #1 bne%b1 ldr〖〗r6, =0x00000200;从该页中读取数据2 ldrr5, \[r3\] strbr5, \[r1\], #1 subsr6, r6, #1 bne%b2 orr〖〗r4, r4, #0x40 ;取消对NAND闪速存储器的选择〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldmia〖〗r13!, {r4-r6}〖〗;恢复寄存器〖1〗mov〖〗pc, lr〖〗;返回到调用程序〖1〗LTORG; ;函数NANDWritePage向NAND闪存器写入一页数据。 ;要进行编程的页的页号传到r0,指向要编程的数据的指针 ;传到r1。 ; EXPORTNANDWritePage NANDWritePage stmdb〖〗r13!, {r4-r6}〖〗;保存要使用的寄存器〖1〗ldr〖〗r2, =INTERNAL_REGISTERS〖2〗;加载指向内部寄存器的指针〖1〗ldr〖〗r3, =NAND_FLASH〖2〗;加载指向NAND闪速存储器的指针;Get the current value of port B. ldrb〖〗r4, \[r2, #1\]〖〗;获取端口B的当前值〖1〗bic〖〗r4, r4, #0x40〖〗;选择NAND闪速存储器〖1〗strb〖〗r4, \[r2, #1\]〖1〗orr〖〗r4, r4, #0x10〖〗;使CLE有效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r5, =0x00000080〖〗;写入“连续数据输入”命令〖1〗str〖〗r5, \[r3\]〖1〗bic〖〗r4, r4, #0x10〖〗;使CLE无效〖1〗strb〖〗r4, \[r2, #1\]〖1〗orr〖〗r4, r4, #0x20〖〗;使ALE有效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r5, =0x00000000〖〗;写入地址〖1〗str〖〗r5, \[r3\]〖1〗and〖〗r5, r0, #0x000000ff〖1〗str〖〗r5, \[r3\]〖1〗mov〖〗r5, r0, lsr #8〖1〗and〖〗r5, r5, #0x000000ff〖1〗str〖〗r5, \[r3\]〖1〗bic〖〗r4, r4, #0x20〖〗;使ALE无效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r6, =0x00000200〖〗;向该页写数据1 ldrbr5, \[r1\], #1 strr5, \[r3\] subsr6, r6, #1 bne%b1 orr〖〗r4, r4, #0x10〖〗;使CLE有效〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldr〖〗r5, =0x00000010〖〗;写入编程命令〖1〗str〖〗r5, \[r3\]〖1〗bic〖〗r4, r4, #0x10〖〗;使CLE无效〖1〗strb〖〗r4, \[r2, #1\]〖1〗orr〖〗r4, r4, #0x40;取消对NAND闪速存储器的选择〖1〗strb〖〗r4, \[r2, #1\]〖1〗ldmia〖〗r13!, {r4-r6}〖〗;恢复寄存器〖1〗mov〖〗pc, lr〖〗;返回到调用程序〖1〗LTORG; ;函数NANDWaitForProgram等待NAND闪速存储器上的 ;编程或擦除操作完成 ; EXPORTNANDWaitForProgram NANDWaitForProgram stmdb〖〗r13!, {r4}〖〗;保存要使用的寄存器〖1〗ldr〖〗r0, =INTERNAL_REGISTERS〖2〗;加载指向内部寄存器的指针〖1〗ldr〖〗r1, =NAND_FLASH〖2〗;加载指向NAND闪速存储器的指针〖1〗ldrb〖〗r2, \[r0, #1\]〖〗;获取端口B的当前值〖1〗bic〖〗r2, r2, #0x40〖〗;选择NAND闪速存储器〖1〗strb〖〗r2, \[r0, #1\]〖1〗orr〖〗r2, r2, #0x10〖〗;使CLE有效〖1〗strb〖〗r2, \[r0, #1\]〖1〗ldr〖〗r3, =0x00000070;写入“读状态”命令〖1〗str〖〗r3, \[r1\]〖1〗bic〖〗r2, r2, #0x10〖〗;使CLE无效〖1〗strb〖〗r2, \[r0, #1\]〖1〗ldr〖〗r4, =0x00000040〖2〗;等待NAND闪速存储器上的操作完成0 ldrr3, \[r1\] andr3, r3, r4 cmpr3, r4 beq%f2 ldrr3, =0x00000080 1 subsr3, r3, #1 bne%b1 b%b0 2 orr〖〗r2, r2, #0x40〖〗;取消对NAND闪速存储器的选择〖1〗strb〖〗r2, \[r0, #1\]〖1〗ldmia〖〗r13!, {r4}〖〗;恢复寄存器〖1〗mov〖〗pc, lr〖〗;返回到调用程序〖1〗LTORG〖1〗END结束语 本文简要介绍了如何在嵌入式系统中使用NAND闪速存储器。给出了对NAND闪速存储器进行读写的典型程序。希望本文能够为嵌入式系统的开发人员提供一个如何使用NAND闪速存储器的参考。MES 参考文献 1Datasheet of K9F5608U0M\ YCB0, K9F5608U0M\ YIB0, K9F5608U0M\ MCB0. SAMSUNG Electronics, Apr.29,2000 2Dave Jaggar. ARM Architecture Reference Manual. Prentice Hall, July 26, 1996 3EP7209 Datasheet. Cirrus Logic, Dec.,1999
标签:
来源:单片机与嵌入式系统应用 作者:电子科技大学 孙天亮 陈伟元 王豪才 时间:2006/2/12 0:00:00