您好,欢迎来到维库电子开发网!
|维库电子通
全球最大的芯片PDF资料下载基地
立即登录 免费注册 维库知道
  首页 > 电子通列表 > EPROM

EPROM

EPROM的简介

回到顶部

    EPROM是指可擦除可程式只读存储器,是一种断电后仍能保留数据的计算机存储芯片.

EPROM的工作原理

回到顶部

    EPROM是可编程器件,主流产品是采用双层栅(二层poly)结构,主要结构如图所示:

    浮栅中没有电子注入时,在控制栅加电压时,浮栅中的电子跑到上层,下层出现空穴.

    由于感应,便会吸引电子,并开启沟道.

    如果浮栅中有电子的注入时,即加大的管子的阈值电压,

    沟道处于关闭状态.这样就达成了开关功能.

    如图2所示,这是EPROM的写入过程,在漏极加高压,电子从源极流向漏极沟道充分开启.在高压的作用下,电子的拉力加强,能量使电子的温度极度上升,变为热电子(hot electrON).这种电子几乎不受原子的振动作用引起的散射,在受控制栅的施加的高压时,热电子使能跃过SiO2的势垒,注入到浮栅中.

    在没有别的外力的情况下,电子会很好的保持着.在需要消去电子时,利用紫外线进行照射,给电子足够的能量,逃逸出浮栅.

    EEPROM的写入过程,是利用了隧道效应,即能量小于能量势垒的电子能够穿越势垒到达另一边.

    量子力学认为物理尺寸与电子自由程相当时,电子将呈现波动性,这里就是表明物体要足够的小.

    就pn结来看,当p和n的杂质浓度达到一定水平时,并且空间电荷极少时,电子就会因隧道效应向导带迁移.

    电子的能量处于某个级别允许级别的范围称为"带",较低的能带称为价带,较高的能带称为导带.

    电子到达较高的导带时就可以在原子间自由的运动,这种运动就是电流.

    EEPROM写入过程,如图3所示,根据隧道效应,包围浮栅的SiO2,必须极薄以降低势垒.

    源漏极接地,处于导通状态.在控制栅上施加高于阈值电压的高压,以减少电场作用,吸引电子穿越.

    要达到消去电子的要求,EEPROM也是通过隧道效应达成的.如图4所示,在漏极加高压,控制栅为0V,翻转拉力方向,将电子从浮栅中拉出.这个动作,如果控制不好,会出现过消去的结果.

如何在EPROM中定义数据?

回到顶部

    对于地址为00H-3FH的64个EEPROM数据存储单元,

    ;分别将数据0-63依次烧写进去,然后再循环读出,显示在8只LED发光二极管

    ;程序清单如下:

    ;************************************

    STATUS   EQU 3H       ;定义状态寄存器地址

    RP0      EQU 5H       ;定义页选位RP0的位地址

    RP1      EQU 6H       ;定义页选位RP1的位地址

    Z        EQU 2H       ;定义0状态位的位地址

    PORTC    EQU 7H       ;定义RC口数据寄存器地址

    TRISC    EQU 87H      ;定义RC口方向控制寄存器地址

    EECON1   EQU 18CH     ;定义写控制寄存器1的地址

    EECON2   EQU 18DH     ;定义写控制寄存器2的地址

    EEDATA   EQU 10CH     ;定义读/写数据寄存器地址

    EEADR    EQU 10DH     ;定义读/写地址寄存器地址

    RD       EQU  0       ;定义读启动控制位位地址

    WR       EQU  1       ;定义写启动控制位位地址

    WREN     EQU  2       ;定义写使能控制位位地址

    EEPGD    EQU  7       ;定义访问目标选择控制位位址

    F        EQU  1       ;定义目标寄存器为RAM的指示符

    W        EQU  0       ;定义目标寄存器为W的指示符

    ADDR     EQU  70H     ;定义地址变量

    DATA1    EQU  71H     ;定义数据变量

    ;*************************************

    ORG     0000H        ;

    NOP                  ;放置一条ICD必须的空操作指令

    GOTO    MAIN         ;

    ORG     0008H        ;

    MAIN

    BCF     STATUS,RP1   ;选体1为当前体

    BSF     STATUS,RP0   ;

    MOVLW   00H          ;设定RC全部为输出

    MOVWF   TRISC        ;

    BSF     STATUS,RP1   ;体3为当前体

    CLRF    ADDR         ;地址变量清0

    CLRF    DATA1        ;数据变量清0

    WRITE

    BSF     STATUS,RP1   ;选定体3

    BTFSC   EECON1,WR    ;上一次写操作是否完成

    GOTO    $-1          ;否!返回继续检测

    BCF     STATUS,RP0   ;选定体2

    MOVF    ADDR,W       ;取地址

    MOVWF   EEADR        ;送地址寄存器

    MOVF    DATA1,W      ;取数据

    MOVWF   EEDATA       ;送数据寄存器

    BSF     STATUS,RP0   ;选定体3

    BCF     EECON1,EEPGD ;选定EEPROM为访问对向

    BSF     EECON1,WREN  ;开放写操作使能控制

    MOVLW   55H         ;

    MOVWF   EECON2       ;送55H到寄存器EECON2(读写内部EEPROM,这句是固定的)

    MOVLW   0AAH         ;

    MOVWF   EECON2       ;送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的)

    BSF     EECON1,WR    ;启动写操作

    BCF     EECON1,WREN  ;禁止写操作发生

    INCF    DATA1,F      ;数据递增

    INCF    ADDR,F       ;地址递增

    MOVF    ADDR,W       ;

    XORLW   D'64'        ;将当前地址与64比较

    BTFSS   STATUS,Z     ;检测=64否

    GOTO    WRITE        ;否!继续写后面单元

    READ1

    DECF    ADDR,F       ;地址递减

    BCF     STATUS,RP0   ;选体2为当前体

    BSF     STATUS,RP1   ;

    MOVF    ADDR,W       ;取地址

    MOVWF   EEADR        ;送地址寄存器

    BSF     STATUS,RP0   ;选体3为当前体

    BCF     EECON1,EEPGD  ;选定EEPROM为访问对象

    BSF     EECON1,RD     ;启动读操作

    BCF     STATUS,RP0    ;体2为当前体

    MOVF    EEDATA,W      ;取数据

    BCF     STATUS,RP1    ;体0为当前体

    MOVWF   PORTC         ;送显LED

    CALL    DELAY         ;调用廷时子程序

    MOVF    ADDR,F        ;检测当前地址

    BTFSS   STATUS,Z      ;是否为0?是!跳一步

    GOTO    READ1         ;否!返回继续读出和显示

    READ2

    INCF    ADDR,F        ;地址递增

    BCF     STATUS,RP0    ;选体2为当前体

    BSF     STATUS,RP1    ;

    MOVF    ADDR,W        ;取地址

    MOVWF   EEADR         ;送地址寄存器

    BSF     STATUS,RP0     ;选体3为当前体

    BCF     EECON1,EEPGD   ;选定EEPROM为访问对象

    BSF     EECON1,RD      ;启动读操作

    BCF     STATUS,RP0     ;体2为当前体

    MOVF    EEDATA,W       ;取数据

    BCF     STATUS,RP1     ;体0为当前体

    MOVWF   PORTC          ;送显LED

    CALL    DELAY          ;调用廷时子程序

    MOVF    ADDR,W         ;检测当前地址与64比较

    XORLW   D'64'          ;

    BTFSS   STATUS,Z       ;是否等于64

    GOTO    READ2          ;否!返回继续读出和显示

    GOTO    READ1          ;返回大循环起点

    ;******************************************

    DELAY

    MOVLW    0             ;

    MOVWF    72H           ;将外层循环参数值256送外层循环寄存器

    DELAY1

    MOVLW     0            ;将内层循环参数值256送内层循环寄存器

    MOVWF    73H           ;

    DECFSZ   73H,1         ;递减廷时程序

    GOTO     $-1           ;

    DECFSZ   72H,1         ;

    GOTO     DELAY1        ;

    RETURN

    ;********************************************

    END

    ;*****************************************************

