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

[求助]还是EEPROM 的问题!

[求助]还是EEPROM 的问题!

为什么在断电之后在读取EEPROM 空间内的数据时不是先前断电之前的数据了呢?

很简单的道理,没有写对,呵呵

个人BLOG:http://blog.eccn.com/u/107300/index.htm

我把工程传上来,帮忙看哈,谢谢!

PRM文件中的部分:

/* non-paged EEPROM */
EEPROM = READ_ONLY 0x0800 TO 0x0FFB;

/* RAM */
RAM = READ_WRITE 0x2000 TO 0x3FFF;
Start12.c中的;

#define _HCS12_SERIALMON

主函数:

#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define uchar unsigned char
#define uint unsigned int
#define Dump 0xFFFF

#define EEPROM_ADDR_BASE ((volatile uint *)0x0800)

#define ee_word_program 0x20 // 字编程
#define ee_word_erase 0x40 // 字擦除
#define ee_sector_erase 0x41 // 全部擦除
#define ee_sector_Modify 0x60 //modify with sector
void EEPROM_write_operate(int * Addr,int Data,char OpType);
int EEPROM_read_operate(int * Addr) ;
void EEPROM_init(void);



/*************************************************

EEPROM模块初始化程序

*************************************************/
void EEPROM_init(void)
{
ECLKDIV=0x4A; // 不采用8分频,因为OSCLK=4M,又为了使ECLK
// 达到190KHZ,所以EDIV=21,即ECLK=16M/8*11=190.5KHZ
ECNFG=0x00; // 禁止EEPROM相关操作的中断
while(ECLKDIV_EDIVLD == 0); // 等待时钟设置成功
EPROT_EPOPEN=1; // EEPROM没有保护,可以进行编程与擦除
EPROT_EPDIS=1; // EEPROM保护禁止
}


/*************************************************
写EEPROM程序

Addr: 要操作的EEPROM偏移地址
Data: 要操作的EEPROM数据
OpType:操作命令类型
*************************************************/
void EEPROM_write_operate(int * Addr,int Data,char OpType)
{
DisableInterrupts;
while(ESTAT_CBEIF == 0); // 等待EEPROM命令缓冲区为空
*Addr=Data; // 设置EEPROM的偏移地址
ECMD=OpType; // 指令的类型
ESTAT |= 0x80; // 清命令缓冲标志,开始执行命令
while(ESTAT_CCIF == 0); // 等待命令完成
EnableInterrupts;
}


/*************************************************
读EEPROM程序

Addr: 要操作的EEPROM偏移地址
返回值:读到的结果数据
*************************************************/
int EEPROM_read_operate(int * Addr)
{
int TempData;
DisableInterrupts;
TempData=*Addr; // 读EEPROM的偏移地址的数据
return(TempData);
DisableInterrupts;
}


uint intTempData;
uint i;
void delay1(int cnt){
int i,j;
for(i=0;i<cnt;i++){
j=0x1300;
while(j--);
}
}
/*************************************************

测试部分操作

*************************************************/
void test(void)
{

volatile uint * RamBase;

for(i=0;i<1024;)
{

EEPROM_write_operate(EEPROM_ADDR_BASE+i,Dump,ee_word_erase);
EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xABCD,ee_word_program); //在EEPROM_ADDR_BASE地址写入数据
i=i+1;
EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xef00,ee_word_program);
i=i+1;
//EEPROM_write_operate(EEPROM_ADDR_BASE+i,Dump,ee_word_erase);
//EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xef00,ee_word_program); //在EEPROM_ADDR_BASE地址写入数据
//i=i+1;
intTempData=EEPROM_read_operate(EEPROM_ADDR_BASE+i-1); //读0xFC0800地址的EEPROM区数据
intTempData=~intTempData;
PORTB=intTempData;
delay1(20);
PORTB=intTempData>>4;
delay1(20);
}

//flash_erase_word(0xFA,0x8000);
//flash_write_word(0xFA,0x8000,0x1234);

}
void main(void) {
/* put your own code here */
DDRB=0xff;
EEPROM_init();
test();
EnableInterrupts;

for(;;) {

} /* wait forever */
/* please make sure that you never leave this function */
}
版主帮帮忙哈,谢谢版主!

怎么上传不了呢???

[此贴子已经被作者于2008-11-22 12:52:49编辑过]

谢谢! 3QKZT5aA.rar (209.15 KB)
感觉像是一致在操作RAM一样!斑竹帮忙看看

[此贴子已经被作者于2008-11-22 15:02:14编辑过]

要改变存储器的映射地址,除了要修改PRM文件外,还要对相应的控制寄存器进行操作,如INITRM,INITEE寄存器等。
海纳百川  有容乃大

那个已经在Start12.c中改过了(#define _HCS12_SERIALMON),那些存储寄存器已经是和在PRM地址分配对应的了!

我后来把EEPROM的中断也开了,发现有中断产生,在EEPROM的映射地址空间也写入了!但是一旦断电之后再上电,里面的程序还是没有变,这样岂不是又要重新对EEPROM进行操作?

还有就是重新写入新的程序只是去读取上一个程序中写EEPROM中的内容时,EEPROM的映射地址空间的内容全部为0XFF,是不是因为BDM的原因?它会在烧写程序的时候对所有的存储区间进行清零?如果是这样的话,那我们怎么验证EEPROM断电数据不丢失的作用呢?

[此贴子已经被作者于2008-11-24 14:50:29编辑过]

谢谢版主,帮帮忙哈!

能不能提供一个关于EEPROM的程序给我??!

[此贴子已经被作者于2008-11-24 14:49:43编辑过]

如果是通过BDM和调试软件重新启动并连接目标板的话,那可能会将所有内存,包括EEPROM全部擦除。你可以在调试软件的界面中设置不擦除EEPROM。你可以参考这个帖子:

http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=120632&ID=120632

海纳百川  有容乃大

感谢版主!

问题解决了,感谢斑竹!!!!

返回列表