本人找到一个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 */ } |