ROM、PROM、EPROM、EEPROM、Flash ROM六者的关系

回到顶部

    FLASH memory

    FLASH memory指的是"闪存",所谓"闪存",它也是一种非易失性的内存,属于EEPROM的改进产品.它的最大特点是必须按块(Block)擦除(每个区块的大小不定,不同厂家的产品有不同的规格), 而EEPROM则可以一次只擦除一个字节(Byte).目前"闪存"被广泛用在PC机的主板上,用来保存BIOS程序,便于进行程序的升级.其另外一大应用领域是用来作为硬盘的替代品,具有抗震、速度快、无噪声、耗电低的优点,但是将其用来取代RAM就显得不合适,因为RAM需要能够按字节改写,而FLASH ROM做不到.

    ROM

    ROM指的是"只读存储器",即Read-ONly Memory.这是一种线路最简单半导体电路,通过掩模工艺, 一次性制造,其中的代码与数据将永久保存(除非坏掉),不能进行修改.

    PROM

    PROM指的是"可编程只读存储器"既Programmable Red-Only Memory.这样的产品只允许写入一次,所以也被称为"一次可编程只读存储器"(One Time Progarmming ROM,OTP-ROM).PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0,则用户可以将其中的部分单元写入1), 以实现对其"编程"的目的.PROM的典型产品是"双极性熔丝结构",如果我们想改写某些单元,则可以给这些单元通以足够大的电流,并维持一定的时间,原先的熔丝即可熔断,这样就达到了改写某些位的效果.另外一类经典的PROM为使用"肖特基二极管"的PROM,出厂时,其中的二极管处于反向截止状态,还是用大电流的方法将反相电压加在"肖特基二极管",造成其永久性击穿即可.

    EPROM

    EPROM指的是"可擦写可编程只读存储器",即Erasable Programmable Read-Only Memory. 它的特点是具有可擦除功能,擦除后即可进行再编程,但是缺点是擦除需要使用紫外线照射一定的时间.这一类芯片特别容易识别,其封装中包含有"石英玻璃窗",一个编程后的EPROM芯片的"石英玻璃窗"一般使用黑色不干胶纸盖住, 以防止遭到阳光直射.

    EEPROM

    EEPROM指的是"电可擦除可编程只读存储器",即Electrically Erasable Programmable Read-Only Memory.它的最大优点是可直接用电信号擦除,也可用电信号写入.EEPROM不能取代RAM的原应是其工艺复杂, 耗费的门电路过多,且重编程时间比较长,同时其有效重编程次数也比较低.

EPROM巧妙应用之单片机章程

