c - 数据未存储在 EEPROM 中

标签 c embedded atmega eeprom

我使用以下代码来访问 eeprom :

void EEPROM_write(unsigned int uiAddress,unsigned char ucData)
{
   while(EECR & (1<<EEWE))
   {
      //do nothing
   }

   while(SPMCR & (1<<SPMEN));
   EEAR = uiAddress;
   EEDR = ucData;
   EECR |= (1<<EEMWE);
   EECR |= (1<<EEWE);
}

char EEPROM_read(unsigned int uiAddress)
{
   while(EECR & (1<<EEWE))
   {
      //do nothing
   }

   EEAR = uiAddress;
   EECR |=(1<<EERE);
   return EEDR;
}

void EEPROM_write_str(unsigned int uiAddress,unsigned char* string,unsigned int size)
{
   int i;
   for(i=0;i<size;i++)
   {
      EEPROM_write(uiAddress+i,string[i]);
   }
}

void EEPROM_read_str(unsigned int uiAddress,unsigned char* string,unsigned int size)
{
   int i;
   for(i=0;i<size;i++)
   {
      string[i] = EEPROM_read(uiAddress+i);
   }
}

char str[]="hello ";
char str2[20];

int main()
{
   usart_init(12);
   //EEPROM_write_str(0,str,6);
   EEPROM_read_str(0,str2,6);
   usart_puts(str2,6);
}

在上面的代码中,我首先注释了 EEPROM_read_str 和 usart_puts,...刷新了它,然后注释了 EEPROM_write_str 函数并删除了其他两个函数的注释并再次刷新了。尽管如此,数据并没有被存储,并且显示了输出终端中的值为 yyyyy(十六进制-FF)。 这里有什么问题? (这里USART_puts传输字符串,第二个参数为字符数)

最佳答案

我的旧 avr 项目中的工作代码。我已经很多年没有使用它们了,所以按原样提供,因为我现在不记得这些位的确切含义

void EEPROM_write(uint8_t addr, uint8_t value) {
    while(EECR & (1 << EEPE)) ;             //wait for write enable bit to clear
    EECR &= ~((1 << EEPM1) | (1 << EEPM0)); // (erase & write in one operation)
    EEARL = addr;                           // set the address
    EEDR = value;                           // set value to be written
    EECR |= (1 << EEMPE);                       // set EEPROM Master Write Enable
    EECR |= (1 << EEPE);                        // set EEPROM Master Write Enable
}

uint8_t EEPROM_read(uint8_t addr) {
    while(EECR & (1 << EEPE)) ;             
    EEARL = addr;                           // set the address
    EECR |= (1 << EERE);
    return EEDR;
}

关于c - 数据未存储在 EEPROM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45563780/

相关文章:

c - 从 .txt 文件中读取名称并将其添加到链接列表中

c - 协议(protocol)不支持的地址族

c - 如何检查c代码中的内存泄漏?

embedded - 通过 SPI 的芯片到芯片通信协议(protocol)

c - 如何摆脱单词之间的换行符?

C - 检查字符串是否为空

TimerOne 和串行库

c - 错误 : attempt to use poisoned "SIG_OUTPUT_COMPARE0A"

c - 嵌入式linux调用使用系统

c - 为什么使用2个指针指向atmega微 Controller 中的寄存器地址?