我写信给ATmega328P EEPROM如下:
eeprom_write_byte(address, (U8_T) 0);
void eeprom_write_byte(void* address, U8_T data)
{
cli();
/* Wait for previous write to complete */
while (TRUE == EECR.bits.EEPE) {
}
/* Set erase-and-write mode */
EECR.bits.EEPM0 = FALSE;
EECR.bits.EEPM1 = FALSE;
/* Set up write */
EEAR.byte = (U8_T) address;
EEDR.byte = data;
/* Enable master write */
EECR.bits.EEMPE = TRUE;
/* Enable write */
EECR.bits.EEPE = TRUE;
sei();
}
其中,EECR
、EEAR
和EEDR
的链接方式如下:
SECTIONS {
EEAR = 0x41;
EEDR = 0x40;
EECR = 0x3F;
...
EEMPE
和EEPE
肯定必须设置在彼此的4个时钟周期内,对吗?
然后,我从EEPROM中读取如下内容:
U8_T eeprom_read_byte(void* address)
{
cli();
/* Wait for previous write to complete */
while (TRUE == EECR.bits.EEPE) {
}
/* Set up read */
EEAR.byte = (U8_T) address;
/* Enable read */
EECR.bits.EERE = TRUE;
sei();
return EEDR.byte;
}
但我只能拿回0xFF
块钱!erased的价值!数据手册指出,设置为0的EEPM0和EEPM1应擦除并写入.但似乎没有发生任何写作.有什么主意吗?
我try 使用-O2进行编译,但没有结果.另一个帖子告诉我使用-03,但-03 destruct 了我的程序(链接器失败).无论如何,我在航空航天工作,优化是被禁止的,所以它必须在没有它们的情况下工作.
寄存器的定义如下:
/** EEPROM Control Register */
typedef union {
struct {
/** EEPROM Read Enable */
VBOOL_T EERE : 1;
/** EEPROM Write Enable */
VBOOL_T EEPE : 1;
/** EEPROM Master Write Enable */
VBOOL_T EEMPE : 1;
/** EEPROM Ready Interrupt Enable */
VBOOL_T EERIE : 1;
/** EEPROM Mode Bits */
VBOOL_T EEPM0 : 1;
VBOOL_T EEPM1 : 1;
VBOOL_T Reserved6 : 1;
VBOOL_T Reserved7 : 1;
} bits;
VU8_T byte;
} EECR_T;
/** EEPROM Control Register */
extern volatile EECR_T EECR;