回到顶部

    引  言

    全球各单片机生产厂商在MCS-51内核基础上,派生了大量的51内核系列单片机,极大地丰富了MCS-51的种群,致使MCS-51单片机是目前国内应用最广泛的一种单片机型.其中STC公司推出了STC89系列单片机,增加了大量新功能,提高了51的性能,是MCS-51家族中的佼佼者.早期的单片机控制系统,采用单片机加片外EEPROM配合,来存储一些需要预置的重要参数,并在数码管上显示出来.由于单片机控制的整流器要求实时性很强,而早期EEPROM的写周期在10 ms左右,因此运行参数的预置是在整流器待机的情况下进行的.而很多情况下需要在运行的同时记录数据,如用单片机控制的12脉波汽车电泳整流器要求在运行的同时实时记录重要数据,而且在掉电时不丢失.由于在12脉波整流器中运行的单片机程序,其周期必须小于1.67 ms(交流电网的1个周期是20 ms,除以12就是l_67 ms),这就要求实时记录的时间在1ms以下甚至更短(考虑到程序的执行时间).经查阅资料发现,目前很多EEPROM达不到这个要求[1],即使时间最短的AT89S8252单片机片内.EEP-ROM的写周期也是2.5 ms.本文通过对EEPROM的巧妙应用,实现了整流器在线记录数据的功能.

    1  寻找符合要求的单片机

    设备使用的是Atmel公司的AT89C52(40DIP封装)单片机和EEPROM芯片2817A.要想在不改变原设备电路板的情况下完成要求的功能,就只能在兼容的MCS-51系列单片机中想办法.AT89S8252片内含有2 KB的EEPROM,经编程测试发现,它虽然能实时记录数据并且断电不丢失,但是在向片内EEPROM中记录1个数据时,能引起输出电压和电流的波动,不能满足实际运行的需要.其原因是AT89S8252单片机片内EEPROM的写周期为2.5 ms,超过了1.67 ms的程序的执行周期,从而影响了程序的正常运行.所以执行周期是解决问题的关键.

    STC89C51RC/RD+系列单片机片内含有EEPROM(Data Flash),读1个字节/编程1个字节/擦除1个扇区(512字节)的时间分别为10/μs/60μs/10 ms.编程1个字节的时间为60μs,远小于AT89S8252片内EEPROM 2.5 ms的编程时间,这为解决问题提供了思路.

    2问题的解决

    单片机STC89C55RD+(40DIP封装),其引脚、功能完全与AT89C52兼容,与MCS-51程序也兼容,片内含有20KB的Flash程序存储器,16KB的EEPROM数据存储器.把原用于AT89C52中的程序写到STC89C255RD+中,放到原设备上运行,可长期稳定地运行.经修改的在整流器中运行的单片机程序,实时记录一些数据到STC289C55RD+的EEPROM中,整流器可正常运行,但不能执行扇区擦除操作.执行扇区擦除操作将严重影响整流器的正常运行,引起输出电压和电流的很大波动.执行扇区擦除操作时,从示波器来看整流器的输出间断了20 ms,电压电流显示很大的波动.用示波器捕捉到了EEPROM写时的波形,输出波形暂停了20 ms,1个周波电压,电压波形如图1所示,不执行扇区擦除操作时的波形如图2所示.从图中可以看出,问题得到了很好的解决.

    究其原因,这与EEPROM的特点有关.STC89C5lRC/RD+系列单片机片内的EEPROM,与普通的EEPROM不同.普通的EEPROM有字节读/写功能,不需要擦除,在字节写的时候自动擦除.而STC89C51RC/RD+系列单片机片内的EEPROM,具有Flash的特性,只能在擦除了扇区后进行字节写,写过的字节中不能重复写,只有待扇区擦除后才能重新写,而且没有字节擦除功能,只能扇区擦除.

    3  EEPROM(Data FIash)的巧妙应用

    基于以上EEPROM(Data Flash)不易擦除的特点,可以写后先不擦除.利用EEPROM(Data Flash)容易写、时间短(字节写只有60 μs)的特点,可以充分利用其写的功能.根据汽车电泳整流器的特点:每泳1辆汽车,整流器的输出电流就从0逐渐上升到最大电流,然后又逐渐回到0.从电流的变化可以准确地识别出电泳过的车的数量.每识别出1辆车,就在EEPROM(Data Flash)的1个字节中(起始地址为0000H)写入#01H(也可以是其他数,但不能为#OFFH),然后地址自动加1,等待识别出下一辆车.这样就通过EEPROM(Data Flash)字节地址的方式,间接记录了汽车电泳整流器电泳过的车辆总数,并可在数码管上显示出来.16 KB的EEPROM(Data Flash)可记录16 384辆车.待将计满时,可按擦除按钮擦除EEP-ROM(Data Flash)中的所有扇区,再重新计数.如按每10分钟电泳1辆车,1天工作16小时,可连续记录16 384/60/10×16)=170天.此种方法也可用于对电泳整流器连续工作时间的累计,如每10分钟记录1个数据,可连续记录16 384/(60/10)=2 730小时.

    整流器停机断电后,每次开机给单片机上电时,在初始化程序中,首先从地址#0000H读片内EEPROM的数据,如果数据不为#OFFH,地址自动加1,再读下一个字节,直到所读数据为#OFFH为止.此时EEPROM的地址指针数据,即为前面累加的电泳车辆数(或累计电泳工作时间),可在数码管上显示出来.整流器工作后,按前述

    结语

    结合上产的实际情况,在不改变原设备电路板的情况下,通过使用MCS-51系列兼容单片机STC89C55RD+,巧妙利用其片内EEPROM,实现了在整流器运行的同时记录数据的功能,切掉点情况下不丢失数据.这种方法有效地提高了原设备的功能,给用户的使用到来了极大的方便,并且通过实验验证了此方法是可行的.

