收藏 分销(赏)

e2prom操作.doc

上传人:仙人****88 文档编号:6662660 上传时间:2024-12-19 格式:DOC 页数:5 大小:71KB 下载积分:10 金币
下载 相关 举报
e2prom操作.doc_第1页
第1页 / 共5页
e2prom操作.doc_第2页
第2页 / 共5页


点击查看更多>>
资源描述
AVReeprom操作 变量声明 char eeprom a; 执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行 EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。 读写函数 //函数名: EepromWrite ( unsigned int addr, unsigned char val) //功能  :向EEPROM制定地址写入制定内容 //参数  :unsigned int addr, unsigned char val 分别为要写入的地址和数据 //示例  :EepromWrite (0x20,0x41) 向0x20地址写入0x41 //============================================ void EepromWrite ( unsigned int addr, unsigned char val) {    while ( EECR&0x02 );  //判断EEWE是否为0     EEAR = addr;     EEDR = val;     CLI();     EECR = EECR|0x04;     //置EEMWE为1     EECR = EECR|0x02;     //置EEWE为1     SEI();   } //============================================ //函数名: EepromRead (uchar num, uint addr, uchar *val) //功能  :读出EEPROM中制定地址制定长度的数据 //参数  :unsigned int addr, unsigned char val 分别为要读出数据的长度、入口地址和接收指针 //示例  :EepromRead (10,0x20,data) 读出0x20以后10个数据存入data指针指向的内存空间 //============================================ void EepromRead (unsigned char num, unsigned int addr, unsinged char *val) {    while (num)   {        while ( EECR&0x01 );  //判断EEWE是否为0      EEAR = addr;      EECR = EECR|0x01;     //置EERE为1      *val = EEDR;      addr++;      val++;       num--;   } } EEPROM 数据存储器 ATmega16 包含512 字节的EEPROM 数据存储器。它是作为一个独立的数据空间而存在 的,可以按字节读写。EEPROM 的寿命至少为100,000 次擦除周期。EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 通过SPI和JTAG及并行电缆下载EEPROM数据的操作请分别参见 P260、 P265及P250。 EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。 EEPROM的写访问时间由Table 1给出。自定时功能可以让用户软件监测何时可以开始写 下一字节。用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路 中,上电/ 下电时VCC 上升/ 下降速度会比较慢。此时CPU 可能工作于低于晶振所要求 的电源电压。请参见 P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的 问题。 为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。具体参看EEPROM 控制寄存器的内容。 执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行 EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。 EEPROM 地址寄存器- EEARH 和EEARL • Bits 15..9 – Res: 保留 保留位,读操作返回值为零。 • Bits 8..0 – EEAR8..0: EEPROM 地址 EEPROM地址寄存器– EEARH和EEARL指定了512字节的EEPROM空间。EEPROM地 址是线性的,从0 到511。EEAR 的初始值没有定义。在访问EEPROM 之前必须为其赋 予正确的数据。 EEPROM 数据寄存器 - EEDR • Bits 7..0 – EEDR7.0: EEPROM 数据 对于EEPROM 写操作, EEDR 是需要写到EEAR 单元的数据;对于读操作, EEDR 是 从地址EEAR 读取的数据。 EEPROM 控制寄存器- EECR • 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) 可省略。请参见 P234“支持引导装入程序 – 在写的同时可以读(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的典型时间。 Table 1. EEPROM 编程时间 Note: 1. 使用时钟频率为1 MHz,不倚赖CKSEL 熔丝位的设置。 下面的代码分别用汇编和C 函数说明如何实现EEPROM 的写操作。在此假设中断不会在 执行这些函数的过程当中发生。同时还假设软件没有Boot Loader。若Boot Loader 存在, 则EEPROM 写函数还需要等待正在运行的SPM 命令的结束。 C 代码例程 void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* 等待上一次写操作结束 */ while(EECR & (1<<EEWE)) ; /* 设置地址和数据寄存器*/ EEAR = uiAddress; EEDR = ucData; /* 置位EEMWE */ EECR |= (1<<EEMWE); /* 置位EEWE 以启动写操作*/ EECR |= (1<<EEWE); } 下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函 数的过程当中发生。 在掉电休眠模式下的EEPROM 写操作 若程序执行掉电指令时EEPROM 的写操作正在进行, EEPROM 的写操作将继续,并在 指定的写访问时间之前完成。但写操作结束后,振荡器还将继续运行,单片机并非处于完 全的掉电模式。因此在执行掉电指令之前应结束EEPROM 的写操作。 防止EEPROM 数据丢失若电源电压过低,CPU 和EEPROM 有可能工作不正常,造成EEPROM 数据的毁坏( 丢 失)。这种情况在使用独立的EEPROM 器件时也会遇到。因而需要使用相同的保护方案。 由于电压过低造成EEPROM 数据损坏有两种可能:一是电压低于EEPROM 写操作所需 要的最低电压;二是CPU 本身已经无法正常工作。 EEPROM 数据损坏的问题可以通过以下方法解决: 当电压过低时保持AVR RESET信号为低。这可以通过使能芯片的掉电检测电路BOD 来实现。如果BOD 电平无法满足要求则可以使用外部复位电路。若写操作过程当中 发生了复位,只要电压足够高,写操作仍将正常结束。 I/O 存储器ATmega16 的I/O 空间定义见 P318“ 寄存器概述” 。 ATmega16所有的I/O及外设都被放置于I/O空间。所有的I/O位置都可以通过IN 与OUT指 令来访问,在32 个通用工作寄存器和I/O 之间传输数据。 地址为0x00 - 0x1F 的I/O 寄存 器还可用SBI 和CBI 指令直接进行位寻址,而SBIS 和SBIC 则用来检查某一位的值。更 多内容请参见指令集。使用IN 和OUT 指令时地址必须在 0x00 - 0x3F 之间。如果要象 SRAM 一样通过LD 和ST 指令访问I/O 寄存器,相应的地址要加上0x20。 C 代码例程 unsigned char EEPROM_read(unsigned int uiAddress) { /* 等待上一次写操作结束 */ while(EECR & (1<<EEWE)) ; /* 设置地址寄存器*/ EEAR = uiAddress; /* 设置EERE 以启动读操作*/ EECR |= (1<<EERE); /* 自数据寄存器返回数据 */ return EEDR; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服