本人找到一个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 */
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |