3242|6

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机内Flash的读写问题 [复制链接]

我现在要实现对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);
}



最新回复

建议仔细查看一下该芯片的DATASHEET。 再建议你单步操作写FLASH,在执行完写操作后,查看0x1000地址处的数据是否是你写入的数据, 执行完写IAP后,一般会有返回代码,可以查看返回码是多少再对照DATASHEET查出不成功的原因。 个人觉得有几个IAP不成功的原因: 1、如果IAP的代码是放在RAM的某个地址处的话,请查看你的代码是否覆盖了此区域; 2、一般IAP要操作的源数据是需要放在内部RAM中的,所以你可以查看一下write_dat[3]; 是放在什么地址开始的地方,是否是内部通用RAM中。  详情 回复 发表于 2009-10-8 09:26
点赞 关注

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没做过,我都是用烧写器的
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关注
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
没用过这个单片机
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 q413460743 的回复:
/******************************************************************
* 名称: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);
}




没使用过这种芯片。

1. 保证在编程之前先擦除
2. 擦除和编程都需要时间的,
if( (FMCON&0x0F)!=0x00 )这样是判断操作结束吗?如果是那一定是有问题的,应该采用忙等的方式。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
单片机的P0口无上拉,此处是用作指示用的,既P0口是作I/O用的必须外接上拉电阻。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
建议仔细查看一下该芯片的DATASHEET。

再建议你单步操作写FLASH,在执行完写操作后,查看0x1000地址处的数据是否是你写入的数据,

执行完写IAP后,一般会有返回代码,可以查看返回码是多少再对照DATASHEET查出不成功的原因。

个人觉得有几个IAP不成功的原因:
1、如果IAP的代码是放在RAM的某个地址处的话,请查看你的代码是否覆盖了此区域;
2、一般IAP要操作的源数据是需要放在内部RAM中的,所以你可以查看一下write_dat[3]; 是放在什么地址开始的地方,是否是内部通用RAM中。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表