基于I2C串行通信的EEPROM在电视中的设计应用

回到顶部

    1 前言

    近年来,数字化电视技术迅猛发展,特别是遥控系统的面市,各厂商在电视机中加人微处理器(MCU),各种人工智能化彩电完全替代了老式电视手动(机械式)控制和记忆方式.随着电视专用MCU功能日益强大,用户使用的功能日趋丰富,所需存储的数据和刷新速度不断提高,先后涌现出各种型号和规格的存储器.目前,电视机中应用最为广泛的是E2PROM.

    因为E2PROM保存着大量与电视机工作状态密切相关的数据,其可靠性就遥控电视而言至关重要,视为第二核心器件.E2PROM与第一核心器件 (MCU)保持通信,并存储电视机的工作信息.有时由于存储数据的丢失造成重大损失,甚至导致数据无法修复.因此,在电视系统中,对于系统数据和用户数据的存储一般采用电可擦除存储器E2PROM.E2PROM具有操作简便、数据存储时间长、存储温度范围广、可擦写次数多等优点.以ATMEL公司推出的 AT24CXX系列为代表的串口通信E2PROM,以其质量可靠、接口简单等优点,逐渐成为电视产品设计中E2PROM的首选器件.

    2 AT24CXX系列简介

    与并行通信存储器相比,串行通信存储器以其占用很少的资源和I/O总线、体积小等优点而应用广泛.典型的串行通信E2PROM AT24CXX是I2C总线串行器件,具有工作电源宽(1.8~5.5 V),抗干扰能力强f输入引脚内置施密特触发器滤波抑制噪声),功耗低(写状态时最大工作电流3 mA),高可靠性(写次数100万次,数据保存100年),支持在线编程等特点.

    图1给出AT24CXX的内部结构框图,SDA引脚可实现双向串行数据传输,在SCL引脚输入时钟信号的上升沿将数据送入E2PROM,并在时钟的下降沿将数据读出.

    根据存储器空间地址的大小,AT24CXX分为C02/2K、C04/4K、C08(A)/8K、C16/16K等多种版本,各版本器件除存储空间不同外,其内部性能基本一致,用户可根据实际使用的条件合理选择相应器件.A2、A1和A0引脚为AT24CXX的硬件连接的器件地址输入引脚.一条总线上最多可挂接8个AT24C02或4个AT24C04或2个AT24C08(A)或1个AT24C16.

    另外,AT24CXX系列器件具有用于硬件数据写保护功能引脚.当该引脚接低电平时,允许器件正常读/写操作;当该引脚接高电平时,器件启动写保护功能.各版本器件的写保护功能说明及存储结构如表1所示.

    3 AT24CXX在彩电中的设计及应用

    虽然AT24CXX外围引脚和元件数很少,接口电路简单,但在实际CRT彩电应用中,由于电视机内存在高压跳火等干扰信号,E2PROM会出现一些"怪"现象,导致电视机工作异常.以下给出导致电视机异常工作的主要现象.

    3.1 非人为因素改变E2PROM部分数据

    这种现象表现为电视机的工作状态在某次开机后工作异常.如果在发现异常后无任何处理,将在一段时间内保持异常状态.最常见现象如系统关键数据 (行、场数据)的突变,这种现象一般是由开机时显像管打火或其他原因导致I2C总线数据线工作异常产生的误操作.出现这种现象时,如果在工厂菜单或用户菜单里根据标准数据调整这些突变的数据,则可以纠正解决;如果这些突变的数据无法调整,则必须采取软件复位、E2PROM赋初始值等方法解决.

    从硬件上预防这种现象的方法大多是在I2C总线的SDA、SCL数据线靠近E2PROM引脚处,与地线间加稳压二极管,从而起到保护总线端口的作用,如图2中的VD1、VD2.根据长期产品跟踪的结果表明,采用此方法E2PROM数据出错率小于3‰.但是此方法只能减小寄存器数据出错率,而不能从根本上消除数据出错,但一般也不会导致E2PROM相应数据区域物理损坏.这种方法的优点是简单易行,几乎不占用器件资源.

    目前最科学的方法是利用E2PROM的写保护功能,AT24C08A的第7引脚是数据通信写保护引脚WP(低电平有效),将其与MCU处理器 I/O接口连接,如图3所示.在E2PROM写操作期间,MCU处理器I/O接口输出低电平,E2PROM允许I2C总线写入数据,而在其他操作过程中,该I/O接口输出高电平,E2PROM不允许I2C总线写入数据.此方法成本低(省去两个稳压二极管),出错率更低,但需软件支持.根据统计,使用 E2FROM写保护功能,数据出错率小于1‰.如果同时使用上述这两种方法,E2PROM数据出错率则更低,效果更佳.

    3.2 E2PROM部分区域物理损坏

    常温下,短期内不会产生E2PROM部分区域物理损坏的现象.由于E2PROM在常温下的可擦写100万次.但在高温下,E2PROM的可擦写数大大降低.如果高温下频繁对E2PROM进行擦写操作,短期内易导致E2PROM部分区域物理损坏.其表现为特定数据无法正常存储,即使使用烧录器强制烧录也不能恢复.判定E2PROM部分区域物理损坏的方法:用烧录器将E2PROM中每个地址分别置0和1状态,可检查有无区域物理损坏.确认是 E2PROM损坏,则必须更换新的E2PROM才能排除电视机的故障.若软件处理不当则引起这种现象.要防止这种情况发生必须从软件着手,从而避免对特定区域频繁操作.典型实例是某高清CRT彩电AFT频率自动跟踪系统及其他一些判别系统的软件设计.以AFT频率自动跟踪系统为例,当环境工作温度及电源电压变化后,高频调谐器会有一定的频率点漂移.软件设计时,频率点偏移后,软件程序应即时记录下新的频率点偏移电压值并将其数值存储到E2PROM指定地址中.高温下,由于相关器件的参数发生变化,频点会随温度升高不断漂移,使E2PROM数据刷新异常频繁,从而导致电视机在高温负荷试验中出现E2PROM 物理损坏.在查明原因后,应对该软件进行修改,将实时存储频点数据方式改为频率跟踪掉电存储方式,即只在电视机关机掉电的情况下记录该数据,这样可减少 E2PROM数据刷新次数,从而解决上述问题.

    4 结语

    E2PROM作为一种通用存储器件,在设计时往往容易忽视一些对其细节方面的考虑,其中一些问题在设计试制阶段被发现并解决,还有一些问题是要在量产乃至售后一段时间后才暴露出来.因此,完整的现代电子产品系统,更多的是需要依靠软硬件相互配合开发,才能使产品的可靠性到达最佳状态.

