andyguo1979 发表于 2006-6-8 21:15:34

求助关于ATMegal16 的EEPROM的写入问题

我想用自己写的函数在ATMega16的EEPROM写入数据,发现怎么都写不进去,

开始读与写都不能成功,后来在读的时候我把地址加上0x4000后发现读取正常,

但是无论地址加不加0x4000,都不能写进去。 但是用AVR自带的 eeprom_write_byte( ,)函数一切都正常。



以下是我写EEPROM的code,在程序中没有写Flash的动作,我自能为严格按照spec写的了,研究了两天不得其门。而且我也用遍了网上大侠们提的方法,如中断法,但都不行。



void EEPROM_write(unsigned int uiAddress, unsigned char ucData)

{

        while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */

         cli(); // 关闭中断

        EEAR = uiAddress;        /* 设置地址和数据寄存器*/

        EEDR = ucData;

        EECR |= (1<<EEMWE);        /* 置位EEMWE */

        EECR |= (1<<EEWE);        /* 置位EEWE 以启动写操作*/

        while(EECR & (1<<EEWE));/等待

        sei();                   //开全局中断

}



请马老师或各位大侠指点一下,最好有现成的code可以给我直接参考,如果有AVR 库里面eeprom_write_byte( ,)的程序那更好了。

谢谢!



Andy Guo

My Email: Andy.Guo@benq.com

charleszcc 发表于 2006-6-16 16:16:25

Codevision 的example中有eeprom读写的例子:

// EEPROM access example



// CodeVisionAVR C Compiler

// (C) 2000-2002 HP InfoTech S.R.L.

// www.hpinfotech.ro



// Chip: AT90S2313

// Memory Model: TINY

// Data Stack Size: 64 bytes



flash char f[]="This is a test";

#pragma warn-

eeprom char e;

#pragma warn+

char r;



void main (void)

{

char flash *ptr_to_flash;

char eeprom *ptr_to_eeprom;

char *ptr_to_ram;



// copy the string f from FLASH to

// the string e in EEPROM

ptr_to_flash=f;

ptr_to_eeprom=e;

while (*ptr_to_flash)

      *ptr_to_eeprom++=*ptr_to_flash++;



// copy the string e from EEPROM to

// the string r in RAM

ptr_to_eeprom=e;

ptr_to_ram=r;

while (*ptr_to_eeprom)

      *ptr_to_ram++=*ptr_to_eeprom++;



// stop here

while (1);

}



希望对你有所帮助,:)

liuliu443 发表于 2011-3-20 20:28:58

我也出现了相同的问题哦, 我是用的atmega128A 16M,用datasheet提供的函数不可以写但可以读,用eeprom.h里面的函数既可以写又可以读,楼主知道什么问题不?
页: [1]
查看完整版本: 求助关于ATMegal16 的EEPROM的写入问题