EEPROM的应用

EEPROM的应用
EEPROM的应用

导读:

1.EEPROM巧妙应用之单片机章程

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

3.EEPROM的保护措施在MAXQ环境中

1.EEPROM巧妙应用之单片机章程

引言

全球各单片机生产厂商在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,实现了在整流器运行的同时记录数据的功能,切掉点情况下不丢失数据.这种方法有效地提高了原设备的功能,给用户的使用到来了极大的方便,并且通过实验验证了此方法是可行的.

2.基于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作为一种通用存储器件,在设计时往往容易忽视一些对其细节方面的考虑,其中一些问题在设计试制阶段被发现并解决,还有一些问题是要在量产乃至售后一段时间后才暴露出来.因此,完整的现代电子

产品系统,更多的是需要依靠软硬件相互配合开发,才能使产品的可靠性到达最佳状态.

3.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依然能够可靠地工作.在任何对数据完整性要求较高的应用中,设计者都可以考虑这些技术.

I2C总线应用下的EEPROM测试

I2C总线应用下的EEPROM测试 作者:盛帅能 作者单位:华越微电子有限公司,浙江,绍兴,312000 刊名: 半导体技术 英文刊名:SEMICONDUCTOR TECHNOLOGY 年,卷(期):2004,29(4) 被引用次数:2次 本文读者也读过(10条) 1.李文雄.陆俭国.刘明生.商书元.LI Wen-xiong.LU Jian-guo.LIU Ming-sheng.SHANG Shu-yuan基于I2C总线的EEPROM在智能电器中的应用[期刊论文]-低压电器2005(11) 2.庞媛媛.崔建明.PANG Yuan yuan.CUI Jian-ming一种I2C总线接口设计在EEPROM的应用[期刊论文]-电脑知识与技术2011,07(30) 3.苏琦.刘宇.田敬民EEPROM基于I2C总线的一种读写方法[期刊论文]-山西电子技术2001(1) 4.郭文华.GUO Wen-hua基于I2C总线的串行E2PROM及其应用[期刊论文]-常熟理工学院学报2008,22(10) 5.麦胤.柳沁.Mai Yin.Liu Qin基于Nios Ⅱ的EEPROM Controller Core的设计[期刊论文]-自动化仪表 2008,29(1) 6.杨正进.王玉霞基于I2C总线的EEPROM与单片机接口技术[期刊论文]-重庆工学院学报2001,15(2) 7.刘冰.杜道山.周士侃.李从心基于I2C总线协议的EEPROM与DSP的接口技术[期刊论文]-电子工程师2004,30(9) 8.李和太.蒋晶鑫.陆虹.LI He-tai.JANG Jing-xin.LU Hong嵌入式串行EEPROM研究[期刊论文]-微处理机2007,28(1) 9.徐飞.贺祥庆.张莉.XU Fei.HE Xiang-qing.ZHANG Li一种40ns 16kb EEPROM的设计与实现[期刊论文]-微电子学2005,35(2) 10.意法半导体推出超小型封装的增强型512 kbit I2C和SPI低压串行EEPROM存储器[期刊论文]-电子与电脑 2005(5) 引证文献(2条) 1.沈华.王俞心基于FPGA的I2C总线主控器的设计与实现[期刊论文]-航空计算技术 2007(6) 2.张必超存储器测试技术及其在质量检验中的应用研究[学位论文]硕士 2005 本文链接:https://www.360docs.net/doc/3818482099.html,/Periodical_bdtjs200404018.aspx

常用串行EEPROM芯片

