首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FLASH模拟EEPPROM

FLASH模拟EEPPROM

本人找到一个FLASH模拟EEPPROM的例子(芯片用的是mc68hc908qt4)出现的问题是,第一次写入的时候没问题,再写的时候写入的数和要写的数不一样,后来单步调试发现是擦除函数好像有问题,因为运行擦除函数后,数据没有被擦除掉,我用的是内部时钟3.2M,现把源程序抄下,希望哪位大虾指点一二(请注意红字):



#define FBUS 3200000 //总线速度
#define ERARNGE() {__asm jsr 0x2806;} //跳到0x2806执行
#define PGRRNGE() {__asm jsr 0x2809;} //跳到0x2809执行
#define CTRLBYT (*(volatile unsigned char*) (0x88)) //存放控制位的RAM地址
#define CPUSPD (*(volatile unsigned char*) (0x89)) //存总线速度的RAM地址
#define LADDRH (*(volatile unsigned char*) (0x8A)) //LADDRH,LADDRL存储FLASH编程末尾地址的RAM地址
#define LADDRL (*(volatile unsigned char*) (0x8B))
#define OSC_CONST FBUS/250000 //总线速度(单位:0.25MHz)
#define FLASH_TEST_ADDRESS 0xFD40 //存放数据的FLASH页的首地址
#define RECEIVE_LENGTH 2   //编程数据的长度
uchar My_Receive[RECEIVE_LENGTH]0x8C; //存储编程数据的RAM区
void ProgramRange(uint *_ini, uchar _num) //FLASH编程函数
{
uint _first;
_first = *_ini; //要编程的起始地址
CPUSPD = OSC_CONST; //总线速度
LADDRH = ((_first + _num -1) & 0xFF00) >> 8;
LADDRL = ((_first + _num -1) & 0x00FF); //要编程的末尾地址
__asm ldhx _first; //将要编程的地址装入H,X寄存器
PGRRNGE(); //调用编程函数
return;
}
void EraseRow(uint *_row) //FLASH擦除函数
{
uint _address;
_address = *_row; //要擦除的起始地址
CPUSPD = OSC_CONST; //总线速度
CTRLBYT &= 0xBF; //控制字,页擦除
__asm ldhx _address; //将要擦除的地址装入H,X寄存器
ERARNGE();   //调用擦除函数
return;
}
void _ProgramFlash(uchar x,uchar y)
{
uint address;
DisableInterrupts;//disable all interrupts
address = FLASH_TEST_ADDRESS;
EraseRow(&address); //擦除地址从FLASH_TEST_ADDRESS开始的一页(当调用此函数后,没有被擦除掉)
My_Receive[0] = x; //要写入FLASH中的数据
My_Receive[1] = y;
//从FLASH_TEST_ADDRESS开始写入RECEIVE_LENGTH个字节
ProgramRange (&address, RECEIVE_LENGTH);
EnableInterrupts; /* enable interrupts */  
}

相互交流。共同进步!
返回列表