FLASH存储器的在系统编程及其在DSP系统中的应用
[b]摘要:[/b]ATMEL公司生产的串行Flash AT45系列存储器的容量已达到了16Mb,常用于数据存储系统。文中以AT45D041为例,详细介绍了该系列Flash存储器的命令集以及串行SPI接口的应用方法,并给出了相应的模式时序。[b]关键词:[/b]SPI Flash Buffer 中断 AT45D041
现在,数字信号处理器(DSP)正越来越多地应用到各种场合。而FLASH存储器已成为DSP系统的一个基本配置,主要用于存放用户程序代码。目前FLASH存储器正在从单纯的EPROM的替换件演变为许多电路系统中的不可缺少的组成部分。
将用户程序代码装入FLASH存储器的方法有三种。一种方法是要求供应商在存储器发货前将数据写入,但无法满足产品开发阶段用户修改程序的要求。另一种方法是用户使用编程器自己编程。但由于芯片制造工艺的提高,芯片集成度越来越高,FLASH存储器正在向小型化、贴片式发展,从而使表面贴装或PLCC封装的FLASH存储器难以利用编程器编程。第三种方法是将存储器安装到用户电路板上进行编程。这包括现在普通采用的在系统编程(In System Programming,ISP)。这种编程方式是通过系统的微处理器实现对FLASH存储器的编程,不需要其它编程设备和附加编程电源,具有灵活、方便的优点,因此广泛应用在DSP系统中。本文结合TMS320C3X系列DSP的上电引导表的产生及烧写方法分析FLASH存储器的在系统编程技术。
[b]1 FLASH存储器的系统编程技术[/b]
1.1 AMF400B FLASH存储器简介
AMF400B是AMD公司生产的FLASH存储器,这种FLASH存储器编程简单,下面以此为例对FLASH存储器的编程进行介绍。
AMF400B的主要特点有:仅需5V单电源供电可使内部产生高电压进行编程和擦除操作;完全支持JEDEC单电源FLASH存储器标准;支持在系统编程,用户只需向其命令寄存器写入标准的微处理器指令,具体编程、擦除操作便由内部电路实现;主系统可以通过查询特定的管脚或数据线监控编程、擦除操作是否完成;可以对某一扇区进行操作,而不影响其它部分的数据;有硬件数据保护功能,以防止误操作。
1.2 编程命令
虽然用户仅需向FLASH存储器的特定寄存器写入地址和数据命令,就可对FLASH存储器编程,但是如果写入的地址和数据错误或写入的顺序不正确,就会导致FLASH存储器复位。下面介绍几个最常用的编程命令。
读数据命令:该命令不需要特定的时序,在电路上电或内部编程擦除操作结束后,自动进入读数据状态。只需给出要读取的地址,即可读出该地址的内部。
复位命令:该命令使存储器复位,并进入读数据状态。向任何一个地址写入数据0xF0就能使FLASH存储器复位。在进行编程、擦除和自动选择命令模式之前,都应先复位。此外,在编程或擦除等正常操作中若出现错误,也应写复位命令退出。
自动选择命令:该命令可以使主系统读取存储器生产厂家、设备代码以及是否被保护等信息。
编程命令:该命令是一个4总线周期指令。以两个解锁周期开始,紧接着一个编程建立命令,最后是要编程的地址和数据。写完该地址和数据后,内置编程算法自动启动,进行FLASH存储器编程。编程算法完成后,进入读取数据状态。编程时序如表1所示。
[b]表1 编程时序[/b]
周 期
1,2(解锁)
3(建立)
4(用户数据)
地 址
0x555,0x2AA
0x555
编程地址
数 据
0xAA,0x55
0xA0
编程数据
[b]表2 擦除时序[/b]
周 期
1,2(解锁)
3(建立)
4,5(解锁)
6(擦除)
地 址
0x555,0x2AA
0x555
0x0x555,0x2AA
0x555
数 据
0xAA,0x55
0x80
0xAA,0x55
0x10
擦除命令:该命令有片擦除和扇区擦除两种。两种擦除命令基本相似,片擦除指令用得较多,这里仅介绍擦除指令。片擦除命令是一个6总线周期的操作,也以两个解锁周期开始,接着一个建立周期,再接着两个解锁周期,最后是擦除周期。该擦除命令启动内部擦除算法,自动完成擦除操作。其时序如表2所示。
由于只有擦除命令能使“0”变为“1”,而编程指令不能使“0”写为“1”,所以用户在进行FLASH存储器烧写时,应先擦除,再进行编程。
1.3 FLASH存储器操作的检查机制
对采用在系统编程的FLASH存储器,整个烧写过程都由用户控制,用户必须了解FLASH存储器的各状态位,以便知道编程或擦除是否完成。
FLASH内部提供了几个供用户读取的状态位。
[img]http://usbing.com/uploads/embed/store/20086257452160977801.gif[/img]
其中常用的有:数据线的DQ2(跳变位)、DQ5(超时标志位)、DQ6(跳变位)、DQ7(数据查询位)和管脚RY/BY#。
有三种方法可以判断某种操作是否进行完。一种是判断管脚RY/BY#的状态。在编程、擦除或擦除悬挂操作过程中,RY/BY#管脚为“0”;操作完成后变为“1”。另一种是用DQ7t DQ5判断。DQ7位在编程或擦除过程中输出的是写入该位数据的反码,而当操作完成时,该位输出变为写入该位的数据,因此查询此位可以判断操作进程。但还要读取DQ5的状态,若为“1”,操作超时,应再读一次DQ7的状态,若DQ7输出仍不是写入的数据,则操作失败,应将FLASH复位。其流程如图1所示。还有一种是检测跳变位。在对FLASH存储器进行编程或擦除时,对任何地址进行连续的读会引起DQ6不断跳变,而一旦操作结束就停止跳变。其流程如图2所示。
1.4 FLASH存储器的操作程序
采用前面的命令字和操作进程检测方法,用户就可以用DSP编程语言编写FLASH存储器操作程序了。下面给出擦除和编程子程序的部分代码。
/*Sample codes for erase and program*/
cerase: PUSH DP
PUSH R0
… /*擦除命令*/
chkc: LDI AR0,R0 NOP /检查擦除是否完成*/
NOP
XOR*AR0,R0
BNZ chkc
POP R0
POP DP
RETS
sprg:PUSH DP
PUSH R0
… /*编程命令*/
chkp:LDI *-AR2(1),R0 /*检查编程是否完成*/
NOP /*检查编程是否完成*/
NOP
XOR *-AR2(1),R0
BNZ chkp
POP R0
POP DP
RETS
[b]
[color=red'][1][/color]
[2] 下一页[/b]