楼主: icecoffelin

[其他] DZ60的EEPROM问题

[复制链接]

该用户从未签到

6

主题

24

帖子

0

注册会员

Rank: 2

积分
63
最后登录
1970-1-1
 楼主| 发表于 2010-9-26 09:24:47 | 显示全部楼层

RE:DZ60的EEPROM问题

因为之前项目已经完成,E2p部分暂时手头无芯片再去验证。
https://www.nxpic.org.cn/bbs/article_412_109030.html
里有讲到把上面代码的word型参数改到UNIT8即可正常,这个改动好像从技术上来讲没啥道理,FSL的datasheet里也未提到相关说明,楼上可以试试。

该用户从未签到

13

主题

52

帖子

0

新手上路

Rank: 1

积分
121
最后登录
1970-1-1
发表于 2010-9-28 13:49:48 | 显示全部楼层

回复:DZ60的EEPROM问题

回复第 7 楼 icecoffelin于2010-07-22 09:44:59发表:
用PE仿真上面的代码发现:
FSTAT = 0x30;--》正常执行
(*address) = d;--》正常执行
FCMD = 0x40;--》正常执行
FSTAT_FCBEF = 1;//没执行,异常,直接跳到nop
asm {
nop----》正常执行
nop
nop
nop
};
即FCBEF不能被置位,所以EEPROM的处理总是不能成功。
可是程序因为什么原因不执行该条指令,现在还不清楚原因。 

我调试过程中叶出现这个问题,FSTAT_FCBEF = 1;这句不执行,直接跳过。
但是程序在调试状态下发现第一次能写入EEPROM,第二次不能擦除和写入,第三次好像只能擦除(这过程是在同一次调试过程)
但上电后并没读到第一次写入的数据,所以可能第一次实际上也没写入。
请大家指点!

该用户从未签到

6

主题

48

帖子

0

新手上路

Rank: 1

积分
51
最后登录
1970-1-1
发表于 2010-11-11 12:59:45 | 显示全部楼层

RE:DZ60的EEPROM问题

http://forums.freescale.com/t5/8-Bit-Microcontrollers/programming-EEPROM/m-p/28905
没有用过这个芯片 试试网址的7搂程序 祝你好运

该用户从未签到

6

主题

48

帖子

0

新手上路

Rank: 1

积分
51
最后登录
1970-1-1
发表于 2010-11-11 13:10:31 | 显示全部楼层

RE:DZ60的EEPROM问题

怕网址失效,转帖出来,手里没有板子,无法验证,如有谁验证后请回复结果!
#include  /* for EnableInterrupts macro */
#include
#include "derivative.h" /* include peripheral declarations */
#include "M68DEMO908DZ60.h"
#define PASS  0
#define FAIL  1
#define ERASE   0x40
#define PROG    0x20
#define CBEF    0x80
#define EEPROM_START  0x1400
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];
int dummy=0;
/* address and program commands */
int eraseSector(byte* address);
int writeByte(byte* address, byte data);
int readByte(byte* address);
int readWord(byte* address);
void progByte(byte* address,byte data);
void progWord(byte* address,word data);
   
int eraseSector(byte* address){
  DisableInterrupts;
  FSTAT = 0x30; /*clear errors*/
  if(FSTAT_FCBEF==1){
    *address = dummy;
    FCMD = ERASE;
    FSTAT = CBEF;
    if( (FSTAT_FACCERR!=0) || (FSTAT_FPVIOL!=0)){
      EnableInterrupts;
      return(FAIL);
    }
    while(FSTAT_FCCF!=1){
    }
    EnableInterrupts;
    return(PASS);
  } else{
    EnableInterrupts;
    return(FAIL);
  }
}
int writeByte(byte* address, byte data){
  DisableInterrupts;
  FSTAT = 0x30;
  if(FSTAT_FCBEF==1){
    *address = data;
    FCMD = PROG;
    FSTAT = CBEF;
    if( (FSTAT_FACCERR!=0) || (FSTAT_FPVIOL!=0)){
      EnableInterrupts;
      return(FAIL);
    }
    while(FSTAT_FCCF!=1){
    }
    EnableInterrupts;
    return(PASS);
  } else{
    EnableInterrupts;
    return(FAIL);
  }
}
int readByte(byte* address){
  int data = *address;
  return data;
}
int readWord(word* address){
  int datar = *address;
  return datar;
}
void progByte(byte* address,byte data){
  eraseSector((byte*)address);
  writeByte((byte*)address,data);
}
void progWord(byte* address,word data){
  eraseSector((byte*)address);
  writeByte((byte*)address++,(byte) (data >> 8));
  writeByte((byte*)address, (byte) (data & 0xFF));
}
///////////////////////////////////////////////////////
functions called like:
progWord((byte*)0x1400,444);
  data = readWord((byte*)0x1400);

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
2
最后登录
1970-1-1
发表于 2010-11-12 17:37:38 | 显示全部楼层

