yaboPP电子
项目

使用eEerAM缓解电源故障编程问题

2017年8月07日Raymond Genovese.

在此操作文章中,我们探索使用I2C EERAM在电源失败时保存关键程序变量,并在电源返回以轻松保留程序连续性时恢复它们。

在此操作文章中,我们探索使用I2C EERAM在电源失败时保存关键程序变量,并在电源返回以轻松保留程序连续性时恢复它们。

电源故障是不可避免的。当电源返回时,您的程序重新启动,但随着所有变量的内容丢失。通常,在电源返回时具有保存的临界值将是有利的。Eeram让这很容易做到这一点。

在本文中,我们将探讨EERAM的使用,并构建一个简单的演示项目,当电源失败时会自动保存程序变量,然后在电源返回时恢复。

EERAM是什么?

简单地放了,通过Microchip制造的EerAx是一个一世2C.带有阴影EEPROM备份的静态RAM (SRAM)。用户的程序不直接访问EEPROM,而是自由使用SRAM,它提供了快速访问和近乎永久的持久性。

通过软件或硬件信号将SRAM存储到EEPROM。然而,最符合的是,随着添加简单电容,当电源丢失时,整个SRAM阵列可以自动保存到EEPROM。在所有三种情况下,当电源返回时,EEPROM的内容会自动转移到SRAM。

可用EerAx IC

零件号

vcc. 密度 地址范围
47L04. 2.7-3.6V. 4kbits(512字节) 0 x000-0x1ff
47C04. 4.5-5.5V. 4kbits(512字节) 0 x000-0x1ff
47L16. 2.7-3.6V. 16kbits(2 KB) 0x000-0x7ff
47C16. 4.5-5.5V. 16kbits(2 KB) 0x000-0x7ff

从上表中,有两个密度,每个密度都有两个电压和温度范围。所有设备都有一个我2C串行接口,速度高达1 MHz。

请务必咨询以下EerAM参考PDFS:

对于我们所有的例子,我们将使用一个英特尔夸克微控制器D2000。对于D2000板和应用程序的更多参考资料,包括如何使用GPIO和I2C接口,以下所有关于电路文章可用:yaboPP电子

C源代码(QMSI 1.40,ISSM_2016.2.094)用于示例和项目可用于在文章末尾下载。

虽然我们的示例程序和电路使用D2000,但它们应该容易适应任何具有I的微控制器2C接口和GPIO。

基本eerar接口

基本EERAM接口的原理图至D2000。

以上示意图示出了eEerAM的典型微计算机接口,并且可以与包括的软件示例一起使用。

**请注意,如果您使用的是硬件存储(HS)功能,则只需要连接GPIO_3。

BOM for Basic EerAM接口。

组件 描述 来源/价格
IC1. 47 l04 EERAM Digi-Key 47L04-I / P./ 0.92美元
C1. 6.8μF钽电容器 Digi-Key 478 - 1918/ $ 0.31
C2. 0.1µF陶瓷电容器 Digi-key 399-14001/ 0.32美元
R1,R2 10kΩ电阻 Digi-Key CF18JT10K0CT/ 0.10美元

IC1.是一个“L”设备EERAM,VCC范围为2.7-3.6V。由于D2000是3.3V板,因此它是适当的版本,并且可以使用相同的连接来用于47L16。如果您使用的是5V板,则'C'版本(即47C04或47C16)将是合适的。

SDA / SCL.。这两条线是通常的我2C时钟和数据信号可容纳高达1 MHz的传输速度。请注意,R1和R2是所需的上拉电阻。Microchip推荐典型值为100 kHz的10kΩ。虽然D2000板的软件可以容纳100 kHz,400 kHz和1 MHz的速度,但我们所有的软件示例都使用100 kHz速度,因此,10kΩ电阻。

A1和A2地址线。不像典型的我2C串行EEPROM,EERAM设备有两个设备地址(参见下图)。有一个地址来访问控制寄存器,另一个地址读取和写入SRAM阵列。

Eerar I.2C设备寻址。图提供了微芯片,Eerar数据呵呵T.

我的8位2C地址由4-7位(SRAM的二进制1010或控制寄存器的二进制0011)的固定操作码组成,2-3位对应引脚A1和A2的状态。如果这些引脚是接地的,相关的地址位值为' 0 ',如果连接到Vcc,它们的值为' 1 '。地址的第1位总是' 0 '。

我的8位2C地址包括读取的最低有效位和写入的“1”和“写入”0“。由于操作系统的例程2C通信处理后一位,我们可以将设备地址视为编程注意事项的7位值。

