Board logo

标题: mc9s12dg128 eeprom问题 [打印本页]

作者: accelerate    时间: 2006-2-27 13:49     标题: mc9s12dg128 eeprom问题

mc9s12dg128 eeprom默认地址是多少?如果没有进行地址重订位的话,如何对eeprom编程?


我按照<单片机嵌入式应用的在线开发方法>160叶进行调试,16m晶振,并没有看到eeprom被擦除阿。请赐教


作者: nishui_2000    时间: 2006-2-28 16:34

EEPROm的擦除还设计到几个寄存器的配置,那几个寄存器不是在EEPROM那章,而在内存地址分配那章
我有这样的例子
作者: accelerate    时间: 2006-2-28 21:44

麻烦你给我传一份好么,我的信箱wjjxy1998@163.com
作者: nishui_2000    时间: 2006-3-2 14:54

初始化:
void EepromInit(void){
INITEE=17;
asm nop;
MISC=1;
}
擦写:
unsigned char EepromErase(unsigned int *pAddress, unsigned char size)
{
if(ECLKDIV_EDIVLD == 1)
{if((ESTAT_ACCERR == 0) && (ESTAT_PVIOL == 0))
{ while(size)
{ if(ESTAT_CBEIF == 1)
{ *pAddress = 0xFFFF;
pAddress += 2;
ECMD =ERASECMD;
ESTAT_CBEIF = 1;
if((ESTAT_ACCERR == 1) || (ESTAT_PVIOL == 1))
return ERROR;
while (ESTAT_CCIF == 0);
size--; }
}
return NOERROR;
}
else return ERROR;

}
else return ERROR;

}
unsigned char EepromProgram(unsigned int *pAddress, unsigned int *pData, unsigned char size)
{ if(ECLKDIV_EDIVLD == 1)
{ if((ESTAT_ACCERR == 0) && (ESTAT_PVIOL == 0))
{ while(size)
{ if(ESTAT_CBEIF == 1)
{ *pAddress++ = *pData++;
ECMD = PROGCMD;
ESTAT_CBEIF = 1;
if((ESTAT_ACCERR == 1) || (ESTAT_PVIOL == 1))
return ERROR;
while (ESTAT_CCIF == 0);
size--; }
}
return NOERROR;
}
else return ERROR;
}
else return ERROR;

}
作者: accelerate    时间: 2006-3-3 14:33

万分感谢阿
作者: zhudongpo    时间: 2006-4-13 19:20

nishui_2000 你好,我按照你给出的代码,进行mc9s12dp256的操作,数据掉电就丢失了 ,
我看到cw建立的PRM中“RAM = READ_WRITE 0x1000 TO 0x3FFF;”,并没有EEPROM的定义呀。还有EEPROM的具体地址由INITEE寄存器控制。请参见《S12MMCV4.pdf》文件中关于INITEE的介绍。可是我没有看明白INITEE的E11--E15,These bits determine the upper five bits of the base address for the system¡¯s internal EEPROM array
的含义。麻烦你给解释一下,谢谢了
作者: ouyitx99    时间: 2006-4-14 21:09

nishui_2000兄 你好
我也遇到上面几位兄弟与到的问题!!
能给我们详细解释一下吗?我已经困惑一个多星期了!!如果那位兄弟已经解决了这个问题,希望能尽快帮忙!!
谢谢了!!
作者: ouyitx99    时间: 2006-4-15 16:50

高手周末都不上论坛的啊!!
很急哦!!
再次感谢!!

作者: ouyitx99    时间: 2006-4-15 16:50

高手周末都不上论坛的啊!!
很急哦!!
再次感谢!!

作者: nishui_2000    时间: 2006-4-16 09:34

这段时间忙着买车,所以没空上论坛,不好意思,让大家等久了啊
上面的例子肯定好用的,我是用在9S12D64上,但是我想DG128肯定页通用的,直接拷贝过去就可以用
只是有一点忘了粘贴
/*下面为读写EEPROM的配置和操作函数*/
#define MASS_ERASE 0x41
#define ERASECMD 0x40
#define PROGCMD 0x20
#define Address_Start 0x1000 //定义读取或写EEPROM的地址
#define SizeMsg 24 //has been changed
#define ERROR 0xFF
#define NOERROR 0x0

unsigned int write_data[10]; //把这些数据写到EEPROM里面
unsigned int read_data[10]; //从EEPROM中读取的数据放到这个数组里面

作者: nishui_2000    时间: 2006-4-16 11:09

其中,EEPROM的地址定义根据INITEE这个寄存器来定,这个寄存器设定的值不同,实际EEPROM的起始地址页不一样。这个例子我试验过的,很好用
作者: ouyitx99    时间: 2006-4-16 12:11

能告诉我这段程序对应的EEPROM地址吗?
作者: ouyitx99    时间: 2006-4-16 12:15

INITEE上说的高5位对应的0~31分别把EEPROM映射到存储器那些地方啊?
我换了这些值,但是就是找不到相应的EEPROM地址!!
作者: nishui_2000    时间: 2006-4-16 12:41

不好意思,我用的单片机是9S12D64的,但是我想DG128的应该页一样用,
对D64来说,INTEE=17时,EEPROM的首地址是0x1000,然后这个地址后面的1K都应该是EEPROM空间
改改INTEE值(具体多少我忘了,我试过),可以把EEPROM的地址改为0x2000,然后那个例子也好用的
对DG128来说,它的EEPROM可能大些,所以其地址范围和D64会有少许差别,但我想用法应该是一样的
作者: ouyitx99    时间: 2006-4-16 13:09

我用的是A64!!现在是想找出设置相应值的规律!!我看了和你的怠应该一样!!
由于刚接触FC的单片机,所以可能很多问题很幼稚,希望谅解!!
谢谢了!!
作者: newarriver    时间: 2006-5-22 16:28

手册里说EEPROM的擦写时钟频率必须在150k~200k的范围内,可是对于ECLKDIV寄存器的EDIV[5:0]老是写不成功,不知道是什么原因。请高手指教。还有一个问题是例程好像都没用到EDIV[5:0],可以不用吗?
作者: dreamcatcher    时间: 2006-6-1 21:24

我也曾遇到掉电丢失数据的问题,后来发现不是这样的。我用的串口调试,需要监控程序。
监控程序里面有一段子程序,当你把程序下载到单片机的时候,擦写FLASH同时也把EEPROM擦写了一遍!
后来把监控程序改了一下,掉电也不丢失了!
作者: asker_dfr    时间: 2007-1-19 12:24

这几天需要刷写EEPROM,懒得看技术文档,就在这里搜索相关的东东,发现对自己帮助很大,可能这也算是懒人的方法了,其中nishui_2000在这里给的例子很奏效,谢谢了
作者: 毛毛虫    时间: 2007-12-11 14:29

thanks,试试




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0