张东磊
【摘要】在公司现有硬件平台基础上,开发设计测试程序对NORFLASH存储芯片进行测试。实验结果表明,该测试程序的设计能避免由于无测试工具而无法测试到的储存区块损坏造成的设备运行异常,并实现测试自动化。
【关键词】NORFLASH;存储芯片;测试程序
NOR FLASH技术是Intel于1988年开发的,其特点是芯片内执行,即应用程序可以直接在FLASH闪存内运行,不必再把代码读到系统RAM中,是现在市场上主要的非易失闪存技术之一。其传输效率高,在1~4MB的小容量时具有很高的成本效益[1]。基于其特点NOR FLASH存储芯片市场应用率高,而目前没有专门对NOR FLASH存储芯片进行测试的工装和工具。本文就笔者开发的NOR FLASH存储芯片测试程序予以详细分析。
图1 NORFLASH硬件原理图
图2 NORFLASH命令定义
1.NOR FLASH存储芯片
NOR FLASH是INTEL在1988年推出的一款商业性闪存芯片,它能够提供完整的寻址与数据总线,并允许随机存取存储器上的任何区域,而且它可以忍受一万次到一百万次抹写循环,是早期的可移除式闪存储媒体的基础。NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行)。因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质。NOR FLASH的读取和RAM类似,只要能够提供数据的地址,数据总线就能够正确的给出数据。而对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。
为了便于访问,从支持的最小访问单元来看,NOR FLASH一般分为8位的和16位的(也有很多NOR FLASH芯片同时支持8位模式和16位模式)具体的工作模式通过特定的管脚进行选择。FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元。对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR。FLASH的擦除操作一般都是以SECTOR,BANK或是整片FLASH为单位的。
图3 测试程序主流程图
2.设计测试程序
在编写测试程序时,设计三种测试方案:
方案1:
在安装J-link驱动程序时,本身自带一个工具J-FLASH ARM.exe,可以对NOR FLASH进行单次的读、写、擦除操作,并且可以测试读、写、擦除的速度。由于本工具不是开源的,不能够增加和修改功能,基于单次操作的局限性,放弃方案1。但是在编写测试程序时,可以参考本工具的功能设计。
方案2:
通过对嵌入式系统移植的研究,发现可以通过移植U-boot对存储设备进行操作,而且u-boot對于存储设备的操作驱动是经过IT精英共同验证过的。但考虑到刚开始接触系统移植,在短时间内无法完成测试程序的编写,所以放弃方案2。
方案3:
在公司现有的监控平台上,增加对存储设备的读、写、擦除操作。本方案不需要重新设计硬件平台,大大节省了设计的时间。本测试程序可以对NORFLASH存储芯片进行读写测试和寿命测试。在测试过程中,如果发现芯片读写错误,本程序可以通过串口将错误信息打印到调试工具供用户查看。测试过程中不需要用户参与,实现测试自动化。
本次测试是编写存储设备的测试程序,可以长时间对存储设备进行读、写、擦除操作,从而可以验证存储设备的特性:在高温条件下,对存储设备进行读、写、擦除操作中正确无误;存储设备的读、写、擦除操作有一定的次数限制。
图4 读写操作
3.测试NOR FLASH存储芯片
在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1。为了保证写操作的正确性,在执行写操作前,都要执行擦除操作。擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH的值全修改为0xFF。这样,写操作就可以正确完成了。
由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常。在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page)。接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface,CFI)所界定的。与用于随机存取的ROM不同,NOR FLASH也可以用在存储设备上。
在NOR FLASH的读取数据的方式来看,它与RAM的方式是相近的,只要能够提供数据的地址,数据总线就能够正确的挥出数据。考虑到以上的种种原因,多数微处理器将NOR FLASH当做原地运行(Execute in place,XIP)存储器使用,这其实意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行。
本测试中硬件平台使用的ARM芯片是S3C 2410,该芯片具备外接NORFLASH的引脚,下面是S3C2410和NORFLASH的接线图如图1所示。
本平台使用的ARM芯片型号为S3C2410,NORFLASH型号为AM29LV160DB,下文将用ARM代替S3C2410,NORFLASH代替AM29LV160DB。
NORFLASH有2种读写模式:8位模式和16位模式。对8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据。例如一块8-BIT的NOR FLASH,假设容量为4个BYTE。那芯片应该有8个数据信号D7-D0和2个地址信号,A1-A0。地址0x0对应第0个BYTE,地址0x1对应于第1BYTE,地址0x2对应于第2个BYTE,而地址0x3则对应于第3个BYTE对16位的NOR FLASH芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据。例如,一块16-BIT的NOR FLASH,假设其容量为4个BYTE。那芯片应该有16个数据信号线D15-D0和1个地址信号A0。地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORD。通过上图地址线的连接方式可知,NORFLASH使用的字模式。上图中,LADDR1连接A0为字模式,LADDR0连接A0为字节模式。
基于芯片的测试需求,测试程序主要有2个功能:第1个允许用户可以设置擦写次数,以便用户进行芯片寿命的测试。第2个根据用户设置擦写次数,向芯片的35个扇区写0,然后检测扇区的数据是否为0。
NORFLASH数据手册中对芯片的操作有专有的命令,如圖2所示。
芯片ID检测功能:
如图2中Manufacturer ID命令定义,通过下面的命令可以得到芯片的Manufacturer ID:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x9090);
manId=_RD(0);
如图2中Device ID命令定义,通过下面的命令可以得到芯片的Device ID:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x9090);
devId=_RD(0x1);
从图2中可以得到manId为0x01,devId为0x2249。
基于扇区的擦除功能
如图2中Sector Erase命令定义,通过下面的命令可以擦除芯片对应的扇区:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x8080);
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(BADDR2WADDR(targetAddr),0x3030);
数据写入NorFlash功能
如图2中program命令定义,通过下面的命令将对应数据写到NorFlash中:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0xa0a0);
*tempPt=data;
将NORFLASH数据读到SDRAM功能
NORFLASH的读取操作,不需要特殊的命令,它的操作和SDRAM的操作一样。
基于以上介绍的驱动函数的功能,我们可以灵活的使用它们编写自己的应用程序,我们本次实验的目的是设计NORFLASH芯片的测试程序,函数流程图如图3所示。
测试程序开始之前,需要设置NOR FLASH的读写次数,这个读写次数可以进行作为芯片寿命测试的参考。设置完成以后,选择“对整个NOR FLASH写0”命令,然后测试程序按照图3的流程进行。
在程序进行读写操作过程中,测试程序会顺序对35个扇区进行读写操作,并将操作结果通过串口打印出来。读写操作流程图如图4所示。
4.结束语
基于公司现有硬件平台设计的NOR FLASH存储芯片程序,可以帮助我们进行NOR FLASH芯片的自动化测试,有效防止了由于NOR FLASH没有本地坏区管理,一旦存储区块发生毁损,可能会出现导致设备发生异常,并且实现测试自动化,节省了测试时间,也保证了测试的精度,确保了NOR FLASH存储芯片的稳定可靠性。
参考文献
[1]李亚峰,欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京:清华大学出版社,2007.