在我们的原理图(对于所有包括的程序),A1和A2在地面;控制寄存器用二进制1010000(0x18)寻址,并且SRAM阵列由二进制1010000(0x50)寻址。请注意,访问A1和A2引脚允许在同一系统上使用最多四个EERAM芯片。

五金店(HS)引脚。HS线连接到D2000 GPIO 3。如果要使用硬件存储功能,则才需要此连接。也就是说,HS线可以带来“高”以将SRAM存储到EEPROM。如果您不想使用此功能,则该行可以保持未连接。

Vcap。如果您想在电源故障时使用SRAM的自动存储到EEPROM,则需要将电容从VCAP引脚连接到GND。电容器的选择很重要,微芯片提供了一个应用笔记,精确地解决了该问题(参见AN2257A)。

eerar自动存储和召回电压。图是微芯片的礼貌AN2257A.

该电容必须提供必要的能量来自动存储和回顾SRAM的内容和来自EEPROM。电容器必须足够大,以便在整个存储周期中保持高于VPOP(上电复位电压)电平的VCAP电压。

Microchip在表中方便地提供了最小Vcap值(见表3,AN2257A)。注意,最小值取决于设备的电压和密度。对于我们正在使用的47L04设备,Vcap的最小值是5µF。

为了满足最小值,我们必须考虑在组件的数据表中列出的电容容的容差。对于我们选择C1的电容器,该值为6.8μF,公差为±20%。因此,在公差的低端,我们的值为5.44μF,并且保持高于所需的最小电容。在许多情况下,无需最小化成本或组件区域,因此您可以通过简单地选择更大的电容来确保鲁棒操作(例如,10μF)。

可以使用没有自动存储功能的EerAx和VCAP上的外部电容。在这种情况下,VCAP引脚应将其绑定到VCC,并且必须通过将状态寄存器中的ASE位写入“0”(请参阅​​下面的控制寄存器部分)来禁用自动存储功能以防止数据损坏。

旁路电容器。原理图中的最终组件是C2,旁路电容。典型和推荐的值为0.1μF。

编程控制寄存器

EERAM编程可分为控制寄存器编程和SRAM访问编程两部分。每个都使用不同的I2C设备地址。

此外,EerAM有两个控制寄存器:状态寄存器和命令寄存器。状态寄存器可以从中读取或写入。命令寄存器是只写的,有两个命令,一个用于将SRAM保存到EEPROM,另一个命令将SRAM从EEPROM中恢复。

这些寄存器(状态和命令)中的每一个都有自己的地址:0x00,用于命令寄存器的状态寄存器和0x55。这些地址不与我混淆2C设备地址。相反,它们被发送成为我之后的辅助地址2C设备地址,但仅在写入控制寄存器时。当从控制寄存器读取时,未使用寄存器地址,因为只能读取状态寄存器。

状态寄存器

EERAM状态寄存器位定义。图提供了微芯片,EERAM数据表

与数据表的咨询将提供寄存器位的详细信息,但要注意的几点是以下内容:

  • 如果要在电源故障上自动将(自动存储)SRAM自动保存(自动存储)SRAM,则必须设置ASE位。
  • 如果未设置AM位,则不会启用自动存储和硬件存储(使用HS引脚)。由于更改SRAM阵列的内容时,自动设置为只读的AM位,这是有道理的。
  • 有关ASE和AM位的完整存储/恢复真理表的EERAM数据表的表2-7见表2-7。
  • 通过在状态寄存器中设置与内存块相对应的位,可以对数组的部分或全部进行写保护(详见数据表)。

附带的程序eeram_cntrl_status_reg.c将显示和可选地写入状态寄存器。该程序可以轻松为特定应用配置EerAM芯片。

下面的程序片段中显示的三个程序变量应在运行程序之前由用户配置。

/ * --->注意:用户应该设置下三个变量<--- * / bool hdensity =否;/ *芯片密度,无/ 0 = 47x04或是/ 1 = 47x16 * / bool writestatus =否;/ *如果是,如果没有跳过写入* / / * uint8_t newval = 0b00000010,则将newval写入状态寄存器;没有块保护,启用自动存储,如果设置* / uint8_t newval = 0b00000000;/ *没有受保护的块,禁用自动存储,如果设置* /

如果使用47x04芯片或更高的密度47x16芯片,请将HDENCES变量设置为“否”。如果您只想读取状态寄存器,请将writestatus设置为“否”。如果要读取和写入状态寄存器,请将writestatus设置为“是”,并将NewVal设置为要写入状态寄存器的8位值。

