按顺序向 EEPROM 写入和读取数据
Writing and Reading data to EEPROM sequentially
我正在做我的大学项目,它需要将数据存储在 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的数据。请告诉我这段代码有什么问题。
无需自己定义函数读写内部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);
}
您无需等待读取完成再阅读 EEDR
。无法保证在您阅读时可以读取该值。您需要在设置 EERE
之后和读取 EEDR
.
之前添加大约 1ms 的延迟
有关详细信息,请参阅 EEPROM Read/Write Procedure 下的条目。
我正在做我的大学项目,它需要将数据存储在 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的数据。请告诉我这段代码有什么问题。
无需自己定义函数读写内部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);
}
您无需等待读取完成再阅读 EEDR
。无法保证在您阅读时可以读取该值。您需要在设置 EERE
之后和读取 EEDR
.
有关详细信息,请参阅 EEPROM Read/Write Procedure 下的条目。