历史上的今天
今天是:2025年07月01日(星期二)
2020年07月01日 | ATtiny2313 EEPROM数据存储器
2020-07-01 来源:eefocus
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

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

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

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

· 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 电平无法满足要求则可以使用外部复位电路。若写操作过程当中发生了 复位,只要电压足够高,写操作仍将正常结束。
史海拾趣
|
我在WINCE下用DDRAW做UI,发现图片有时被撕裂了。现在我想用三缓冲的方法去做,希望能解决这个问题。可是我怎么做好像都不成功。下面是代码。还请高手看一下。 LPDIRECTDRAW4 g_ ...… 查看全部问答> |
|
求助:大家好,我是个新新手,想请教SIM300C无线数传的问题。 大家好! 我刚刚接触SIM300C,单片机通过串口连接SIM300C,要实现数据传输应该怎样设置SIM300C?哪位专家能否给我一个设置流程,万分感谢!… 查看全部问答> |
|
一直在作音视频驱动,总是在和硬件打交道。感觉还是硬件那边稳定,不用再学好多乱七八糟得编程语言。 python,jsp,vbscript,C#,。。。 硬件那边只要把电路搞得很通就行了。爽啊。… 查看全部问答> |
|
昨天才出的,英文网站已经更新,中文网站还要等几天http://focus.ti.com/docs/toolsw/folders/print/dk-lm3s9d96.html?HQS=mcu_firestorm_110724&DCMP=mytinwsltr_07_25_2011&sp_rid_pod3=LTc5NzAyMjkzOAS2&sp_mid_pod3=495039… 查看全部问答> |
|
msp430f5438测频率成功,能测60K一下频率,误差50HZ以内! #include #include \"LCD_12864.h\" #include \"CLOCK.h\" unsigned int end,start; unsigned char overflow; unsigned long fre; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL ...… 查看全部问答> |
|
atlium 作出来的lm3s下载器,漂亮! 不多说,上传图片! [ 本帖最后由 paulhyde 于 2012-5-17 10:20 编辑 ]… 查看全部问答> |
|
从公司原来的深圳提供芯片那里询了下价,比ti官方价格*汇率要高不少啊。。不知道官方代理会怎么样。。 从ti官网看的k片参考价格。正式去代理商那里下单 k片购买有问题吗?会要加钱吗?没货怎么办? 请教下关于ti官方代理商那里购买芯片要注意什么 ...… 查看全部问答> |