下图显示了运行编程并设置ASE位后屏幕输出到串行终端的结果。

eeram_cntrl_status_reg.c的输出屏幕截图。

命令寄存器

第二个控制寄存器是命令寄存器。它在0x55的次要地址时写入。该命令可以是存储(0x33),它将SRAM复制到EEPROM或召回(0xDD),该召回(0xDD)将EEPROM复制到SRAM。

两个字节被写入I2C设备地址要使用任一命令:

  • 字节1是命令寄存器地址(0x55)。
  • 字节2是命令(存储器的0x33或召回0xdd)。

发送序列后,您必须延迟在数据表中的AC特征中定义的间隔。间隔包括状态寄存器写入周期时间(TWC),其为1 ms,加上召回延迟(TRECALL)或存储延迟(TSTORE),具体取决于您执行的命令。TRECALL和TSTORE取决于设备密度:对于47x04设备,TSTORE = 8毫秒和TRECALL = 2 ms;对于47x16设备,TSTORE = 25毫秒和TRECALL = 5毫秒。

需要考虑的一个警告是您是否对I2C使用阻塞或非阻塞呼叫。在所有包含的程序中,我们使用阻塞呼叫I2C通信。因此,我们开始后的延误2C传输阻止呼叫知道在调用返回之前,I2C传输完成。但是,如果您使用非阻塞呼叫,则必须在程序已确认在关联的回调例程中完成转移后明确开始延迟。否则,在发送命令后,您可能会在不知不觉中延迟小于所需的间隔。

包含的程序eeram_cmd_sr.c,演示了软件保存和调用命令的用途。

访问SRAM.

在特定地址写一个字节,写入i2如前所述,SRAM的C设备地址(我们的实现是0x50),发送地址的高字节,然后是地址的低字节,最后是数据字节。

从SRAM数组中读取一个字节需要两个步骤。首先,将地址设置为您想要以与写字节相同的方式读取的数组中的位置。在不发送停止位的情况下,从I读取字节2C设备地址和EERAM在所选地址发送数据字节。

包含的程序eeram_rw.c,通过读取和编写一个字节来演示过程。如果检查两个函数READBYTEC(UINT16_T地址)和WRITEBYTEC(UINT16_T地址,UINT8_T字节),则可以看到上面概述的步骤的编码实现。请注意,两个例程都使用错误检查并返回INT类型的变量。如果返回值为否定,则它是-999如果地址无效或否定的errno值。如果返回值是非负数,则在有效写入的情况下,在读取或0的情况下,它是来自寻址内存的有效值。

我们还可以顺序读取或写入SRAM(即,多个连续字节)。该过程的细节在EerAM数据表和附带的程序中给出,eeram_s_rw.c,它将使用顺序访问过程读取,然后写入整个SRAM内存阵列。要使用该程序,用户应首先设置两个程序变量,HDENCE和BYTEVALUE(要写入所有位置的字节值)。

当连接到串行终端时,该程序将在设置内存位置之前和之后输出整个内存数组(见下面的屏幕输出),并报告写入值和随后读取值之间的任何差异。

运行EerAM_S_RW.c的屏幕输出。所有内存值都从'255'更改为“170”。

使用HS引脚

要启动硬件存储,只需将HS引脚带到逻辑高,至少为THSPW(150ns,请参阅EerAx数据表)。这将自动导致写入状态寄存器以设置事件位,并且需要延迟TWC(1 ms)以完成,而独立于存储(见下文)。

为了将SRAM存储到EEPROM,需要设置AM状态寄存器位,这意味着SRAM数组已被修改。当存储发生时,完成需要一个延迟(Tstore)。所包含的程序EERAM_HS_Save.C演示了程序,并根据原理图假设HS引脚连接到GPIO_3。

另请注意,无论处于设置的HS行是否被设置并进行实际发生存储,都将在激活状态寄存器中设置状态寄存器中的事件位。事件位是非易失性的(意味着它即使移除电源)也会保留其状态),并且必须通过将“0”在状态寄存器中专门写入“0”来重置。

示范项目

对于探索Eeram的纯版本的程序,我们已经为示例应用程序项目进行了准备。这个简单的演示将使用连接到D2000的标准7段显示器连接到GPIO引脚。

BOM:

电路的BOM仅包括两个组件:

  • DIS1 - LSHD-A103常见阴极7段显示器(Mouser.,0.66美元)
  • RN - 330Ω电阻网络(14针)(Mouser.,0.80美元)

