C 按顺序向EEPROM写入和读取数据
我正在进行我的大学项目,该项目需要将数据存储在AtMega32的EEPROM中。 我能够在内存的任何特定位置写入和读取数据。但是,当我尝试按顺序将数据从地址0写入1023时,我得到了错误的值 以下是我编写的函数 用于读取和写入数据的函数定义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 &
#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);
}