首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在操作EEPROM的时候奇怪的现象,请高手解答

在操作EEPROM的时候奇怪的现象,请高手解答

我用的片子是MC9S12DG128B,内部有2K的EEPROM,我没有改动EEPROM所在的位置, 按照默认,由于和寄存器重叠所占空间重叠,因此可用的EEPROM的空间为0x0400——0x7ff
下面是我的源程序:

#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define any (*((volatile unsigned char*)(0x0400)))
unsigned int *eeaddr;

void EEPROM_ERASE_ALL(void) { //将整个EEPROM全部擦除
ECLKDIV=0x4f;
while(!(ECLKDIV&0x80))
{}
while(!(ESTAT&0x80))
{}
while(!(EPROT&0x80))
{}

any=0xff;
ECMD=0x41;
ESTAT|=0x80;
while(!(ESTAT&0x40))
{}
PORTB=0xaa;

}

void EEPROM_ERASE_WORD(void){ //擦除四字节
while(!(ECLKDIV&0x80))
{}
while(!(ESTAT&0x80))
{}
while(!(EPROT&0x80))
{}

any=0xfa;
ECMD=0x40;
ESTAT|=0x80;
while(!(ESTAT&0x40))
{}

PORTB=0xf0;
}

void EEPROM_WRITE(void) { //写入两字节
eeaddr=(volatile unsigned int*)(0x402);
while(!(ECLKDIV&0x80))
{}
while(!(ESTAT&0x80))
{}
while(!(EPROT&0x80))
{}

*eeaddr=0x5678;
ECMD=0x20;
ESTAT|=0x80;
while(!(ESTAT&0x40))
{}

PORTB=0xf0;




}

void main(void) {

DDRB=0xff;
PORTB=0x00;
EEPROM_ERASE_ALL();
EEPROM_ERASE_WORD();
EEPROM_WRITE();


/* put your own code here */
EnableInterrupts;
for(;;) {} /* wait forever */
}


主程序中包含三个子程序
EEPROM_ERASE_ALL():擦除整个EEPROM
EEPROM_ERASE_WORD():擦除指定地址的EEPROM
EEPROM_WRITE():在指定地址写入数据
说明书中不是说EEPROM全部擦除后,每个单元的值应该为0xFF么,用BDM调试的时候,我执行整体擦除EEPROM子程序后,在Memory窗口中只有0x0400变为0xFF(any的值),其他单元的值没有变化;接着执行第二个子程序,是擦除指定地址的EEPROM,在这个子程序中我给any赋值为0xfa,结果在擦除地址处的值竟然也是0xfa,难道不应该是0xff么?
我看说明书中写着在执行擦除指令时any可以使任何值的,换句话说在执行擦除指令时向指定地址写入的内容并没有要求,只需要了解擦除地址就可以了,可是为什么在Memory窗口中有这种奇怪的现象呢?
请高手指教

程序没有问题,在往EEPROM写数据的时候真正常,在执行这三个子程序的时候ESTAT寄存器也是正常的,其值为0xC1,没有出现错误

还有个问题,当使用BDM擦除芯片的时候,EEPROM中的数据是否也被擦掉了?
如果需要,把整个project贴出来看看吧。
海纳百川  有容乃大
要注意在上电后的缺省状态下,EEPROM实际上被RAM覆盖掉了。
海纳百川  有容乃大
谢谢板主
最近先不弄eeprom了
反正现在也能用
返回列表