- UID
- 160121
- 性别
- 男
|
我用的片子是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中的数据是否也被擦掉了?
|
|