EEPROM的保护措施在MAXQ环境中

回到顶部

    介绍

    在嵌入式微控制器应用中,通常都要用到非易失性存储器.无论是掉电时维持需要保存的设置,还是存储公司的重要记录,可靠的非易失性存储器都是现代微控制器领域的一个基本单元.

    非易失性存储常常采用外部串行存储器实现.多年以来,该领域用到了数十亿颗类似存储器件,它们的可靠性得到了的广泛认可.目前,存储器可以做到几百字节到1兆字节甚至更大的容量,在每一个需要保持设置的设备中,都能找到这样一个紧凑、廉价的器件.

    包括EEPROM、闪存和旋转式存储器在内,所有类型的非易失性存储器都面临一个共同的问题:写周期被中断时,数据会丢失.一旦在写周期执行过程中掉电,那么即使再恢复电源,也很难修复损坏的数据. 本文提出了一种基于事务的提交-回退机制,用于保护一个外部串行EEPROM存储器件的内容.这些措施同样适用于大多数MAXQ微控制器的内置EEPROM.可以下载本应用的代码文件(ZIP,20.5kb).

    I2C EEPROM的特点

    串行存储器件有多种接口,但最常用的接口是I2C接口.这种总线接口有很多优点:高度标准化的接口;控制器和存储器之间只需两条线;而且具有灵活的时序要求,可以由软件驱动.一个I2C主机可以驱动很多I2C从机,从而最大程度减少了主机的引脚数.

    在所有EEPROM器件中,写周期都要比读周期长的多.因为在写周期过程中,电荷需要借助隧道效应并通过绝缘层进行转移,而这个过程很费时间.虽然增加电压可以加快这个过程,但是过高的电压会导致绝缘层的介质击穿,从而损坏器件.典型的EEPROM器件写周期持续10毫秒左右;而读周期通常需要几百个纳秒.

    为了显着缩短写周期的时间,许多I2C EEPROM器件采用页面模式.该模式允许将多个字节传送到缓存中,然后将数据一次性写入存储区.I2C存储器件的典型页面尺寸为32字节.因此,可以在一个写周期内向EEPROM填入32个字节.

    这一点非常重要,因为串行EEPROM器件都具有特定的耐久度:即每个页面所能承受的写周期次数上限.典型的写周期次数从10,000到1,000,000次.然而,即使存储器件能够承受1百万次写周期,软件也会很快将其损耗殆尽.软件每秒仅执行100次写周期,那么不到3个小时就会耗尽器件的写周期次数.

    考虑到这些基本的EEPROM特性,设计者为一个嵌入式处理器设计可靠的非易失存储系统时,需切记以下几点:

    不要在同一页面上反复执行写操作.尤其是不要将某个页面设置成写入任何其它页面时都要更新的"目录".

    如果在写周期过程中电源被中断,必须提供以下机制:(1) 检测被中断的写操作;(2) 完成被中断的操作;(3) 或者将事件回退至写操作之前的状态.

    必须通过某些数据校验机制(校验和、CRC或消息摘要)来保证数据的完整性.

    设计目标

    虽然上面提到的EEPROM问题可通过多种非易失文件系统加以解决,但这样的文件机制对于小型嵌入式微控制器来说负担过重.很多文件系统需要更多的RAM,远远超出了小型微控制器所能提供的容量,而且对于多数应用,也不需要一个完整的文件系统.

    考虑到这一点,下面列出了EEPROM数据保护机制的设计目标:

    精简:保护机制用于存储校验数据的空间不应超过EEPROM的10%,它应该只需要少量的计算开销.

    块大小:被保护的块大小,应该和EEPROM的写操作页面大小一样.由于EEPROM器件的页面大小通常是2的偶数次幂,因此与每个块保留1或2个字节的做法相比,相同的尺寸大小更便于软件编码.

    耐久性:每个保护周期不要对同一页面进行写操作.

    可靠性:每次掉电情况下,数据都应是可恢复的.

    这里提到的保护机制有6个接口函数:读、写、提交、回退、检查和清理.

    读函数接收一个块编号和一个指向32字节缓存的指针.如果缓存地址和块编号处于有效范围内,程序就会将指定的块数据读入缓存,并校验数据的有效性.它会返回如下状态:有效读(valid read)、无效读(invalid read)、无效缓存地址(invalid buffer address)、无效页面编号(invalid page number)或保护失败(protectiON failure).

    写函数接收一个块编号和一个指向填好数据的32字节缓存的指针.如果缓存地址和块编号处于有效范围内,程序就会将数据写入非易失性缓存,并标记缓存状态以准备提交.

    提交和回退函数,是可以在写操作之后执行的互补型操作.提交函数将最近被写入的缓存数据复制到对应的存储区最终位置,并为下一个待写入的数据块准备好缓存结构.回退函数实际上就是一个"取消"操作.它消除最近一次写操作产生的效果,并为下一个写操作准备好缓存子系统. 检查函数读取存储器件的每个数据块,并检查存储数据的有效性.该函数还检查缓存子系统,以确保没有未执行的写操作.任何无效块或未执行的写操作都会使检查函数返回一个错误状态.

    清理函数修复一个数据损坏的EEPROM.实际上,它将试图找出发生的错误,并采取相应的解决措施.

    关于这些函数的更多细节,参见下面的操作详解.

    图1. EEPROM存储器的结构.存储器被划分为3个区域:主存储区,包含实际用户数据;校验存储区,包含主存储区每1页的CRC;缓存,包含存储临时写入数据的四个缓存.

    EEPROM结构

    参考上面图1给出的EEPROM结构.EEPROM包含三个主要区域:

    主存储区:EEPROM的最大区域用于存储用户数据.在一个16kB器件内,包括512页、每页32字节的存储空间.在这样的器件中,开始的473个页面专门用来存储数据.

    校验存储区:EEPROM的第二个部分,用于校验主存储区每个页面的数据.校验存储区的每1页都包含15个16位的CRC值.每1页的最后1个CRC用于校验本页数据.校验存储区占用31页(从473到503页).

    缓存:EEPROM的最后部分,包含由8个页面构成的4个写缓存.每个缓存包含4个域:数据域,它包含32字节数据,执行下一个提交命令时,数据将被写入主存储区;地址域,它表示缓存数据要写入的页面地址;状态域,它表示缓存的状态(包括可用(available)、占用(occupied)和终止(expired)状态);16位CRC域,用来校验整个写缓存.缓存结构见图1所示.

    这种EEPROM结构可以实现主要的设计目标.首先,由于主存储区每1页数据的校验结果都存储在另一个位置,所以页面的所有位都用于存储用户数据.其次,由于主存储区的每1页都通过校验存储区的特定字来校验,因此校验存储区不会有单点错误,并且也不会在每个写周期中都去更新整个校验存储区的同一页面.最后,使用4个写缓存分散了写周期带来的损耗.

    操作详解

    对于一个不带保护功能的EEPROM,具体操作非常简单.一个读周期简单地将字节从所选择的地址传送给主机;一个写周期将字节从主机写入EEPROM,并等待操作完成(大多数器件需要几个毫秒的时间).然而,在一个提供保护的EEPROM环境下,读和写操作就比较复杂了.在以下各节中,对每个操作进行了分解,以便了解函数被调用时到底是如何操作的.

    读操作

    图2. 读操作的流程图

    读操作这个最简单的接口函数,也是相当复杂的.图2给出了操作流程:

    检查页面地址和缓存地址,以检验它们的有效性.如果地址无效,则就此结束操作,函数返回一个无效缓存地址或无效页面编号错误代码.

    将所选页面读入缓存.

    计算校验页面的地址,并将相应的校验页面读入暂存区.

    计算校验页面的CRC.如果校验页面的数据无效,则返回一个保护失败错误代码.

    计算数据缓存的CRC,并将其与暂存区中对应读取页面的CRC进行比较.如果CRC匹配,则程序返回有效读代码;如果CRC不匹配,则程序返回无效读代码.无论结果怎样,实际读取的数据都保存在返回缓存中,以供调用读操作的程序使用.

    写操作

    图3. 写操作的流程图

    如上所述,写操作并不是真正将数据写入主存储区.实际上,写操作是将数据写入4个缓存之一.在这种方式下,主存储区内原先的数据将一直保持到整个有效写操作流程完成后为止.图3的流程说明了以下几点:

    检查页面地址和缓存地址,以检验其有效性.如果地址无效,操作在这里结束,函数返回一个无效缓存地址或无效页面编号错误代码.

    读取每个写缓存的状态域.如果任何缓存处于占用状态,则操作失败并返回写过程(write sequence)错误代码.

    4个写缓存之一应处于终止状态.如果是这样,激活下一个缓存.

    数据被复制到写缓存的数据域.

    页面地址被写入地址域.计算CRC校验结果并将其写入CRC域.将状态改为占用.将前一个缓存置为可用状态(即更新原来的终止状态).

    需要注意,此时对新写的页面进行读操作,将返回页面原来的数值.只有等提交操作完成后,才会返回新值.

    提交操作

    图4. 提交操作的流程

    提交函数不需要参数.它的工作就是如实地将数据从写缓存传送到主存储区,然后将写缓存标记为终止状态.提交函数的操作流程如图4所示:

    读取每个写缓存的状态域.应该只有1个缓存标记为占用状态.否则,函数在此结束,并返回一个写过程错误代码.

    对被占用的缓存进行CRC校验.如果不匹配,则返回一个数据损坏错误代码.

    提取页面地址,并将数据写入主存储区的指定页面.

    计算缓存的数据部分的CRC.该值被保存在一个临时寄存器中.

    找到对应所选主存储区页面的校验页面,并读取该校验页面的内容.

    用前面计算的CRC更新校验页面,为校验页面计算新的CRC.

    将校验页面数据重新写回校验存储区.

    将写缓存更新为终止状态.

    回退操作

    图5. 回退操作的流程图

    如图5所示,回退函数是最简单的操作之一.由于主存储区只有在完成一个提交操作后才更新数据,而不是在一个写操作之后更新的,所以回退操作只需将写缓存置为无效状态即可.

    读取每个写缓存的状态域.应该只有一个缓存被标记为占用.否则,函数在此结束,并返回一个写过程错误代码.

    将所选的写缓存状态域置为终止.

    检查操作

    图6. 检查操作的流程图

    在任何上电情况下,都需要调用检查函数以确保EEPROM可以接受数据.检查函数检验存储系统的可用性,并报告任何发现的错误.该函数的检查操作如图6所示:

    读取每个写缓存.确认只有一个缓存不是可用状态.如果只有一个缓存含有未定义的状态代码,则返回一个写操作中断(interrupted write)错误代码.如果所有缓存均包含未定义的状态代码,则返回EEPROM未初始化(uninitialized EEPROM)错误代码.

    如果仅有一个缓存包含占用状态代码,计算此缓存的CRC.如果CRC不匹配,则返回一个写操作中断错误代码.

    检查校验存储区的每一个页面.如果任何页面没有通过CRC校验,则返回保护失败错误代码.

    最后,检查主存储区的每一页,并与存储的各页CRC进行对比.如果有1页未通过CRC校验,则返回一个提交中断(interrupted commit)错误代码.

    清理操作

    图7. 清理操作的流程

    清理函数解决EEPROM系统存在的任何问题.在清理操作退出时,无论EEPROM子系统先前是何种状态,都应该可以继续使用了.所有未提交的写操作将被回退,并且完成失败的提交操作.

    图7演示了清理操作是如何工作的:

    如果检查操作返回一个EEPROM未初始化的错误代码,则初始化EEPROM.清除所有数据页面,并且初始化所有校验页面.除最后一个写缓存被初始化为终止状态外,清除其它所有写缓存并置为可用状态.

    如果检查操作返回一个写操作中断错误代码,则找到那个不是可用状态的写缓存.将它的状态改为终止状态.

    如果检查操作返回一个提交中断错误代码,则找到CRC不匹配的主页面.计算出它的CRC并更新相关校验页面.

    如果检查操作返回保护失败错误代码,则表示紧随提交操作的更新校验页面操作被中断.读出所有与错误校验页面相关的主存储区页面,并刷新校验页面.

    安全性证明

    要证明系统的安全性,需要确定写操作过程中数据容易损坏的时刻.(读操作从本质上来说是安全的.读操作期间不会对EEPROM页面进行写操作,因此数据不会被损坏.) 确定了这些易损时刻后,只需要再确定一个恢复过程.如果恢复机制涵盖了所有可能的数据损失情况,而且如果我们假定在任何一个可能破坏EEPROM写周期的事件之后,都将首先执行校验/清理周期(例如上电),那么系统就是安全的.

    在大多数串行EEPROM器件中,一个写操作首先将页面的每位数据都置为已知值,然后将所有需要改变的位设置为需要的值.因此在掉电时,中断的写操作极有可能破坏该页的所有字节.通常可以通过向损坏页面写入新数据,进而从这一失效事件中恢复出来.但这会失去原来的数据.

    写操作过程中数据容易损坏的时刻如下所述(按发生的时间顺序排列):

    对数据域进行写操作:如果此时发生电源失效事件,检查操作不会检测到错误.正在被写入的写缓存仍显示可用状态,但可用的缓存不包含有效的CRC值.

    向当前写缓存写入状态信息:这个操作将状态域改为占用状态,设定CRC并为写操作填入页面地址.如果这个过程被中断,可能发生如下情况:(1) 状态无效,从而导致一个写操作中断错误;(2) 状态有效,但CRC错误,仍会导致一个写操作中断错误;(3) 状态和CRC域有效.在最后这种情形下,系统有未提交处理的写操作.可以检测到这一状态,因为此时一个缓存将处于占用状态而另一个缓存为终止状态.如果子系统的其它部分检查通过,则用户代码可通过发出提交或回退操作继续执行.无论发生何种情况,主存储区和校验存储区都是安全的.

    前一个缓存状态清除为可用状态:缓存可能有损坏的状态或CRC,而下一个缓存为占用状态.这意味着清除该缓存的状态时操作被中断,这种情况下可以执行提交或回退操作.

    在写操作和提交操作之间:只有一个写缓存将处于占用状态,并且通过了CRC校验.用户代码可以请求提交或回退操作.写缓存、校验存储区和主存储区都是安全的.

    提交操作过程中数据容易损坏的时刻如下所述:

    将数据域复制到主存储区:如果写操作被中断,主存储区的1个页面数据可能被破坏.检查函数会检测到两种状态:(1) 一个有效的占用写缓存;(2) 中断的提交操作导致主存储区页面数据损坏.写缓存和校验存储区是安全的.在这种情况下,清理操作会完成提交操作并返回一个干净的系统.注意:即使写操作已经完成,检查操作仍会因为校验存储区的CRC与计算出的CRC不匹配而报错.

    更新校验存储区的CRC:如果对校验页面的写操作被中断,则整个页面的数据都可能被破坏.这意味着主存储区的15个页面都对应着无效的CRC.但是由于校验存储区的每一页都有自己的校验和,而且在写操作中断后会产生校验和错误,因此检查程序会发现这一点.在这种情况下,检查程序会返回保护失败.修复方法如下:首先重新计算所有受影响的15个页面的CRC值.然后将这些值和该页自身的有效CRC值一起写入校验页面.

    更新写缓存的状态信息:如果当状态变量从占用状态变为终止状态时,写周期被中断,那么整个写缓存页面的数据都可能被损坏.但是,校验存储区和主存储区都是安全的.检查操作会找到数据损坏的页面,并返回写操作中断错误代码.当运行清理程序时,它将复位写缓存子系统,并完成提交操作.

    最后,在回退操作中数据容易损坏的时刻为:

    更新写缓存的状态:与提交周期的最终状态类似,该操作只是简单地将写缓存的占用状态复位至终止状态.如果它被中断,则检查程序会返回写操作中断,并且清理程序会重新初始化所有的写缓存区域.校验存储区和主存储区仍是安全的.

    可以看出,无论电源何时掉电或处理器何时被复位,存储子系统都可保持数据的完整性.发生电源失效事件后,存储子系统会返回到可进行读或写的状态.如果一个提交操作被中断,子系统会返回到可执行提交或回退操作的状态.

    设计起步

    MAXQ微控制器的EEPROM存储系统功能完备.系统设计者可以根据需要来增强该系统的功能.但需要注意以下几点:

    C封装程序:在多数C语言标准中,与汇编语言子程序双向传送数据时都有一套标准的方法.例如在IAR开发环境下,参数在低编号的累加器中传入和传出.由于参数已经传入A[0]和A[1],为这些程序建立一个C封装器,就像写函数原型一样容易.在其它C环境下,参数传递是通过数据栈进行的,需要一个简单的封装子程序.

    并发处理:首先要保证写周期的完整性,并且提供一套能够保证完整性的机制,对于整个平台的成败至关重要.但很多应用都需要这样一种机制,即可以让一系列写周期排队并一次执行完毕,从而保证全都执行或全都不执行.但本文讨论的机制不能工作在这种方式下.如果一个系统存有跨越多个页面的信息记录,则可以中断一个写操作,这使得恢复之后的记录涵盖了包含部分新数据的页面和包含部分旧数据的页面.有一种方法可避免该问题,即在执行提交操作之前允许多重写操作.这种方法并不像听上去那么简单,因为一个部分提交的事务,可能同时包括新纪录片断、旧记录片断和损坏的页面.

    平均读写机制:平均读写作为闪存文件系统的一个特点,是指虚拟化页面地址,使得被频繁写入的页面会出现在存储器的任何物理位置.但是很难找到实现这一目标的最佳方法.这是因为,最直接的解决方法(活动存储块的目录处于固定的位置,并且每次写操作后都要对它进行更新)会导致存储目录的页面迅速损耗.所以,就像处理数据页面那样,还必须虚拟化和离散化目录本身.

    其它页面尺寸:这里给出的系统假定采用一个16kB、每页32字节的存储器件.如果所选择的器件具有更大的页面尺寸(64字节或128字节),这些函数仍可工作,只是会伴随一些额外的写入损耗.(更新128字节页面中的32字节区段时,会对整个128字节页面执行写操作).但这些函数无法对具有更小页面尺寸的器件进行操作.可以构建一个能够在线确定EEPROM器件特性的系统,并可根据实际特性配置系统的参数.

    增强的安全性:本系统对以下类型的错误提供保护:由于电源失效或不可预期的系统复位而造成的EEPROM操作中断.但EEPROM器件偶尔也会因为其它原因出错.例如,由于电路噪声或致电离辐射导致的软件错误.或者由于一个或多个存储单元损耗而导致硬件错误.

    一种解决方法是计算并维护校正子(syndrome),而不是采用简单的CRC校验字.校正子和校验字类似,但是包含了足够的信息以修复简单的位错误.最简单的校正子系统可以用log2n + 1个校验位来检验n个数据位.因此,对于一个32字节(256位)的页面来说,一个仅包含9位的校正子就可以修正任何1位错误.对数据完整性的要求更加严格时,可以采用更加复杂的系统来解决类似问题.

    结语

    外部串行EEPROM为微控制器环境下存储非易失数据提供了一种可靠的方法.利用本文提到的技术,即使面临写操作中断的情况,串行EEPROM依然能够可靠地工作.在任何对数据完整性要求较高的应用中,设计者都可以考虑这些技术.

现在有44人对本文发表评论 查看所有评论
 

关于我们 | 广告服务 | 服务项目 | 付款方式 | 联系我们 | 友情链接 | 投诉 建议 合作 | 网站地图 | 加入收藏
Copyright © 2007-2009 WEEQOO.COM Corp.All Rights Reserved. 版权所有 经营许可证编号:浙B2-20050339 法律声明
维库电子旗下网站:维库电子市场网 | ChinaICMart | 维库电子开发网 | 维库电子人才网
总部:杭州市下城区朝晖路182号国都发展大厦1号楼80A
电话:0571-85889139-8016 QQ:467090989 | MSN:dzsc076@hotmail.com | 邮箱:weeqoomaster@21cn.com
网络警察网络警察