1 Features ?Serial Peripheral Interface (SPI) Compatible ?Supports SPI Modes 0 (0,0) and 3 (1,1) ?Low-voltage and Standard-voltage Operation –2.7 (V CC = 2.7V to 5.5V)? 3.0 MHz Clock Rate (5V) ?8-byte Page Mode ?Block Write Protection –Protect 1/4, 1/2, or Entire Array ?Write Protect (WP) Pin and Write Disable Instructions for Both Hardware and Software Data Protection ?Self-timed Write Cycle (10 ms max)?High Reliability –Endurance: One Million Write Cycles –Data Retention: 100 Years ?Automotive Grade Devices Available ? 8-lead PDIP and 8-lead JEDEC SOIC Packages Description The AT25010/020/040 provides 1024/2048/4096 bits of serial electrically erasable programmable read only memory (EEPROM) organized as 128/256/512 words of 8bits each. The device is optimized for use in many industrial and commercial applica-tions where low-power and low voltage operation are essential. The AT25010/020/040is available in space saving 8-lead PDIP and 8-lead JEDEC SOIC packages. The AT25010/020/040 is enabled through the Chip Select pin (CS) and accessed via a 3-wire interface consisting of Serial Data Input (SI), Serial Data Output (SO), and Serial Clock (SCK). All programming cycles are completely self-timed, and no sepa-rate ERASE cycle is required before WRITE. BLOCK WRITE protection is enabled by programming the status register with one of four blocks of write protection. Separate program enable and program disable instruc-tions are provided for additional data protection. Hardware data protection is provided via the WP pin to protect against inadvertent write attempts. The HOLD pin may be used to suspend any serial communication without resetting the serial sequence. Pin Configurations 8-lead PDIP

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

串行EEPROM AT24CXX芯片资料

串行EEPROM AT24CXX芯片资料 AT24CXX是美国ATMEL公司的低功耗CMOS串行EEPROM,典型的型号有 AT24C01A/02/04/08/16等5种,它们的存储容量分别是 1024/2048/4096/8192/16384位;也就是128/256/512/1024/2048字节;使用电压级别有5V,2.7V,2.5V,1.8V;本文主要介绍常用的AT24C02即256字节存储器的使用;它具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。 外行如图: AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址(实验板中直接接地只有一块器件);第8脚和第4脚分别为正、负电源。第5脚SDA 为串行数据输入/输出,数据通过这条双向I2C总线串行传送,SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。第7脚为WP写保护端,接地时允许芯片执行一般的读写操作。接电源端时不允许对器件写。 24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。 ;这是将0100H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序可直接在实验板上实验。 ORG 0000H SCL BIT P3.7;定义24C02的串行时钟线 SDA BIT P3.6;定义24C02的串行数据线 LJMP START START:LCALL STAR;调用

MOV R2,#08H;一个数据有8位 MOV DPTR,#0100H;定义源数据的位置LOOP:MOV A,#00H MOVC A,@A+DPTR LCALL SDATA LCALL ACK JC LOOP INC DPTR DJNZ R2,LOOP LCALL STOP;调用停止子程序STAR:SETB SDA SETB SCL NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP CLR SCL RET SDATA:MOV R0,#08H LOOP0:RLC A MOV SDA,C NOP NOP SETB SCL

EEPROM.

