logo

AVR应用笔记 AVR单片机内核剖析 ATtiny2313 EEPROM数据存储器

ATtiny2313 EEPROM数据存储器

以下资料参考马潮老师的中文手册,由微雪电子整理并发布,转载请注明出处:www.waveshare.net,否则追究相应责任!

ATtiny2313包含128字节的EEPROM数据存储器。它是作为一个独立的数据 可以按字节读写。EEPROM的寿命至少为 100,000 次擦除周期。EEPROM 的访问由地 址寄存器、数据寄存器和控制寄存器决定。详见 EEPROM的串行数据下载。

EEPROM 读/ 写访问

EEPROM 的访问寄存器位于I/O 空间。

EEPROM的写访问时间由Table 1给出。自定时功能可以让用户软件监测何时可以开始写 下一字节。用户操作 EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路 中,上电 下电时 VCC 上升/下降速度会比较慢。此时 CPU 可能工作于低于晶振所要求 的电源电压。请参见 P19“ 防止 EEPROM 数据丢失 ” 以避免出现 EEPROM 数据丢失的问题。

为了防止无意识的 EEPROM 写操作,需要执行一个特定的写时序。详见关于 EEPROM
控制寄存器的说明。

执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。

EEPROM 地址寄存器-EEAR

ATtiny2313 EEAR 地址寄存器

· Bits 7– Res: 保留
保留位,读操作返回值为零。

· Bits 6..0 – EEAR6..0: EEPROM 地址
EEPROM地址寄存器EEARL指定了128字节的EEPROM EEPROM地址是线性的, 从 0 到 127。EEAR 的初始值没有定义。在访问 EEPROM 之前必须为其赋予正确的数据。

EEPROM 数据寄存器 - EEDR

ATtiny2313 EEDR 数据存储器

· Bits 7..0 – EEDR7.0: EEPROM 数据
对于 EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;对于读操作, EEDR 是 从地址 EEARL 读取的数据。

EEPROM 控制寄存器- EECR

ATtiny2313 EECR 控制存储器

· Bits 7..6 – Res: 保留
保留位,读操作返回值为零。

· Bit 5,4 – EEPM1与 EEPM0: EEPROM编程模式位
设置编程模式位定义当对EEPE写入时触发哪种编程方式。可能在一个时钟周期中数据编 程 (擦除旧值写入新值) 或将擦除与写操作分为两步。不同模式的编程时间见 Table 1。当 EEPE 置位,对 EEPMn 的写操作将忽略。复位时,除非 EEPROM 处于编程状态,否则 EEPMn 位将复位为 0b00。

ATtiny2313 EEPROM 模式位


· Bit 3 – EERIE: EEPROM 准备好中断使能
若 SREG 的 I 为 "1",则置位 EERIE 将使能 EEPROM 准备好中断。清零 EERIE 则禁止 此中断。当 EEWE清零时 EEPROM 准备好中断即可发生。

· Bit 2 – EEMPE: EEPROM 主机编程使能
EEMPE 位决定 EEPE 写入 "1” 是否有效。当 EEMPE为 "1" 时,在四个时钟周期内设置 EEPE 将会在 EEPROM 指定的位置编程;若 EEMPE为 "0“,设置 EEPE 无效。当 EEMPE 由软件写入 "1”,则在四个时钟周期后由硬件清零。

· Bit 1 – EEPE: EEPROM 编程使能
EEPE 为 EEPROM 的编程使能信号。当 EEPE 为 "1",通过 EEPMn 位的设置,将会对 EEPROM编程。在EEPE写入逻辑"1"前,EEMPE位必须写入"1",否则不会出现EEPROM 写操作。当写访问时间结束,EEPE 位由硬件清零。当 EEPE 置位, CPU 在执行指令前 终止两个时钟周期。

· Bit 0 – EERE: EEPROM读使能
EERE为EEPROM读操作的使能信号。当EEPROM地址设置好之后,需置位EERE以便将 数据读入 EEARL。EEPROM 数据的读取只需要一条指令,且无需等待。读取 EEPROM 后 CPU 要停止 4 个时钟周期才可以执行下一条指令。用户在读取 EEPROM 时应该检测 EEPE。如果一个写操作正在进行,就无法读取 EEPROM,也无法改变寄存器 EEAR。

基本字节编程

使用基本字节编程是最简单的模式。当对 EEPROM 写入一个字节,用户必须将地址写入 EEARL寄存器,将数据写入EEDR寄存器。若EEPMn位为零,对 EEPE的写操作 (在对 EEMPE写完后的四个时钟周期内)将触发擦除/写入操作。擦除与写入操作在一个时钟周 期内完成,整个编程时间见 Table 1。 EEPE 位会保持置位,直到擦除与写入操作完成。 而当芯片处于编程状态时,不会进行其他 EEPROM操作。

