|
我现在要实现对P89LPC901单片机的读写,采用的是IAP-Lite.程序出现了一些问题,麻烦大家看一下!
/******************************************************************
* 文件名:TEST.C
* 功能:测试IAP_Lite功能
******************************************************************/
#include "REG932.H"
#include "IAP_LITE.H"
sbit RED_LED= P0^5;
/******************************************************************
* 名称:主程序
* 功能:调用IAP_LITE.C中的子程序,进行测试。
******************************************************************/
void main(void)
{
uint8 idata write_dat[3];
uint8 idata read_dat[3];
uint8 i;
P0M1=0x20;
P0M2=0x20;
/* 写多字节 */
for(i=0;i<3;i++)
{
write_dat = 2*i;
}
if(FLASH_WriteNByte(0x1000,write_dat,3)==1)
{
RED_LED=0; //问题所在:如果写完成,则会执行这句,灯会点亮!但是一直不亮
}
for(i=0;i<3;i++)
{
read_dat = 0;
}
FLASH_ReadNByte(0x1000,read_dat,3);
while(1);
}
/******************************************************************
* 名称:Iap_lite.c (这里只列出FLASH_WriteNByte函数)
* 功能:指定FLASH起始地址,写多字节数据
* 入口参数:addr 指定的起始地址
* dat_buf 待写入的数据缓冲区指针
* no 要写入数据个数
* 出口参数:返回0时表示操作错误
******************************************************************/
bit FLASH_WriteNByte(uint16 addr, uint8 *dat_buf, uint8 no)
{ if(0==no) return(0);
FMCON = LOAD; // 设置加载数据命令
FMADRH = addr>>8; // 设置写入地址
FMADRL = addr&0xFF;
while(1)
{ FMDATA = *dat_buf; // 写入数据
dat_buf++; // 指向下一个待写入的数据
addr++;
no--;
if(0==no) break; // 判断是否写完所有数据,若是则退出
if( (addr&PAGE_SIZE)==0 ) // 判断是否要换页
{ FMCON = ERS_PROG; // 若是,则擦除编程
if( (FMCON&0x0F)!=0x00 ) return(0);
/* 切换到下一页 */
FMCON = LOAD;
FMADRH = addr>>8;
FMADRL = addr&0xFF;
}
}
FMCON = ERS_PROG; // 擦除编程
if( (FMCON&0x0F)!=0x00 ) return(0);
else return(1);
}
|
|