常用串行EEPROM的编程应用 EEPROM是"Electrically Erasable Programmable Read-only"(电可擦写可编程只读存储器)的缩写,EEPROM在正常情况下和EPROM一样,可以在掉电的情况下保存数据,所不同的是它可以在特定引脚上施加特定电压或使用特定的总线擦写命令就可以在在线的情况下方便完成数据的擦除和写入,这使EEPROM被用于广阔的的消费者范围,如:汽车、电信、医疗、工业和个人计算机相关的市场,主要用于存储个人数据和配置/调整数据。EEPROM又分并行EEPROM和串行EEPROM,并行EEPROM器件虽然有很快的读写的速度,但要使用很多的电路引脚。串行EEPROM器件功能上和并行EEPROM基本相同,提供更少的引脚数、更小的封装、更低的电压和更低的功耗,是现在使用的非易失性存储器中灵活性最高的类型。串行EEPROM按总线分,常用的有I2C,SPI,Microwire总线。本文将介绍这三种总线连接单片机的编程方法。 I2C总线 I2C总线(Inter Integrated Circuit内部集成电路总线)是两线式串行总线,仅需要时钟和数据两根线就可以进行数据传输,仅需要占用微处理器的2 个IO引脚,使用时十分方便。I2C总线还可以在同一总线上挂多个器件,每个器件可以有自己的器件地址,读写操作时需要先发送器件地址,该地址的器件得到确认后便执行相应的操作,而在同一总线上的其它器件不做响应,称之为器件寻址,这个原理就像我们打电话的原理相当。I2C总线产生80年代,由PHLIPS 公司开发,早期多用于音频和视频设备,如今I2C总线的器件和设备已多不胜数。最常见的采用I2C总线的EEPROM也已被广泛使用于各种家电、工业及通信设备中,主要用于保存设备所需要的配置数据、采集数据及程序等。生产I2C总线EEPROM的厂商很多,如ATMEL、Microchip公司,它们都是以24来开头命名芯片型号,最常用就是24C系列。24C系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。如ATMEL的24C64,存储位是64K位,也就是说可以存储8K(8192)字节,它支持1.8V到5V电源,可以擦写1百万次,数据可以保持100年,使用5V电源时时钟可以达到400KHz,并且有多种封装可供选择。我们可以很容易的在身边的电器设备中发现它们的身影,如电视中用于保存频道信息,电脑内存条中保存内存大小等相关信息,汽车里用于保存里程信息等等。图一就是ATMEL24C64芯片的PID封装和用于内存条SPD(Serial Presence Detect)上的24芯片。

IIC总线的使用EEPROM芯片的读写程序

51单片机第二十二课IIC总线的使用EEPROM芯片的读写 所属类别:课程代码发布日期:2011-03-05 点击量:341 #include #include #define uchar unsigned char #define uint unsigned int sbit sda=P2^1; sbit scl=P2^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00}; unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; void start(void); void stop(void); void ack(void); void noack(void); void iicwr_byte(uchar dat); uchar iicre_byte(void); void delay (void); void init(void); void delay1(void); void write_byte(uchar add,uchar dat); uchar read_byte(uchar add); /////////////////////////////////// void delay1(void) { uint a=30000; while(a--); } void delay (void) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }

EEPROM的应用

导读: 1.EEPROM巧妙应用之单片机章程 2.基于I2C串行通信的EEPROM在电视中的设计应用 3.EEPROM的保护措施在MAXQ环境中 1.EEPROM巧妙应用之单片机章程 引言 全球各单片机生产厂商在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所示.从图中可以看出,问题得到了很好的解决.

STC单片机EEPROM读写程序

/* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ // #define BaseAddr 0x1000 /* 51rc */ // #define EndSectoraddr 0x3d00 /* 51rc */ // #define EndAddr 0x3fff /* 51rc 12K eeprom */ #define BaseAddr 0x4000 #define EndSectoraddr 0xf200 #define EndAddr 0xf3ff #define UseAddr 0x1000 /* ------------- 定义扇区大小------------- */ #define PerSector 512 /* 用户程序需要记忆的数组, 用户实际使用了n-1个数据,数组长度规整到 2 4 8 16 32 64 上*/ uchar Ttotal[16] = { 0x55, /* 作为判别引导头使用,用户程序请不要修改它*/ /* 用户保存记忆的数据*/ 0x01, /* 用途说明....*/ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, }; uint timerForDelay, /* 专供延时用的变量*/ i, /* 循环变量*/ EepromPtr; /* eeprom读写指针*/ /* --------------- 命令定义--------------- */ #define RdCommand 0x01 /* 字节读*/ #define PrgCommand 0x02 /* 字节写*/

EEPROM

