ATmega168 EEPROM数据存储器

发布者:zonheny最新更新时间:2022-01-12 来源: eefocus关键字:ATmega168  EEPROM  数据存储器 手机看文章 扫描二维码
随时随地手机看文章

ATmega168包含512字节的EEPROM数据存储器。它是作为一个独立的数据 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问由地址寄存器数据寄存器和控制寄存器决定。

具体的 SPI 及并行下载 EEPROM 数据请参见 P254“存储器编程”。

EEPROM 读/ 写访问

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

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

为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。具体参看EEPROM控制寄存器的内容。

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

EEPROM 地址寄存器- EEARH和EEARL

mega168 EEPROM 地址寄存器-EEARH和EEARL

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

· Bits 8..0 – EEAR8..0: EEPROM 地址
EEPROM 地址寄存器 – EEARH和EEARL指定了 512 字节的EEPROM。
EEPROM 地址是线性的,从 0 到 511 。 EEAR 的初始值没有定义。 在访问EEPROM 之前必须为其赋予正确的数据。
EEAR8 在 ATmega48 中为无效位,必须始终将其赋值为 ”0”。

EEPROM 数据寄存器 - EEDR

mega168 EEPROM 数据寄存器-EEDR

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

EEPROM 控制寄存器- EECR

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

· Bit 5, 4 – EEPM1 与 EEPM0: EEPROM 编程模式位
EEPROM编程模式位的设置决定对EEPE写入后将触发什么编程方式。EEPROM的编程可以作为一个原子操作来实现擦除老的数据并写入新的数据,也可以将擦除与写操作 分为两步进行。不同编程模式的时序请见 Table2。 EEPE 置位时,对 EEPMn 的任何写操作都将会被忽略。在复位过程中,除非 EEPROM 处于编程状态,EEPMn 位将被设置 为 0b00。

mega168 EEPROM模式位

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

· Bit 2 – EEMPE: EEPROM 写使能
EEMPE决定设置EEPE为"1“是否可以启动EEPROM写操作。当EEMPE为"1“时,在4个时钟周期内置位 EEPE 将把数据写入 EEPROM 的指定地址;若 EEMPE 为 "0“,则EEPE不起作用。EEMPE置位后4个周期,硬件对其清零。见EEPROM写过程对EEPE位的描述。
· Bit 1 – EEPE: EEPROM 写使能
写使能信号 EEPE 是 EEPROM 的写入选通信号。当 EEPROM 数据和地址设置好之后,需置位 EEPE 以便将数据写入 EEPROM。此时 EEMPE 必须置位,否则 EEPROM 写操作将不会发生。写时序如下 ( 第 3 和第 4 步的次序可更改 ):
1. 等待EEPE 位变为零
2. 等待SPMCSR 中的SPMEN 位变为零
3. 将新的EEPROM 地址写入EEAR ( 可选)
4. 将新的EEPROM 数据写入EEDR ( 可选)
5. 对EECR 寄存器的EEMPE 写"1",同时清零EEPE
6. 在置位EEMPE 的4 个周期内,置位EEPE

在 CPU 写 Flash 存储器的时候不能对 EEPROM 进行编程。 在启动 EEPROM写操作之前软件必须要检查Flash写操作是否已经完成。第二步仅在软件包含引导程序,允许CPU对 Flash 进行编程时才有用。如果 CPU 永远都不会写 Flash,则第二步可以忽略。请参考 P240“Boot Loader 支持 RWW 自编程, ATmega88 与 ATmega168”。(注意:ATmega48 无Boot Loader)

注意 : 如有中断发生于步骤 5 和 6 之间将导致写操作失败。 因为此时 EEPROM 写使能操作将超时。如果一个操作EEPROM的中断打断了另一个EEPROM操作,EEAR或EEDR寄存器可能被修改,引起 EEPROM 操作失败。建议此时关闭全局中断标志 I。

经过写访问时间之后,EEPE硬件清零。用户可以凭此位判断写时序是否已经完成。EEPE置位后, CPU 要停止两个时钟周期才会运行下一条指令。

