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之间。



...全文
259 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxm1986 2009-11-18
  • 打赏
  • 举报
回复
保存不了,就是不能写入咯??
如果之前能写入,现在不能写入,那就是flash挂了吧,擦写是有限制的。比如eeprom一般擦写在100w次,牛x的fram可以在10亿次以上。
逸萌 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mxm1986 的回复:]
保存不了,就是不能写入咯??
如果之前能写入,现在不能写入,那就是flash挂了吧,擦写是有限制的。比如eeprom一般擦写在100w次,牛x的fram可以在10亿次以上。
[/Quote]
逸萌 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lgy198612 的回复:]
没有代码很难做出判断的啊,建议你贴出关键代码。
[/Quote]
up
lgy198612 2009-11-17
  • 打赏
  • 举报
回复
没有代码很难做出判断的啊,建议你贴出关键代码。
逸萌 2009-11-16
  • 打赏
  • 举报
回复
up
zyzhang365 2009-11-15
  • 打赏
  • 举报
回复
1. 这些地方都不对,为什么把一个字符串赋值给命令寄存器?
FCMD="0x40"; -->FCMD = 0x040;
FCMD="0x20"; -->FCMD = 0x020;

faddr="first"_addr; //为什么要加引号?

2. 1也回答你前面的问题,芯片资料要求flash的时钟要确保在150k~200kHz之间,乖乖按芯片资料配置吧。

3. 可能还有别的问题....
逸萌 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zyzhang365 的回复:]
那你现在的程序是什么样的

[/Quote]
现在的程序在公司,贴不出来,是参考上面代码改的,程序烧到设备后刚开始可以存储,其它功能也正常;中间存在偶然不能存储,但俩周后就不能存储了,但其它功能始终正常。
贝隆 2009-11-15
  • 打赏
  • 举报
回复
逸萌 2009-11-15
  • 打赏
  • 举报
回复
up
zyzhang365 2009-11-15
  • 打赏
  • 举报
回复
那你现在的程序是什么样的
逸萌 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyzhang365 的回复:]
1. 这些地方都不对,为什么把一个字符串赋值给命令寄存器?
    FCMD="0x40";  -->FCMD = 0x040;
    FCMD="0x20";  -->FCMD = 0x020;

  faddr="first"_addr; //为什么要加引号?

2. 1也回答你前面的问题,芯片资料要求flash的时钟要确保在150k~200kHz之间,乖乖按芯片资料配置吧。

3. 可能还有别的问题....

[/Quote]
这几点在程序里面之前就改过了
逸萌 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lgy198612 的回复:]
芯片还是好的咩?
[/Quote]
芯片还是好的,其它控制正常,就是保存不行了
lgy198612 2009-11-14
  • 打赏
  • 举报
回复
芯片还是好的咩?

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