示意图

以下详细信息的示意图:

D2000至7段显示的电路示意图。

该电路随附基本EerAM电路构成整个项目。

项目范围

存在使用7段显示器的许多示例,而不是进入显示屏的基本操作的细节,您可以在前一个接口的背景上读取AAC项目在这一点AAC教科书

在我们的项目中,显示器将简单地通过数字0-9连续循环,在更改之间有3秒的延迟。正常情况下,断电后,当电源返回时,程序将重新初始化,并以初始编程值开始循环。

然而,使这个项目不同的是,我们将使用EERAM自动在电源故障时保存数字值。当电源返回时,将恢复数字值,并且计数将继续使用电源失败时存在的值。

项目的完整计划EerAM_7_SEGING.C受到自由评论,并提供以下叙述以进一步解释。

项目步骤

您必须在运行程序之前设置状态寄存器中的ASE位以启用自动存储(请参阅描述eeram_cntrl_status_reg.c的部分。演示程序仅使用自动存储功能而不是先前解释的软件或硬件存储功能。

该程序使用全局变量LOC1pre和LOC2post在EERAM中指定两个地址来保存数字值。我们随意选择了地址200和202。

程序的main()函数首先延迟适当的间隔,以允许EEPROM在上电时转移到SRAM。随后,GPIO和我2C被初始化,并且读取LOC1PRE和LOC2POST中的SRAM位置以在输入计数和显示循环之前确定数字的值。

基本方法是执行计数和显示循环

  1. 从SRAM (LOC1pre和LOC2post)中读取数字的当前值,
  2. 更新该值,
  3. 保存SRAM(LOC1PRE)中的值,
  4. 更改显示屏上的值,
  5. 更新SRAM(LOC2POST)中的值,
  6. 然后等三秒钟再做一次。

当前一个值为'9'时,它会更新为“0”。这很简单,但有一些皱纹。

首先,我们将数字的值保存两次,一次(LOC1pre)在更改显示前立即保存,一次(LOC2post)在更改显示后立即保存。之所以采用这种方案,是因为有可能在更新显示变量后,但在完成显示更新之前,电源中断。(诚然,这不太可能,而且我在测试中从未见过这种情况发生。)可以检测到这样的发生,而且可以想象,如果真的发生了,您可能希望以特定的方式处理更新。在包含的程序中,如果检测到这种情况,我们简单地调用一个哑例程(mismatch(void)),但我们假定LOC1pre的值为数字计数。

该程序还需要能够检测首次运行以设置数字计数的初始值。在这种情况下,假设是第一次运行程序,LOC1PRE和LOC2POST的值是'255'。因此,这些位置必须具有255的起始值,可以使用实用程序eeram_s_rw.c或eeram_rw.c。如果这些位置被读为“255”,则计数初始化为“0”。

我们还检查计数的无效值,它是大于9的任何值,大于9且小于255.如果读取的值损坏或存在某种无意的编程错误,则才会发生这种情况。在这种情况下,发生终端错误,并输入显示屏上闪烁'e'的函数。在我的情况下也调用该函数2C传输错误。除了显式测试功能时,我从未观察到测试期间发生这种情况。

此时在程序流中,已找到有效的计数值并显示。该计数是EERAM的保存值,如果存在电源故障,则从EEPROM恢复,或者在首次执行程序时是初始值。延迟3秒后,程序进入主计数和显示循环。

该程序的其余部分包含应通过代码中的评论轻松理解的支持函数。

面包板上已完成的项目(左:eerAl电路;右:7位数显示电路)。

你可以按自己的喜好关闭电源,当电源恢复时,显示器将显示电源被移除时的值,并从那里继续运行。

虽然该程序是一个简单的演示,但很容易看出如何扩展程序以保存和恢复多个程序变量以及其他数据。

结束思想

EERAM提供了一种相对简单且经济的方法来解决与电源故障后变量和数据丢失相关的问题。它确实需要一些编程开销 - 但是,在我看来,它比构建保持功率长度所需的电路更简单,更容易实现,以便将相同的内容写入单独的EEPROM。

因为用户程序仅与SRAM交互,所以EEPROM耐久性的问题被最小化,因为只在电源故障或在程序控制下的显式动作之后发生。硬件启动存储,软件存储/调用和内存块保护的附加功能提供了额外的灵活性。

单击下面的链接可以下载项目的程序文件:

EerAM_Code.zip.

为自己提供这个项目!得到bom。