读取EEPROM AVR

时间:2014-06-09 19:06:18

标签: c avr avr-gcc

当我从eeprom接收数据时出现问题。

首先我做了以下代码:

#include <avr/io.h>
#include <avr/eeprom.h>

char     NAME[5]   EEMEM   = "a001";
char     UNIT[2]   EEMEM   = "C";
uint16_t CYCLICITY EEMEM   = 2000;

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}

从中我提取了一个.hex和.eep文件。然后我用avrdude写了这个文件。首先我写错了因为我只把.hex文件放在eerpom上:w并且我销毁了一些字节,这不是那么重要。之后,我使用正确的命令编写,我会看到部分数据,如下一个打印屏幕。

dumpeeprom

我正在保存一个数字,一个C和一个a001。正如你在第一行看到的那样是..C.a001。这是我写的9个字节。

现在在另一个程序中!我试着这样做:

char     EEMEM NAME[5]  ;  
char     EEMEM UNIT[2]  ;
uint16_t EEMEM CYCLICITY; 

void _vReadEEPROM(char *au8Name,char *au8Unit,uint16_t *u16Cyclicity)
{
  eeprom_read_block((void *)&au8Name,(const void *)NAME,5);
  eeprom_read_block((void *)&au8Unit,(const void *)UNIT,2);
  *u16Cyclicity = eeprom_read_word(&CYCLICITY);
}

参数是全局结构:

typedef struct 
{
    uint16_t u16Cyclicity;
    uint16_t u16Value;
    char     pu8Name[5];
    char     pu8Unit[2];
}EEH_layout;

在主要的时候我发送了“破碎的UART”(我有另一个话题)。在此代码之前,USART发送了良好的价值和垃圾。但是当我把它放在USART没有发送任何东西时,因为我相信这是因为eeprom读取0(null)。 CPU正在工作,因为我有一个1秒的计时器,它会中断以使LED闪烁。这是有效的,所以问题是我从EEPORM获得了0。

另外我不确定我如何写EEPROM因为EEPROM上有很多补习,但无论如何配置EEPROM并且只读。我不希望在我的代码中使用这个参数,我希望它们能从eeprom中获取,我会单独写出来!

编辑:uint16参数没问题,我设法通过UART读取它,它是2000;但是这些字符不好,它是空的。

编辑: 测试好了,问题是函数的参数没有使用正常。我使用pau8Name []而不是* pau8Name更改函数,因为指针已初始化错误!!

1 个答案:

答案 0 :(得分:0)

始终注意指针!

问题在于未初始化的指针。见帖子编辑!