在线时间0 小时
UID161964
注册时间2008-7-11
NXP金币0
该用户从未签到
新手上路

- 积分
- 27
- 最后登录
- 1970-1-1
|
各位朋友:
小弟最近操作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
(511.71 KB, 下载次数: 8)
|
|