微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于NAND Flash的大容量立体封装芯片在嵌入式系统中的应用

基于NAND Flash的大容量立体封装芯片在嵌入式系统中的应用

时间:11-27 来源:电子产品世界 点击:

摘要: NAND Flash应用的困难在于管理和需要特殊的系统接口。本文介绍了一种利用MCU存储器管理接口结合I/O口来实现NAND Flash存储结构的搭建和管理的方法,并介绍底层的驱动程序。

元件介绍

基于sparc 架构的MCU

S698-MIL 是珠海欧比特控制工程股份有限公司为了满足嵌入式应用而开发的32 位RISC 高性能嵌入式微处理器,它遵循SPARC V8 构架。

S698-MIL 内部配置了32 位整数处理单元(IU),32/64 位浮点处理单元(FPU)。

S698-MIL 的应用软件开发环境具有很强的灵活性,除了可以使用欧比特公司提供的专用多任务嵌入式实时操作系统ORION 外,开发者还可以选择如RTEMS、VxWorks等现今流行的嵌入式操作系统进行开发。

S698-MIL 可应用于包括税控收款机、银行POS 机、电力系统等高端工业控制领域和消费电子领域以及高性能高可靠的航空、航天及武器领域。

NAND Flash结构的存储芯片

目前的Flash memory 主要包括以下两大类:针对程序和数据存储的NOR flash ;针对大容量存储的NAND flash 。其中,NOR 的特点为芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM 中,随机读取快、功耗低、稳定性高;而NAND 的特点为容量大、写速度快、芯片面积小。

VDNF64G08是一个快速、高存储密度的随机访问存储器。它由8个8G位的NAND Flash芯片堆叠而成,结构见图2。整个模块采用堆叠技术,它们之间的互相连接线非常短,寄生电容小。这种芯片非常适用于高速、高性能、高容量的嵌入式系统中。

VDNF64G08对一个2048(+64)字节的页进行典型的编程操作只要200μs的时间,对一个128K(+4K)大小的块进行擦除需要1.5ms的时间,对页中一个字节的读周期为25ns。它的I/O管脚既作地址和数据的输入输出口,也作为命令的输入口。VDNF64G08的片上写控制器能自动完成所有的编程、擦除功能包括产生所需的脉冲重复和内部数据校验。VDNF64G08能擦除和编程百万次以上,并通过ECC 或实时制定算法保证擦除和编程的可靠性。

硬件设计

由于S698没有专用的NAND Flash的专用接口,所有NANDFlash与S698-mil的通信使用GPIO实现,NAND Flash的IO口与S698-mil的GPIO0低8位GPIO0[7 :0]连接,用于数据,地址,命令的传输。NAND Flash的片选信号使用S698-mil的低3位地址线ADD[2 :0],通过3-8译码实现,其中3-8译码器使用S698-mil的IOCS0控制工作,防止对VDNF64G08的误操作。VDNF64G08的读写信号直接与S698-mil的读写信号相连,如果线路较长可以考虑串联一个49.9R的电阻。命令锁存CLE,地址锁存ALE分别使用S698-mil的地址线ADD[3],ADD[4]。状态信号RB上拉10kΩ电阻到电源,不再与S698-mil相连,VDNF64G08的状态信息通过IO口读寄存器实现,以节约S698-mil的端口资源。写保护端口上拉10kΩ到电源,否则不可擦除及编程。相关连接见图2。

软件设计

根据前面的介绍,通过图3的硬件连接方式,可以实现对芯片的读写,擦除等控制操作,已可以满足各种场合的应用,S698-mil处理器是通过GPIO来操作控制VDNF64G08的,所以需要对底层操作需要比较了解,下面简单介绍一些常用操作的实现。

S698-mil芯片GPIO0对应的寄存器地址为0x2000 0000 – 0x27ff ffff,因为VDNF64G08芯片位宽是8bit的,所以需要把MCU的GPIO位宽也定义成8bit,根据前面的硬件连接可以知道地址低3位对应到VDNF64G08芯片的片选信号,add[4]对应到CLE,add[5]对应到ALE,为了方便编程,这里做以下宏定义 :
  #define NF_ADDREG(CE) (*(volatile unsigned char *) (0x20000010 + CE))
  #define NF_CMDREG(CE) (*(volatile unsigned char *) (0x20000008 + CE))
  #define NF_DATAREG(CE) (*(volatile unsigned char *) (0x20000000 + CE))

读芯片ID

根据芯片指令表,可以知道读ID芯片只需要写入命令0x90,然后在写入地址0x0即可,详细操作可以根据以下时序图进行:
  int readID(unsigned char CE,unsigned IDlength)
  {
  unsigned char ID[],i;
  NF_CMDREG(CE) = 0x90;
  NF_ADDREG(CE) = 0x0;
  delayed(1);
  for(i = 0;i < IDlength;i++)
  {
  ID[i] = NF_DATAREG(CE);
  }
  i = i - 1;
  printf("CHIP CE d% ID:0x%x",ID[0]);
  while(i){
  printf("-%x",ID[IDlength - i]);
  i --;
  }
  printf("\n\r");
  }

芯片坏块查询

由于NAND Flash的工艺不能保证NAND 的Memory Array在其生命周期中保持性能的可靠

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

网站地图

Top