回复:DZ60的EEPROM问题

回复第 11 楼 icecoffelin于2010-09-26 01:24:47发表:
因为之前项目已经完成,E2p部分暂时手头无芯片再去验证。
https://www.nxpic.org.cn/bbs/article_412_109030.html
里有讲到把上面代码的word型参数改到UNIT8即可正常,这个改动好像从技术上来讲没啥道理,FSL的datasheet里也未提到相关说明,楼上可以试试。 


此言差矣,从技术上有很大道理;void WriteByteEeprom(word * address,word d)
word * address指针指向的内容为2个字节,(*address) = d;对于8位机,一个地址放8位的数据,
这一句你访问了两个地址,当你执行这一句是你会发现FACCERR位置1,即发生了访问错误,
根据datasheet上写的: 在发出前一个命令之前第2次写入Flash 地址。(每个命令只能向Flash中写入一次。)
这就是为什么要改为U8类型的原因!!!!!!
有兴趣的可以试验一下:如果,地址0x1400,0x1401上的内容分别为0x11,0x22;
执行以下语句:
U16 data1,data2
U8  data3;
data1 = *((U16 *)(0x1400));
data2 = *((U8 *)(0x1400));
data3 = *((U8 *)(0x1400));
你会发现data=0x1122,
data2=0x11;
data3=0x22;
为什么是这样的结果呢?这些是C语言语法细节问题,留给楼下回答,呵呵
 
 

该用户从未签到

0

主题

3

帖子

0

新手上路

Rank: 1

积分
4
最后登录
1970-1-1
发表于 2011-3-4 10:37:31 | 显示全部楼层

回复:DZ60的EEPROM问题

回复第 15 楼 sheng6695于2010-11-12 09:37:38发表:
回复第 11 楼 icecoffelin于2010-09-26 01:24:47发表:
因为之前项目已经完成,E2p部分暂时手头无芯片再去验证。
https://www.nxpic.org.cn/bbs/article_412_109030.html
里有讲到把上面代码的word型参数改到UNIT8即可正常,这个改动好像从技术上来讲没啥道理,FSL的datasheet里也未提到相关说明,楼上可以试试。 


此言差矣,从技术上有很大道理;void WriteByteEeprom(word * address,word d)
word * address指针指向的内容为2个字节,(*address) = d;对于8位机,一个地址放8位的数据,
这一句你访问了两个地址,当你执行这一句是你会发现FACCERR位置1,即发生了访问错误,
根据datasheet上写的: 在发出前一个命令之前第2次写入Flash 地址。(每个命令只能向Flash中写入一次。)
这就是为什么要改为U8类型的原因!!!!!!
有兴趣的可以试验一下:如果,地址0x1400,0x1401上的内容分别为0x11,0x22;
执行以下语句:
U16 data1,data2
U8  data3;
data1 = *((U16 *)(0x1400));
data2 = *((U8 *)(0x1400));
data3 = *((U8 *)(0x1400));
你会发现data=0x1122,
data2=0x11;
data3=0x22;
为什么是这样的结果呢?这些是C语言语法细节问题,留给楼下回答,呵呵
 
 
 虽然是去年11月份的帖子,
对于楼上这位老兄的回答,
我觉得很钦佩,回答的很好
!谢谢楼上的回答,
中国就需要这样的,这样子也才叫做技术该有的精神!

该用户从未签到

0

主题

17

帖子

0

新手上路

Rank: 1

积分
36
最后登录
1970-1-1
发表于 2011-10-18 16:00:50 | 显示全部楼层

