6679|13

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

hcs08系列单片机flash模拟eeprom函数问题 [复制链接]

问题现象描述:
在网上下载了下面这段代码拷到freeScale MC9S08DZ60单片机中,可以实现存储功能。但2片单片机在车上连续跑了2个礼拜后,存储功能完全消失。存储功能一点都不能记忆。
怀疑点有:芯片资料要求flash的时钟要确保在150k~200kHz之间。因为之前调试时200kHz不能实现存储功能,所以设置为2M,这样设置当时记忆没有问题。但想来,可能是设置为2M这个地方,让flash 的eeprom区失效。请教原因
请高手指点,急!!!


例程
/**********************EEPROM.C***********************/
/********作者:sly *************版本:1.0.0********/


#include /* 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之间。



最新回复

牛  详情 回复 发表于 2009-11-18 20:07
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
芯片还是好的咩?
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 lgy198612 的回复:
芯片还是好的咩?

芯片还是好的,其它控制正常,就是保存不行了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
up
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
1. 这些地方都不对,为什么把一个字符串赋值给命令寄存器?
    FCMD="0x40";  -->FCMD = 0x040;
    FCMD="0x20";  -->FCMD = 0x020;

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

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

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 zyzhang365 的回复:
1. 这些地方都不对,为什么把一个字符串赋值给命令寄存器?
? ? FCMD="0x40";? -->FCMD = 0x040;
? ? FCMD="0x20";? -->FCMD = 0x020;

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

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

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


这几点在程序里面之前就改过了
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
那你现在的程序是什么样的
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 zyzhang365 的回复:
那你现在的程序是什么样的


现在的程序在公司,贴不出来,是参考上面代码改的,程序烧到设备后刚开始可以存储,其它功能也正常;中间存在偶然不能存储,但俩周后就不能存储了,但其它功能始终正常。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
up
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
没有代码很难做出判断的啊,建议你贴出关键代码。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 lgy198612 的回复:
没有代码很难做出判断的啊,建议你贴出关键代码。

up
 
 
 

回复

102

帖子

0

TA的资源

一粒金砂(初级)

13
 
保存不了,就是不能写入咯??
如果之前能写入,现在不能写入,那就是flash挂了吧,擦写是有限制的。比如eeprom一般擦写在100w次,牛x的fram可以在10亿次以上。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 mxm1986 的回复:
保存不了,就是不能写入咯??
如果之前能写入,现在不能写入,那就是flash挂了吧,擦写是有限制的。比如eeprom一般擦写在100w次,牛x的fram可以在10亿次以上。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表