· Bit 0 – EERE: EEPROM 读使能
读使能信号 EERE是 EEPROM的写入选通信号。 当 EEPROM地址设置好之后,需置位EERE以便将数据读入EEAR。EEPROM数据的读取只需要一条指令。读取EEPROM时 CPU 要停止 4 个时钟周期然后才能执行下一条指令。

用户在读取EEPROM 时应该检测EEPE。如果一个写操作正在进行,就无法读取EEPROM,也无法改变寄存器EEAR。 经过校准的片内振荡器用于EEPROM定时。

标定的振荡器用于 EEPROM 访问定时。 Table3 为 CPU 访问 EEPROM的典型时间。

ATmega168 EEPROM编程时间

下面的代码分别用汇编和C函数说明如何实现EEPROM的写操作。在此假设中断不会在执行这些函数的过程当中发生。例子同时还假设软件没有引导程序。若引导程序存在,则 EEPROM 写函数还需要等待正在进行的 SPM 命令的结束。

汇编代码例程
EEPROM_write:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_write
; 设置地址寄存器 (r18:r17)
out EEARH, r18
out EEARL, r17
; 将数据写入数据寄存器(r16)
out EEDR,r16
; 置位EEMPE
sbi EECR,EEMPE
; 置位EEPE 以启动写操作
sbi EECR,EEPE
ret
C 代码例程
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* 等待上一次写操作结束 */
while(EECR & (1<;
/* 设置地址和数据寄存器*/
EEAR = uiAddress;
EEDR = ucData;
/* 置位EEMPE */
EECR |= (1</* 置位EEPE 以启动写操作*/
EECR |= (1<

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

汇编代码例程
EEPROM_read:
; 等待上一次写操作结束
sbic EECR,EEPE
rjmp EEPROM_read
; 设置地址寄存器 (r18:r17)
out EEARH, r18
out EEARL, r17
; 设置EERE 以启动读操作
sbi EECR,EERE
; 自数据寄存器读取数据
in r16,EEDR
ret
C 代码例程
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* 等待上一次写操作结束 */
while(EECR & (1<;
/* 设置地址寄存器*/
EEAR = uiAddress;
/* 设置EERE 以启动读操作*/
EECR |= (1</* 自数据寄存器返回数据 */
return EEDR;


在掉电休眠模式下的EEPROM写操作

若程序执行掉电指令时EEPROM的写操作正在进行,EEPROM的写操作将继续,并在指定的写访问时间之前完成。 但写操作结束后,振荡器还将继续运行,单片机并非处于完全的掉电模式。因此在执行掉电指令之前应结束EEPROM 的写操作。

防止EEPROM 数据丢失

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

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

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


关键字:ATmega168  EEPROM  数据存储器 引用地址:ATmega168 EEPROM数据存储器

上一篇:ATmega168 I/O存储器
下一篇:ATmega168 SRAM数据存储器

推荐阅读最新更新时间:2024-11-25 10:28

PIC内部EEPROM读写
从EEPROM中读取数据步骤: 1、把地址写入到地址寄存器EEADR中,注意该地址不能超过所用PIC1687X型号单片机内部EEPROM实际容量。 2、把控制位EEPGD清零,以选定读取对象为EEPROM数据存储器。 3、把控制位RD置1,启动本次读操作。 4、读取已经反馈到EEDATA寄存器中的数据。 写EEPROM数据存储器的操作步骤: 1、确保目前的WR=0;假如WR=1,表明一次写操作正在进行,需要查询等待。 2、把地址送入EEADR中,并且确保地址不会超出目标单片机内部EEPROM的最大地址范围。 3、把准备烧写的8位数据送入EEDATA中。 4、清除控制位EEPGD,以指定EEPROM作为烧写对象。 5、把写使能位WRE
[单片机]
Linux下I2C总线EEPROM驱动程序设计方法
  1 引言   I2C (Inter-Integrated Circuit1 总线 是一种由Philips公司开发的2线式串行总线,用于连接微 控制器 及其外围设备。它是同步 通信 的一种特殊形式,具有 接口 线少、控制方式简单、器件封装形式小、通信速率较高等优点。在主从通信中,可有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。笔者在开发基于MPC8250的 嵌入式 Linux系统的过程中发现I2C总线在 嵌入式系统 中应用广泛,I2C总线控制器的类型比较多,对系统提供的操作接口差别也很大。与I2C总线相连的从设备主要有微控制器、EEPROM、实时 时钟 、A/D转换器等.MPC8250处理器正是通过内部的
[电源管理]
Linux下I2C总线<font color='red'>EEPROM</font>驱动程序设计方法
利用C8051F020的SPI接口扩展大容量数据存储器
引言 在以网络通讯、软件和微电子为主要标志的信息产业飞速发展的今天,以为微处理器为核心的嵌入式系统随处可见,这些系统应用的典型例子包括移动电话系统、汽车的应用、家用电器、航天应用、医疗设备和国防系统等 。作为嵌入式系统核心部分的微处理器分为8位,16位,32位和64位四大类。对于很大一部分应用领域,性能要求相对较低,而产品成本是最重要的考虑因素,这种情况下8位微处理器将是最佳选择。在8位微处理器中8051芯片家族具有低成本、大范围、易获得和应用广泛的特点,是开发嵌入式优秀平台。另外需要指出的是为了适应目前IC产业中流行的SOC(system on a chip)设计潮流,许多著名半导体公司纷纷推出了基于8051架构的8051 S
[单片机]
利用C8051F020的SPI接口扩展大容量<font color='red'>数据</font><font color='red'>存储器</font>
C51数据存储器中存储方式各是什么
C51字节数据、整型数据以及长整型数据在存储器中的存储方式各是怎样的? 答:字符变量(char)无论是unsigned char数据还是signed char数据,均为1个字节,即8位,因此被直接存储在RAM中,可能存储在0~0x7f区域(包括位寻址区域),也可能存储在0x80~0xff区域,与变量的定义有关。 整型变量(int)不管是unsigned int数据还是signed int数据,均为2个字节,即16位,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面)。 长整型变量(long)为4个字节,即32位,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高
[单片机]
基于AVR单片机中的EEPROM和FLASH的区别及使用方法解析
1.EEPROM介绍 Electrically Erasable Programmable Read Only Memory电气可拭除可编程只读存储器 发展过程:ROM – 》 PROM –》 EPROM –》 EEPROM 2.EEPROM和FLASH的区别 2.1 使用上的区别 FLASH用于存放程序,在程序运行过程中不能更改。我们编写的程序是烧录到FLASH中的; RAM用作程序运行时的数据存储器; EEPROM用于存放数据,是用来保存掉电后用户不希望丢的数据,开机时用到的参数。运行过程中可以改变。 FLASH是用于存储程序代码的,有些场合也可能用它来保存数据,当然前提是该单片机的FLASH工艺是可以自写的(运行中可
[单片机]
基于AVR单片机中的<font color='red'>EEPROM</font>和FLASH的区别及使用方法解析
PIC单片机选用存储体0或1的方法
PIC单片机中级产品PIC16C6X的数据存储器通常分为两个存储体,即存储体0(Bank0)和存储体1(Bank1)。每个存储体都是由专用寄存器和通用寄存器两部分组成的。两个存储体中的一些寄存器单元实际上是同一个寄存器单元,却又具备有不同的地址。例如本版介绍的PIC16F84的状态寄存器STATUS-Reg的两个地址是03H和83H。又如通用寄存器也是如此。 不同型号的PIC单片机,其数据存储器的组成(即功能)是不完全相同的,所以设计人员一旦选用了某个PIC单片机的型号后,常要查找该单片机的数据存储器资料,以便编程用。 以PIC16F84在MPLAB集成开发软件的环境下编写的源程序中,有关RB口(RB7、RB6…RB0)初
[单片机]
PIC单片机选用存储体0或1的方法
51单片机 EEPROM 24c02 读取存储多字节
先将数据存进去,然后再读出来显示在数码管上。 除了代码里定义的连线外还要把p0连接到8位数码管的8针上。 1 /*-- 2 名称:IIC协议 EEPROM24c02 3 内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据, 4 掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。 5 函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 6 周期,即晶振频率要小于12MHZ) 7 */ 8 #include reg52.h //头文件的包含 9 #include intrins.
[单片机]
stm32专题十七:EEPROM存储小数
在计算机中,数据类型是取决于解码的方式,而在内存中保存的数据,并不会因为解码方式发生改变。 eg:1111 1111 8位数据。当用 uint8_t 来解析时,值为255,而当用 int8_t 来解析时,值为-128。 浮点数:在目前绝大多数机器中,float 类型占据4字节。 我们在利用EEPROM保存浮点数时,实际上就是直接把数据存进去,然后再以 float 类型解析出来。这几种的一个关键的地方,就是在利用I2C发送数据时,利用void *进行强制类型转换,把原来long double和int类型的数据转换成不确定类型的指针。然后一个一个字节的发送就可以。最后,浮点数以%f读出,整数以%d读出。 本博客参考野火
[单片机]

推荐帖子

51单片机模拟SOI接口 挂载两个flash读写程序
使用51单片机模拟SPI接口挂载两个flash可已正确实现读写操作以及芯片ID读取等操作 51单片机模拟SOI接口挂载两个flash读写程序
liuxiang5119 51单片机
有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?
有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?芯片在哪买?有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?不贵,看你是不是需要定制了。xiexie~~~~~
xouxie ARM技术
2022年省赛题目出来了
https://res.nuedc-training.com.cn/topic/2022/topic_from_15.html2022年省赛题目出来了大家觉得今年的题目怎么样,TI公司回复:今年参考赛题的C、D、E题适合高职学生竞赛控制类还是跟随小车难度低一些。D题:混沌信号产生实验装置感觉好难有老师对今年D题的有所研究吗?第二问带宽达到40M感觉好难混沌信号是什么啊?如果弄懂这个概念应该还是不难的,毕竟是一个电子大赛 主要是题目还限制元器件,只能
Lengler 电子竞赛
【翌创ET6001】-03-定时器测试
官网的定时器有点让人捉摸不透,只运行一次,自己找了好久原因,还程序不运行,然后自己找了一下原因,然后吧自己的过程写下来,首先我们看一下定时器的时钟树。使用64位的定时器的话我们直接按照官网的PTIM2来进行操作。然后时钟的频率可以在参考手册里面看到。可以看到时钟频率是100M,我们这里的话就可以进行编程了。voidPTIMER_peripheral_init(void){PTIM_InitTypeDefinit;PTIM_StructInit(
申小林 国产芯片交流
锂电池3.7V电源管理IC
求一块带使能的3.7V锂电池IC控制充放电的IC芯片1、电流1A2、带有EN使能引脚,默认放电3、放电能够带有同步升压功能升压输出在5-9V之间锂电池3.7V电源管理IC单节锂电池充电IC,好找啊,要求不高国产的有好几款都比较好用同步升压功能的ZS6300FM9603PS7516也是同步升压好的,我去了解一下,谢谢各位{:1_107:}3.7V锂电池供电,需要同时用到5V和3.3V。1、是直接使用3.7V锂电池加个LDO直接降压3.3V,2、还是先升至5V,然后再
点点舒 电源技术
求高手指教一个高压放在电路的问题
能不能帮我看一个电路,我的电路是这样的,一个高压放大电路,是要将0-2.5V的电压放大到0-150V,我的供电电压是200,也就是图上的+105ISO换成了200V,2N5551换成了MSPA42,R49换成了58K,R50换成了2K,R19换成了130K,可是我现在发现输出在-1.7V-200V之间,而且电路不是线性的,为什么?求高手指教一个高压放在电路的问题仔细看了这个电路,在这个需要较高输出电压的直流放大电路中还有几个问题请教,以便继续讨论:1、末级电源电压就是200V,原来是多少?
zhangxyttkx 模拟电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved