hcs08系列单片机flash模拟eeprom函数问题
逸萌 2009-11-14 08:55:40 问题现象描述:
在网上下载了下面这段代码拷到freeScale MC9S08DZ60单片机中,可以实现存储功能。但2片单片机在车上连续跑了2个礼拜后,存储功能完全消失。存储功能一点都不能记忆。
怀疑点有:芯片资料要求flash的时钟要确保在150k~200kHz之间。因为之前调试时200kHz不能实现存储功能,所以设置为2M,这样设置当时记忆没有问题。但想来,可能是设置为2M这个地方,让flash 的eeprom区失效。请教原因
请高手指点,急!!!
例程
/**********************EEPROM.C***********************/
/********作者:sly *************版本:1.0.0********/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#pragma DATA_SEG MY_ZEROPAGE
unsigned char RAM_CODE[60],pdata;
unsigned int faddr;
unsigned char Page_Erase(void)
{
static unsigned char * paddr;
if (FSTAT&0x10){ //Check to see if FACCERR is set
FSTAT = FSTAT | 0x10; //write a 1 to FACCERR to clear
}
paddr=(unsigned char *)faddr;
*paddr=0xff;
FCMD="0x40";
FSTAT = FSTAT | 0x80; //Put FCBEF at 1.
_asm NOP; //Wait 4 cycles
_asm NOP;
_asm NOP;
_asm NOP;
if (FSTAT&0x30){ //check to see if FACCERR or FVIOL are set
return 0xFF; //if so, error.
}
while ((FSTAT&0x40)==0){ } //else wait for command to complete
return 0x00;
}
unsigned char Program_Byte(void)
{
static unsigned char * paddr;
if (FSTAT&0x10){ //Check to see if FACCERR is set
FSTAT = FSTAT | 0x10; //write a 1 to FACCERR to clear
}
paddr=(unsigned char *)faddr;
*paddr=pdata;
FCMD="0x20";
FSTAT = FSTAT | 0x80; //Put FCBEF at 1.
_asm NOP; //Wait 4 cycles
_asm NOP;
_asm NOP;
_asm NOP;
if (FSTAT&0x30){ //check to see if FACCERR or FVIOL are set
return 0xFF; //if so, error.
}
while ((FSTAT&0x40)==0){ } //else wait for command to comple
return 0x00;
}
void write_eeprom(unsigned char *data,unsigned char length,unsigned int first_addr)
{
static unsigned char i;
static void (*funcPtr)();
static unsigned char *src,*dest;
funcPtr =Program_Byte;
i=60;
src= (unsigned char *) funcPtr;
dest= (unsigned char *)&RAM_CODE[0];
do {
*dest++ = *src++;
}
while(--i);
faddr="first"_addr;
for(i=0; i< length; i++)
{
pdata=*data++;
asm (jsr RAM_CODE ) ;
faddr++;
}
}
void erase(void) {
static unsigned char i;
static void (*funcPtr)();
static unsigned char *src,*dest;
funcPtr =Page_Erase;
src= (unsigned char *) funcPtr;
dest= (unsigned char *)&RAM_CODE[0];
i="60";
do{
*dest++ = *src++;
}
while(--i);
faddr="0xf800";
asm (jsr RAM_CODE ) ; // do page erase
}
在对flash编程时注意要点:
1先擦除,再写入。
2擦除只有也擦除,所以修改一个存储单元的值时,要将所有的单元读入ram中,修改后,将所有单元重新写入。
3写flash的时钟要确保在150k~200kHz之间。