分离字节编程

可以将擦除与写入操作分为两个周期。若系统需要对一些有限的时间缩短访问时间 ( 尤其 若电源电压下降 ) 该方式有效。使用该方式时,必须在写入操作前先进行擦除操作。但由 于擦除与写入操作是分离的,有可能当系统允许进行时间临界操作时 ( 尤其在掉电后 ) 进行擦除操作。

擦除

擦除一个字节,地址必须写入EEARL。若EEPMn为0b01,对EEPE写入 (在对EEMPE 写完后的四个时钟周期内 ) 将只触发擦除操作 ( 编程时间见 Table 1)。EEPE 位会保持到 擦除操作完成。而当芯片处于编程状态时,不会进行其他 EEPROM操作。

写入

写入时,用户必须将地址写入EEAR,将数据写入EEDR。若 EEPMn为0b10,对EEPE 写入 (在对EEMPE写完后的四个时钟周期内)将只触发写入操作(编程时间见Table 1)。 EEPE 位会保持到擦除操作完成。若在写入前数据没有擦除,则认为写入数据丢失。当ATtiny2313处于编程状态时,不会进行其他 EEPROM操作。
EEPROM访问使用标定振荡器定时。振荡器频率见P25“振荡器标定寄存器 – OSCCAL”。

下面ATtiny2313的代码分别用汇编和 C 函数说明如何实现 EEPROM 的擦除、写入或基本写入。在此假设中断不会在执行这些函数的过程当中发生。

汇编代码例程
EEPROM_write:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_write
; 设置编程模式
ldi r16, (0 << EEPM1)|(0 << EEPM0)
out EECR, r16
; 设置地址寄存器 r17
out EEARL, r17
; 将数据写入数据寄存器 (r16)
out EEDR,r16
; 置位 EEMWE
sbi EECR,EEMWE
; 置位 EEWE以启动写操作
sbi EECR,EEWE
ret

C 代码例程
void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
{
/* 等待上一次写操作结束 */
while(EECR & (1 << EEPE ))
;
/* 设置编程模式 */
EECR = (0 << EEPM1 )|(0 >> EEPM0 )
/* 设置地址与数据寄存器 */
EEARL = ucAddress;
EEDR = ucData;
/* 置位 EEMWE */
EECR |= ( 1 << EEMWE );
/* 置位 EEWE以启动写操作 */
EECR |= ( 1 << EEWE );
}

下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函数的过程当中发生。

EEPROM_read:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_read
; 设置地址寄存器 r17
out EEARL, r17
; 设置 EERE以启动读操作
sbi EECR,EERE
; 自数据寄存器读取数据
in r16,EEDR
ret

C 代码例程
unsigned char EEPROM_read(unsigned char ucAddress)
{
/* 等待上一次写操作结束 */
while(EECR & (1<< EEPE))
;
/* 设置地址寄存器 */
EEARL = ucAddress;
/* 设置 EERE以启动读操作 */
EECR |= (1<< EERE);
/* 自数据寄存器返回数据 */
return EEDR;
}

防止EEPROM数据丢失

若ATtiny2313电源电压过低,CPU 和 EEPROM有可能工作不正常,造成 EEPROM数据的毁坏 ( 丢 失 )。这种情况在使用独立的 EEPROM 器件时也会遇到。因而需要使用相同的保护方案。

由于电压过低造成 EEPROM 数据损坏有两种可能:一是电压低于 EEPROM 写操作所需 要的最低电压;二是 CPU 本身已经无法正常工作。

EEPROM 数据损坏的问题可以通过以下方法解决:

当电压过低时保持 AVR RESET 信号为低。这可以通过使能芯片的掉电检测电路 BOD 来 实现。如果 BOD 电平无法满足要求则可以使用外部复位电路。若写操作过程当中发生了 复位,只要电压足够高,写操作仍将正常结束。

 相关AVR资料说明

可作为如下AVR的参考资料: ATtiny13 ATtiny24 ATtiny44 ATtiny84 ATtiny2313 ATtiny26 ATmega48 ATmega88 ATmega168 ATmega8 ATmega16 ATmega32 ATmega64 ATmega128 ATmega162 ATmega169 ATmega169P ATmega8515 ATmega8535

 相关AVR型号资料

ATtiny13 ATtiny24 ATtiny44 ATtiny84 ATtiny26 ATtiny2313
ATmega48 ATmega88 ATmega168 ATmega8 ATmega16 ATmega32
ATmega64 ATmega128 ATmega162 ATmega169 ATmega8515 ATmega8535

ATtiny2313 EEPROM数据存储器

——