嵌入式系统中EEPROM文件系统的设计与实现 彭晓锋 北京邮电大学电信工程学院,北京(100876) 摘要:AT24CXX系列EEPROM在嵌入式领域有着广泛的运用。本文参考微机文件系统的原理实现能兼容AT24C08-AT24C1024的简单文件系统,实验结果证明本系统高效可行。关键词:EEPROM, 文件系统,嵌入式 1.引言 随着大量嵌入式设备的出现,在嵌入式系统中用于存储数据的EEPROM因其简单、方便、可靠的性能和低廉的价格而被广为使用。当今社会嵌入式系统无所不在,各种嵌入式设备品种繁多,差别巨大。因此各公司也推出多种不同容量不同型号的EEPROM适应多样的市场应用。人们一方面希望能像管理大容量存储器(如硬盘,FLASH等)中数据一样简单便捷的操作EEPROM中的数据(包括打开、关闭、读写文件等),同时也希望这种文件系统能兼容不同容量、型号,具有较强的通用性。而对于采用两线IIC总线读写方式[1]的EEPROM来说,无法使用类似与FLASH所支持的TFFS之类的文件系统,本文参照上述思想,实现了一种能兼容AT24C08-AT24C1024类似于文件系统的用于管理EEPROM中数据的方法,并在实践项目中得到良好运用。 2.AT24CXX系列EEPROM简介 AT24CXX系列是ATMEL公司生产的串行电可擦的可编程存储器,它采用8引脚封装,具有可掉电记忆,结构紧凑、存储容量大等特点,可以在2线总线上并接多片芯片,适用于具有大容量数据存储要求的嵌入式系统[2]。 ⅰ)封装及管脚说明 AT24C08-AT24C1024的封装如图1所示(对不同型号 A0-A2相应改为NC,详见表1),各引脚的功能如下: ⑴ A0、A1、A2:器件地址(device address)。IIC串行总线 需连接多个EEPROM芯片时,可用A0、A1、A2来区分各芯 片,悬空时为0。 ⑵ SDA:I2C 串行数据。图1. A T24CXX系列EEPROM封装 ⑶ SCL:I2C 串行时钟。一般在其上升沿将SDA上的数据写入存储器,而在下降沿从存储器读出数据并送往SDA。 ⑷ WP:写保护。此引脚接地时,允许写操作;与VCC相连时,所有写操作被禁止。如果不连,该脚将在芯片内部下拉到地。 ⑸ VCC:电源;GND:地;NC:悬空。 ⅱ)与处理器通信 AT24C系列的接口特性:一般A0-A2、WP接VCC或GND,SCL、SDA接处理器的IIC接口相应管脚,即可实现处理器对EEPROM的操作。 ⅲ)设备地址(device address) 对EEPROM读写数据前,需先发一个字节的device address以选择芯片进行读写。其中首部四比特的“1010”为固定值;A0- A2用于对多个EEPROM进行区分,注意对AT24C不同型号,

PIC单片机的EEPROM读写实例及说明

PIC单片机的EEPROM读写实例及说明 ; PIC 单片机的EEPROM 读写实例及说明; ******************************************************************** ********; This is a program to test the function of readingwritting for EEPROM.; You can observe the value of register(30H--?) buy changing “VALU” and “WRC_”.; Notice that:it must be { ADDR+WRC_=0ffh } !;******************************************************************* *********include “p16f877.inc”ADDR EQU 20H ;写入地址寄存器VALU EQU 21H ;写入值REC_ EQU 22H ;读计数WRC_ EQU 24H ;写计数org 0goto mainmainbcf STATUS,RP1bcf STATUS,RP0 ;bank0movlw 10hmovwf ADDR ;写入EEPROM 初始值movlw 90hmovwf VALU ;初始写入值movlw 30hmovwf FSR ;间址,读出值初始存放地址movlw 0Fhmovwf WRC_ ;写入次数movwf REC_;incf REC_ ;读出次数wri_ ;写子程序bsf STATUS,RP1bsf STATUS,RP0 ;bank3btfsc EECON1,WRgoto $-1bcf STATUS,RP0bcf STATUS,RP1 ;bank0movf ADDR,Wbsf STATUS,RP1 ;bank2movwf EEADRbcf STATUS,RP1 ;bank0movf VALU,Wbsf STATUS,RP1 ;bank2movwf EEDATAbsf STATUS,RP0 ;bank3bcf EECON1,EEPGD ;to data memorybsf EECON1,WRENbcf INTCON,GIEmovlw 55hmovwf EECON2movlw 0aahmovwf EECON2bsf EECON1,WRbcf STATUS,RP0bcf STATUS,RP1 ;bank0incf ADDR,1decf VALU,1decfsz WRC_ ;all write,to read_goto wri_read_ ;读子程序bcf STATUS,RP1bcf STATUS,RP0 ;bank0decf ADDR ;next valuebsf STATUS,RP1 ;bank2movwf EEADRbsf STATUS,RP0 ;bank3EEwr.asm 程序说明:1、本程序是对PIC16F877 单片机的EEPROM 数据区进行读写的演示程序;

