历史上的今天
返回首页

历史上的今天

今天是:2024年10月26日(星期六)

2021年10月26日 | ATmega8 EEPROM数据存储器

2021-10-26 来源:eefocus

EEPROM 数据存储器

ATmega8 包含512 字节的EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。EEPROM 的寿命至少为100,000 次擦除周期。EEPROM 的访问由地址寄存器、数据寄存器和控制寄存器决定。

P 209“ 存储器编程” 包含使用SPI 或并行编程模式对EEPROM 编程。



EEPROM 读/ 写访问

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

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

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

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



EEPROM 地址寄存器- EEARH和EEARL

ATmega8 EEPROM 地址寄存器

• Bits 15..9 – Res: 保留
保留位,读操作返回值为零。
• Bits 8..0 – EEAR8..0: EEPROM 地址
EEPROM地址寄存器– EEARH和EEARL指定了512字节的EEPROM空间。EEPROM地址是线性的,从0 到511。EEAR 的初始值没有定义。在访问EEPROM 之前必须为其赋予正确的数据。



EEPROM 数据寄存器- EEDR

ATmega8 EEPROM 数据寄存器

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



EEPROM 控制寄存器- EECR

ATmega8 EEPROM 控制寄存器

• Bits 7..4 – Res: 保留
保留位,读操作返回值为零。
• Bit 3 – EERIE: EEPROM 就绪中断使能
若SREG 的I 为"1",则置位EERIE 将使能EEPROM 就绪中断。清零EERIE 则禁止此中断。当EEWE 清零时EEPROM 就绪中断即可发生。
• Bit 2 – EEMWE: EEPROM 主机写使能
EEMWE决定了EEWE置位是否可以启动EEPROM写操作。当EEMWE为"1"时,在4个时钟周期内置位EEWE 将把数据写入EEPROM 的指定地址;若EEMWE 为"0“,则操作EEWE 不起作用。EEMWE 置位后4 个周期,硬件对其清零。见EEPROM 写过程中对EEWE 位的描述。
• Bit 1 – EEWE: EEPROM 写使能
EEWE 为EEPROM 写操作的使能信号。当EEPROM 数据和地址设置好之后,需置位EEWE以便将数据写入EEPROM。此时EEMWE必须置位,否则EEPROM写操作将不会发生。写时序如下( 第3 步和第4 步的次序并不重要):
1. 等待EEWE 位变为零。
2. 等待SPMCSR 中的SPMEN 位变为零。
3. 将新的EEPROM 地址写入EEAR( 可选)。
4. 将新的EEPROM 数据写入EEDR( 可选)。
5. 对EECR 寄存器的EEMWE 写"1",同时清零EEWE。
6. 在置位EEMWE 的4 个周期内,置位EEWE。

在CPU 写Flash 存储器的时候不能对EEPROM 进行编程。在启动EEPROM 写操作之 前软件必须检查 Flash 写操作是否已经完成。步骤(2) 仅在软件包含引导程序并允许CPU 对Flash 进行编程时才有用。如果CPU 永远都不会写Flash,步骤(2) 可省略。请参见P 196“ 支持引导装入程序 -在写的同时可以读(RWW, Read-While-Write) 的自我编程能力 ” 。

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

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

• Bit 0 – EERE: EEPROM 读使能
EERE为EEPROM读操作的使能信号。当EEPROM地址设置好之后,需置位EERE以便将 数据读入EEAR。EEPROM 数据的读取只需要一条指令,且无需等待。读取EEPROM 后CPU 要停止4 个时钟周期才可以执行下一条指令。

用户在读取EEPROM 时应该检测EEWE。如果一个写操作正在进行,就无法读取 EEPROM,也无法改变寄存器EEAR。

经过校准的片内振荡器用于EEPROM定时。Table 1 为CPU访问EEPROM的典型时间。ATmega8 EEPROM 编程时间

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

