C 按顺序向EEPROM写入和读取数据

C 按顺序向EEPROM写入和读取数据,c,embedded,avr,eeprom,atmega16,C,Embedded,Avr,Eeprom,Atmega16,我正在进行我的大学项目,该项目需要将数据存储在AtMega32的EEPROM中。 我能够在内存的任何特定位置写入和读取数据。但是,当我尝试按顺序将数据从地址0写入1023时,我得到了错误的值 以下是我编写的函数 用于读取和写入数据的函数定义 #include "eeprom.h" uint8_t EEPROMRead(uint16_t uiAddress) { /* Wait for completion of previous write */ while(EECR &

我正在进行我的大学项目,该项目需要将数据存储在AtMega32的EEPROM中。 我能够在内存的任何特定位置写入和读取数据。但是,当我尝试按顺序将数据从地址0写入1023时,我得到了错误的值

以下是我编写的函数

用于读取和写入数据的函数定义

#include "eeprom.h"

uint8_t EEPROMRead(uint16_t uiAddress)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address register */
    EEAR = uiAddress;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    /* Return data from data register */
    return EEDR;
}

void EEPROMWrite(uint16_t uiAddress, uint8_t ucData)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address and data registers */
    EEAR = uiAddress;
    EEDR = ucData;
    /* Write logical one to EEMWE */
    EECR |= (1<<EEMWE);
    /* Start eeprom write by setting EEWE */
    EECR |= (1<<EEWE);
}
#包括“eeprom.h”
uint8\u t EEPROMRead(uint16\u t uiAddress)
{
/*等待上一次写入完成*/

而(EECR&(1无需定义自己的函数来读取和写入内部EEPROM中的数据。AVR提供了用于此目的的库。以下是示例代码:-

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

int main(void)
{
    char read[5];

    eeprom_write_byte (0, '0');
    eeprom_write_byte (1, '1');
    eeprom_write_byte (2, '2');
    eeprom_write_byte (3, '3');
    eeprom_write_byte (4, '4');

    for (int count=0;count<5;count++)
    {
        read[count]=eeprom_read_byte((const uint8_t *)(count));
    }

    while (1); 

}
#定义F#U CPU 1600000UL
#包括
#包括
#包括
内部主(空)
{
字符读取[5];
eeprom写入字节(0,'0');
eeprom写入字节(1,'1');
eeprom写入字节(2,'2');
eeprom写入字节(3,'3');
eeprom写入字节(4,'4');

对于(int count=0;count在读取
EEDR
之前,您不必等待读取完成。无法保证读取时该值已准备就绪。在设置
EERE
之后和读取
EEDR
之前,您需要添加大约1ms的延迟


有关更多信息,请参见下面的条目。

EEAR
EECR
EEDR
等变量的定义是什么?您在哪里初始化
epadr
?您是否依赖静态存储持续时间变量的零初始化?这样做是不好的做法,尤其是在通常具有非标准的嵌入式系统中跳过零初始化的启动代码。@Dai'EEAR,EECR,EEDR'已注册定义到AVR的acsess EEPROM中。@Lundin我已将epadr初始化为“static int epadr=0”;顺便说一句,您知道
if(epadr
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

int main(void)
{
    char read[5];

    eeprom_write_byte (0, '0');
    eeprom_write_byte (1, '1');
    eeprom_write_byte (2, '2');
    eeprom_write_byte (3, '3');
    eeprom_write_byte (4, '4');

    for (int count=0;count<5;count++)
    {
        read[count]=eeprom_read_byte((const uint8_t *)(count));
    }

    while (1); 

}