PIC单片机片内EEPROM的读写程序

PIC单片机片内EEPROM的读写程序 因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下: PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下: // This header file should not be included directly // Inclusion of this file is provided indirectly by including htc.h /******************************************************************** ***/ /****** EEPROM memory read/write macros and function definitions *******/ /******************************************************************** ***/ /* NOTE WELL: The macro EEPROM_READ() is NOT safe to use immediately after any write to EEPROM, as it does NOT wait for WR to clear. This is by design, to allow minimal code size if a sequence of reads is desired. To guarantee uncorrupted writes, use the function eeprom_read() or insert while(WR)continue; before calling EEPROM_READ(). */ #if EEPROM_SIZE > 0 #ifdef __FLASHTYPE // macro versions of EEPROM write and read #define EEPROM_WRITE(addr, value) \ do{ \ while(WR)continue;EEADRL=(addr);EEDATA=(value); \ EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \ WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \ if(CARRY)GIE=1; \ }while(0) #define EEPROM_READ(addr) ((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)

E2PROM的原理以及应用

EEPROM的原理以及应用 一、常用串行EEPROM的简介 1) 引脚描述 SCL:串行时钟 SDA:串行数据 A2~0:设备地址、页地址 WP:写禁止 VCC:电源供电 GND:地 2) 内存管理 以Atmel公司的2线EEPROM为例,从A T24C01~A T24C16,其内存架构分别由16page*8byte、32page*8byte、32page*16byte、64page*16byte、128page*16byte组成。寻址字节需要7~11bit的数据字。AT24C32和A T24C64分别由128page*32byte、256page*32byte组成。系统提供了2个字节的寻址数据字。 3) 器件操作 时钟和数据传输:SDA引脚正常状态下由外部器件拉高。SDA上的数据只有在SCL 为低的时间段才能进行改变,在SCL为高时SDA数据的更改会表现为如下所述的一个开始条件或者一个结束条件。 开始条件:SCL为高,SDA由高变为低是一个开始条件,开始命令优先于其他所有的命令。 结束条件:SCL为高,SDA由低变为高是一个结束条件。在一个读序列之后的结束命令,会将EEPROM置于一个待机电源模式。 响应:所有的地址和数据字都是以8bit字,串行的传入或者传出EEPROM。在第九个时钟周期,EEPROM发出一个0来作为收到一个字的响应信号。 Twr:一个写序列的有效结束条件到一个内部的写周期结束。

注:页写的自加计数是低5位自加,高位不变,以保证在当前页。页写到当前页的最后边界时,会计数到最开始到位置。如果MCU发给EEPROM的数据超过了32个时,会发生卷边,覆盖掉前面的数据。 注:上次读、写操作的地址加1。只要芯片不掉电,就会暂存在芯片中。

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过) ;本程序在4MHZ、12MHZ和24MHZ分别测试通过 ;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写 ;本程序仅作学习交流之用。 ;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟 SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址 READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址 ;------------------------------------------------ ORG 00H LJMP MAIN ;------------------------------------------------ ORG 50H MAIN: MOV SP,#20H;防止堆栈影响已用内存数据 ;以下为写EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。 LCALL WRITEEEPROMR ;以下为读EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 LCALL READEEPROMR ;以下为EEPROM读写操作验证 MOV A,WRITEdata MOV B,A MOV A,READDATA CJNE A,B,MAIN1 MOV P1,READDATA;写入数和读出数相等时,读出的数据在P1口输出并按位分别控制LED灯直观显示 sJMP $ MAIN1: MOV P1,#00H;写入数和读出数相等时,LED灯全亮 ;以下可接其它主程序,此处暂为死循环 SJMP $ ;--------------------------------------------------------------------------------------------------------------------- ;WRITEEEPROMR是随机写EEPROM(AT24C02)子程序 ;入口1:EEPROMADRESS(拟读写EEPROM存贮单元地址,00~FFH) ;入口2:WRITEDATA(拟写入EEPROM的字节数据在主机的存放地址)