回复:DZ60的EEPROM问题

kankan

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
37
最后登录
1970-1-1
发表于 2012-3-4 23:34:56 | 显示全部楼层

回复:DZ60的EEPROM问题

可以参考飞思卡尔的文档:
“在 HCS08 微控制器上使用FALSH模拟EEPROM”
上面有详细说明和API程序,可是我不知道怎么上传附件。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

15

帖子

0

新手上路

Rank: 1

积分
18
最后登录
1970-1-1
发表于 2012-5-17 15:13:28 | 显示全部楼层

回复:DZ60的EEPROM问题

回复第 14 楼 于2010-11-11 13:10:31发表:
怕网址失效,转帖出来,手里没有板子,无法验证,如有谁验证后请回复结果!
#include  /* for EnableInterrupts macro */
#include
#include "derivative.h" /* include peripheral declarations */
#include "M68DEMO908DZ60.h"
#define PASS  0
#define FAIL  1
#define ERASE   0x40
#define PROG    0x20
#define CBEF    0x80
#define EEPROM_START  0x1400
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];
int dummy=0;
/* address and program commands */
int eraseSector(byte* address);
int writeByte(byte* address, byte data);
int readByte(byte* address);
int readWord(byte* address);
void progByte(byte* address,byte data);
void progWord(byte* address,word data);

int eraseSector(byte* address){
DisableInterrupts;
FSTAT = 0x30; /*clear errors*/
if(FSTAT_FCBEF==1){
*address = dummy;
FCMD = ERASE;
FSTAT = CBEF;
if( (FSTAT_FACCERR!=0) || (FSTAT_FPVIOL!=0)){
EnableInterrupts;
return(FAIL);
}
while(FSTAT_FCCF!=1){
}
EnableInterrupts;
return(PASS);
} else{
EnableInterrupts;
return(FAIL);
}
}
int writeByte(byte* address, byte data){
DisableInterrupts;
FSTAT = 0x30;
if(FSTAT_FCBEF==1){
*address = data;
FCMD = PROG;
FSTAT = CBEF;
if( (FSTAT_FACCERR!=0) || (FSTAT_FPVIOL!=0)){
EnableInterrupts;
return(FAIL);
}
while(FSTAT_FCCF!=1){
}
EnableInterrupts;
return(PASS);
} else{
EnableInterrupts;
return(FAIL);
}
}
int readByte(byte* address){
int data = *address;
return data;
}
int readWord(word* address){
int datar = *address;
return datar;
}
void progByte(byte* address,byte data){
eraseSector((byte*)address);
writeByte((byte*)address,data);
}
void progWord(byte* address,word data){
eraseSector((byte*)address);
writeByte((byte*)address++,(byte) (data >> 8));
writeByte((byte*)address, (byte) (data & 0xFF));
}
///////////////////////////////////////////////////////
functions called like:
progWord((byte*)0x1400,444);
data = readWord((byte*)0x1400);
 

程序非常好用啊 谢了,不过用之前最好设定一下时钟分频 要不就不灵了
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

22

帖子

0

注册会员

Rank: 2

积分
64
最后登录
1970-1-1
发表于 2012-7-3 10:34:39 | 显示全部楼层

回复:DZ60的EEPROM问题

我目前用的是S08DZ32,昨天一直在调试EEPROM,总是无法写入,读出来总是0XFF,
程序是按照DATASHEET流程写的,编程时钟设置为200KHz,EEPROM首地址是0x1600,擦除和写入过程中FSTAT_FACCERR一直为0,编程期间没提示任何访问错误。就是读回来是0xFF.
代码段保护和安全性功能已经全部关闭,EEPROM还是没法写入。我没办法了。
DATASHEET上说EEPROM中一半在前台,一半在后台,还有4字节模式,8字节模式,FREESCALE为什么要这样设计,无法理解。
有成功写入的前辈们,指导下。
1,我实在是找不出问题,EEPROM编程过程没出现FSTAT_FACCERR和FSTAT_FPVIOL错误,所以我不知道出错在哪部分?
2,EEPROM分区擦除完成后是显示0xFF还是0x00?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-21 01:30 , Processed in 0.117369 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表