各位朋友:
小弟最近操作MC9S12D64非专家模式的内部1K EEPROM,发现总是操作不成功,
现在主要问题是:经查询,首先应该设定INITEE寄存器,将EEPROM地址重新映射,否则就被RAM和内部寄存器挡住了。我贴上我的主要代码,麻烦有经验的给看看:
注意是:非专家模式
1、初始化时钟(使用的是外部24M晶振)后,设定INITEE = 41;
2、初始化EEPROM分频等
/*************************************************
功能 : EEPROM初始化
参数 : OSCCLK 晶振频率,这里用KHz表示
Returns
:无
**************************************************/
void EEPROMInit(void)
{
ECLKDIV|=0X51;//晶振频率进入分频器前8分频,分频系数16
ESTAT_PVIOL=1;
/*清零写保护侵害故障*/
ESTAT_ACCERR=1;
/*清零访问错误故障*/
ECNFG_CCIE=0;
/*命令完成中断禁止*/
ECNFG_CBEIE=0;
/*命令缓冲器空中断禁止*/
EPROT_EPOPEN=1;
/*EEPROM不被写保护*/
EPROT_EPDIS=1;
/*无保护区域*/
}
3、将需要写的地址擦除
/*************************************************
功能 : EEPROM扇区擦除
参数 : addr
data_length
返回值 : 1 OK
0
FAIL
**************************************************/
uchar EEPROMSectorErase(volatile uint
*addr)
{
uchar
count;
if((ESTAT_PVIOL==1) ||
(ESTAT_ACCERR==1)) //发现错误
{
ESTAT_PVIOL=1;
ESTAT_ACCERR=1;
//清除中断标志
return(0);
}
while(!ESTAT_CBEIF){}
//判断命令缓冲区是否为空
*addr=0xFF;
ECMD=0x40;
ESTAT_CBEIF=1;
//清除中断标志
if((ESTAT_PVIOL==1) || (ESTAT_ACCERR==1)) //发现错误
{
ESTAT_PVIOL=1;
ESTAT_ACCERR=1;
//清除错误标志
return(0);
}
while(ESTAT_CCIF!=1) //等待所有的指令操作完成
{
}
return(1);
}
4、编程/*************************************************
功能 : EEPROM字编程
参数 : addr
data
data_length
返回值 : 1 OK
0
FAIL
**************************************************/
uchar EEPROMWordProgram(uint addr,volatile uint data)
{
uint *paddr;
uchar count;
if((ESTAT_PVIOL==1) ||
(ESTAT_ACCERR==1))
{
ESTAT_PVIOL=1;
ESTAT_ACCERR=1;
//清除中断标志
//return(0);
}
paddr= (uint
*)addr;
while(!ESTAT_CBEIF){}
//判断命令缓冲区是否为空
*paddr=data;
//写数据到地址
ECMD=0x20;
ESTAT_CBEIF=1;
//清除中断标志
if(ESTAT_PVIOL==1 || ESTAT_ACCERR==1)
//发现错误
{
ESTAT_PVIOL=1;
ESTAT_ACCERR=1;
//清除中断标志
return(0);
}
while(ESTAT_CCIF!=1) //等待所有的指令操作完成
{
}
return(1);
}
5、读取验证
/*************************************************
功能 : EEPROM读一个字
参数 : addr
*data
返回值 : 1 OK
0
FAIL
**************************************************/
uchar EEPROMWordRead(volatile uint addr,uint data)
{
data=*(uint
*)addr;
return(1);
}
飞思卡尔内部EEPROM研究.rar
希望有经验的给看一看