常用串行eeprom应用

SPI总线 SPI总线(Serial Peripheral Interface串行外围设备接口总线)是三线式的串行总线,是由摩托罗拉公司所研发,使用三线进行数据传输,分别是SCK时钟引脚,SI数据输入引脚和SO数据输出引脚,另外还有CS片选引脚可以对同一总线上的芯片进行选通使用,SPI总线已被广泛使用在EEPROM、单片机和各种设备中。常用串行EEPROM中的25XX系列芯片就是使用兼容SPI总线结构,采用先进COMS技术,体积小,是一种理想的低功耗非易失性存储器,广泛使用在各种家电、通讯、交通或工业设备中,通常是用于保存设备或个人的相关设置数据。ATMEL公司生产的25系列的EEPROM存储容量从1K位到256K位。其它一些芯片也会用到SPI总线,如常用的CPU监控芯片X5043、X5045就带有512字节的SPI界面EEPROM,常用于单片机系统的看门狗电路,同时也可以提供小数据量的存储,给电路设计带来很多的方便。此文将用X5045为例讲述SPI的编程应用和X5045的一些其它功能。X5045由Xicor公司出品,电压范围有2.7V到5.5V和4.5V到5.5V二个版本,擦写次数可达一百万次,最高时钟频率可达3.3MHz。图一是X5045的PID封装实物图。

图二是X5045的引脚定义图。CS/WDI是片选和看门狗复位输入,当CS为高时SO引脚变为高阻态,这时可以允许其它器件共用SPI总线,同时芯片也处于休眠状态,当CS为低时芯片被选中,并从休眠状态中唤醒,可以进行读写操作。SO是串行数据输出,在读芯片时数据从此脚输出。WP是写保护引脚,当WP为低时芯片写保护,不能对芯片写操作,但其它功能不受影响。Vss是电源地。SI是串行数据输入,接收来自控制器的数据和地址。SCK是串行时钟输入,RESET是复位输出,Vcc是电源。在25芯片中还有一个HOLD引脚,此引脚的功能是保持输入脚,ATMEL公司生产25芯片的HOLD引脚是低电平有效。不用此功能时,HOLD引脚要保持高电平。在芯片正在串行传输时,将HOLD拉为低电平,可以暂停进一步的传送,具体方法是SCK变低后,将HOLD也拉低,不然在下一个SCK 变低前不能暂停传送,要恢复串行传送,必须在SCK为低电平时将HOLD拉高。芯片处于暂停时,SI,SO,SCK脚为高阻状态,任何时刻只要HOLD被拉低时,SO都会处于高阻状态。 限于文章的篇幅,下面内容只着重介绍X5045芯片的SPI总线对EEPROM单元的编程应用。在X5040芯片中有6个指令,它和25系列芯片的指令是兼容的,也就是说在25系列芯片中使用时基本上是不需要改变的,具体见表一。

常用串行EEPROM的编程应用