汇编代码例程EEPROM_write:; 等待上一次写操作结束sbic EECR,EEWErjmp EEPROM_write; 设置地址寄存器 (r18:r17)out EEARH, r18out EEARL, r17; 将数据写入数据寄存器(r16)out EEDR,r16; 置位EEMWEsbi EECR,EEMWE; 置位EEWE 以启动写操作sbi EECR,EEWEretC 代码例程void EEPROM_write(unsigned int uiAddress, unsigned char ucData){/* 等待上一次写操作结束 */while(EECR & (1<下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函数的过程当中发生。

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


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

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



防止EEPROM 数据丢失

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

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

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


推荐阅读

史海拾趣

CTS [CTS Corporation]公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,CTS始终坚持技术创新和数字化转型。公司投入大量资源进行研发,不断推出具有竞争力的新产品和解决方案。同时,CTS还积极拥抱数字化技术,通过云计算、大数据和人工智能等技术手段提升生产效率和服务质量。

Block USA Inc.公司的发展小趣事

Block USA Inc.最初以其线下支付业务Square在电子支付领域崭露头角。公司创始人杰克·多尔西洞察到小型商户在支付处理方面的需求,并推出了简单易用的磁条卡读卡器Square Reader。这一创新产品迅速受到市场欢迎,帮助无数小型企业和个体经营者实现了便捷、安全的电子支付。随着Square品牌的知名度不断提升,Block逐渐在支付领域建立了坚实的地位。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司在电子行业中崭露头角,源于其一项革命性的无人机技术。公司研发团队历经数年努力,成功开发出一款具有高精度导航和稳定飞行能力的无人机,广泛应用于农业监测、地质勘探等领域。这一技术的推出,不仅填补了市场空白,还为公司赢得了大量订单和合作伙伴,推动了公司的快速发展。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

HCH Co公司的发展小趣事

背景:随着全球对环境保护和可持续发展的重视程度不断提高,HCH Co公司积极响应号召,开始了绿色转型之路。公司致力于开发环保型电子产品和绿色生产技术,以减少对环境的影响。

发展:通过不断的技术创新和生产工艺的改进,HCH Co公司成功推出了一系列环保型电子产品,如可回收材料制成的外壳、低功耗的显示屏等。同时,公司还加强了废弃电子产品的回收和再利用工作,实现了资源的循环利用。绿色转型不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。

风华邦科(FH-BK)公司的发展小趣事

广东粤翔航空服务有限公司(假设为FlyWin集团下的子公司)于2019年在珠海市金湾区成立,专注于航空咨询服务和航空器材租赁买卖。在成立初期,公司面临着航空服务市场的高度竞争和严格的行业监管。然而,凭借对市场的敏锐洞察和精准定位,粤翔航空通过提供专业的航空咨询和高效的器材租赁服务,逐渐在行业内站稳脚跟。公司不仅为多家航空公司提供了一站式的咨询服务,还成功促成了多笔航空器材的租赁交易,为公司后续的发展奠定了坚实基础。

问答坊 | AI 解惑

电子元器件配套知识大全(一)

电子元器件配套知识大全(一)…

查看全部问答>

使用gprs猫进行ppp拨号,ppp的两端是什么?

比如把我的gprs modem 和开发版接起来,在开发版上进行ppp拨号,这时候建立ppp的两端是指      “开发版  和  基站” 还是 “开发版  和  猫” 或者 “猫     &nb ...…

查看全部问答>

烧写片外flash,用Jlink还是ulink??笔记本开发Embed

    最近在家用笔记本移植uclinux,在公司都是用通过 H-JTAG把bin文件烧写到片外Nor Flash了,直接用HJTAG的HFlasher工具 很方便。用自己做的HJTAG的wingger小板,现在在家用笔记本,没有并口,大概了解要使用jlink、或ulink,在HJTAG的 ...…

查看全部问答>

请问2410的LCD控制器的行场同步问题

    我配置S3C2410的LCD控制器,点亮了LCD屏,但是画面存在错位。我的屏是320*240,TFT     屏的偏左侧有一道1.5cm宽的黑色条块,然后才是WinCE的桌面,然后屏的最左侧是原本应该在最右侧的图像。大概和下面的标注一样: 12 ...…

查看全部问答>

wince下用c#开发pda里的mp3播放程序,代码是怎么写的,好象没有winmm.dll是吧。

wince下好象是没有winmm.dll的是吧。 谁知道哪里有这些资料的,谢谢了。会及时揭贴的。希望发一些好的资料给我参考下。 以前没怎么做过pda下的程序。…

查看全部问答>

请教s3c44b0伪指令OPT的用途

OPT这条伪指令的功能对源码设置列表输出选择,包括强制换页,强制行号变为零等, 1、设置后代码列表是在哪生成的? 2、OPT在实际应用中起到一个什么作用? 3、常应用于什么场合?…

查看全部问答>

程序报error lnk2019的错误?请高手指教

       我有一个evc工程,以前编译,连接是通过的,现在我换了一个sdk,然后就报unresolved external symbol _X509_LOOKUP_ctrl referenced in function in function \"int __cdecl pkcs11_verify_prepare(struct x509_store_ ...…

查看全部问答>

用tftp传的可执行文件为什么告诉我找不到

我从别的机器用tftp考了个可执行文件到本机的dvs目录下,可运行它时却被告知找不到。ls后发现拷贝成功,已存在。请问知道什么原因吗?…

查看全部问答>

如何学习单片机

初学者应如何学习单片机…

查看全部问答>

6446 dsp端codec的信息在超级终端中输出

请问使用合众达的例子,合众达下的codec文件夹下的videnc_copy.c中XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs,    XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs){  &nbs ...…

查看全部问答>