3

我正在从事我的大学项目,该项目需要将数据存储在 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);
}

这是主要功能

static int epadr=0;
epread=EEPROMRead(epadr);      //reading from address stored in epadr
printf("%d",epread);           //printing values


if(epadr<=1023)
    {
        EEPROMWrite(epadr,high);    //writing at address stored in epadr
        epadr++;                   //increment address
    }
}

if(epadr>1023)
printf("Memory Full\n");

我想存储位置 0 到 1023 的数据。请告诉我这段代码有什么问题。

4

2 回答 2

2

无需定义自己的函数来读取和写入内部 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); 

}
于 2016-10-17T10:01:20.777 回答
0

在阅读之前,您无需等待阅读完成EEDR。无法保证在您读取该值时可以读取该值。您需要在设置之后EERE和读取之前添加大约 1 毫秒的延迟EEDR

有关详细信息,请参阅EEPROM 读/写过程下的条目。

于 2016-10-17T10:18:15.893 回答