常用串行EEPROM的编程应用(一) 作者:温正伟原载:无线电 本文所提供的实例程序:cdle070002.rar EEPROM是"Electrically Erasable Programmable Read-only"(电可擦写可编程只读存储器)的缩写,EEPROM 在正常情况下和EPROM一样,可以在掉电的情况下保存数据,所不同的是它可以在特定引脚上施加特定电压或使用特定的总线擦写命令就可以在在线的情况下方便完成数据的擦除和写入,这使EEPROM被用于广阔的的消费者范围,如:汽车、电信、医疗、工业和个人计算机相关的市场,主要用于存储个人数据和配置/调整数据。EEPROM又分并行EEPROM和串行EEPROM,并行EEPROM器件虽然有很快的读写的速度,但要使用很多的电路引脚。串行EEPROM器件功能上和并行EEPROM基本相同,提供更少的引脚数、更小的封装、更低的电压和更低的功耗,是现在使用的非易失性存储器中灵活性最高的类型。串行EEPROM按总线分,常用的有I2C,SPI,Microwire总线。本文将介绍这三种总线连接单片机的编程方法。 I2C总线 I2C总线(Inter Integrated Circuit内部集成电路总线)是两线式串行总线,仅需要时钟和数据两根线就可以进行数据传输,仅需要占用微处理器的2个IO引脚,使用时十分方便。I2C总线还可以在同一总线上挂多个器件,每个器件可以有自己的器件地址,读写操作时需要先发送器件地址,该地址的器件得到确认后便执行相应的操作,而在同一总线上的其它器件不做响应,称之为器件寻址,这个原理就像我们打电话的原理相当。I2C总线产生80年代,由PHLIPS公司开发,早期多用于音频和视频设备,如今I2C总线的器件和设备已多不胜数。最常见的采用I2C总线的EEPROM也已被广泛使用于各种家电、工业及通信设备中,主要用于保存设备所需要的配置数据、采集数据及程序等。生产I2C总线EEPROM的厂商很多,如ATMEL、Microchip公司,它们都是以24来开头命名芯片型号,最常用就是24C系列。24C系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。如ATMEL的24C64,存储位是64K位,也就是说可以存储8K(8192)字节,它支持1.8V 到5V电源,可以擦写1百万次,数据可以保持100年,使用5V电源时时钟可以达到400KHz,并且有多种封装可供选择。我们可以很容易的在身边的电器设备中发现它们的身影,如电视中用于保存频道信息,电脑内存条中保存内存大小等相关信息,汽车里用于保存里程信息等等。 图二是ATMEL公司 可以通过设置A0-A2引脚来确定器件地址。SDA是串行数据引脚,用于在芯片读写时输入或输出数据、地址等,这个引脚是双向引脚,它是漏极开路的,使用时需要加上一个上拉电阻。SLC脚是器件的串行同步时钟信号,如果器件是使用在单片机系统中,那么SLC脚应该由单片机控制,根据单片机的程序要求产生串行同步时钟信号,控制总线的存取。WP脚是写保护脚,当这个脚接入高电平时,芯片的芯片数据均处于禁止写入状态(所禁止的地址段要看各芯片的详细资料),当把WP脚接到地线时,芯片处于正常的读写状态。当一个电路要求正常使用时是不允许程序修改EEPROM中的数据,只有在维护设置才可以修改数据,这时可以在电路上设置WP跳线或用微处理器对WP进行控制,这样只有在特定的电路状态下才可以更改到数据。

24C64EEPROM的读写的C语言程序.

/*24C64子程序 */ bit I2C_Start(void; void I2C_Stop(void; void I2C_Ack(void; void I2C_Nack(void; bit I2C_Send_Byte( uchar; uchar I2C_Receive_Byte(void; void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count; void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count; void Delay_10_uS(void { char i=10; while(i--; } void Delay_N_mS( uint n_milisecond /* n mS delay */ { uchar i; while(n_milisecond-- {

i=37; while(i--; } } bit I2C_Start(void { Delay_10_uS(; I2C_SDA =1; Delay_10_uS(; I2C_SCK =1; Delay_10_uS(; if ( I2C_SDA == 0 return 0; if ( I2C_SCK == 0 return 0; I2C_SDA = 0; Delay_10_uS(; I2C_SCK = 0; Delay_10_uS(; return 1; }

void I2C_Stop(void { Delay_10_uS(; I2C_SDA = 0; Delay_10_uS(; I2C_SCK = 1; Delay_10_uS(; I2C_SDA = 1; Delay_10_uS(; } void I2C_Ack(void { Delay_10_uS(; I2C_SDA=0; Delay_10_uS(; I2C_SCK=1; Delay_10_uS(; I2C_SCK=0; Delay_10_uS(;

相关文档
最新文档