12491|8

302

帖子

0

TA的资源

一粒金砂(高级)

关于往EEPROM中写入数据的问题 [复制链接]

本帖最后由 ena 于 2017-7-10 11:20 编辑

现在手上用的是IAP15F2K61S2,因为需要保存一些重要数据,所以用到保存在EEPROM。在执行扇区擦除、写字节和读字节操作后,单片机就停止工作了,扇区擦除、写、读都可以。不进行扇区擦除操作就没问题,不过这样就没法保存数据。//===================
void  Read_ID(void)
{
   u8 idata *RamID;
   u8 RomID[6];
   u8 i;
   u8 Addr;
   u8 temp;
   //EA=0;
   RamID = ID_ADDR_RAM;         //从RAM区读取ID号
   Addr = IAP_ADDRESS;
   for(i=0; i<7; i++)         //读7个字节
   {
        RomID = *RamID;
                SendByte(*RamID++);      //发送ID到串口
                Delay5ms();        
                ClrWdt();
   }
   /*
   for(i=0;i<7;i++)
   {
     ClrWdt();*/
   IapEraseSector(0xF200);
   //IAP_ADDRESS++;   
   //}

   for(i=0;i<7;i++)
   {
     IapProgramByte(Addr,RomID);
         Addr++;
        }

   Addr = IAP_ADDRESS;
   SendByte(0xdd);
   Delay5ms();

   for(i=0;i<7;i++)
   {
     temp = IapReadByte(Addr++);
         SendByte(temp);      //发送ID到串口
         Delay5ms();
         ClrWdt();
   }
        //EA=1;
   /*
   RomID = IAP_ADDRESS;         //从程序区读取ID号
   for (i=0; i<7; i++)          //读7个字节
   {
        SendByte(*RomID++);      //发送ID到串口
                Delay5ms();
                ClrWdt();
   }
   */
}


void IapIdle(void)                             //关闭
{
   IAP_CONTR    = 0;             
   IAP_CMD      = 0;
   IAP_TRIG     = 0;
   IAP_ADDRH    = 0x00;
   IAP_ADDRL    = 0x00;
}

u8 IapReadByte(u8 addr)                   //从EEPROM中读一字节数据
{
   u8 dat;
   bit temp;
   temp = EA;
   EA=0;                  //数据缓冲区
   IAP_CONTR = ENABLE_IAP;      //使能IAP
   IAP_CMD = CMD_READ;          //设置IAP命令
   IAP_ADDRL = addr;            //设置IAP低地址
   IAP_ADDRH = addr >> 8;       //设置IAP高地址
   IAP_TRIG = 0x5a;             //写触发命令(0x5a)
   IAP_TRIG = 0xa5;             //写触发命令(0xa5)
   _nop_();                     //等待ISP/IAP/EEPROM操作完成
   dat = IAP_DATA;              //读ISP/IAP/EEPROM数据
   IapIdle();                   //关闭IAP功能
   EA= temp;
   return dat;                  //返回
}


void IapProgramByte(u8 addr,u8 dat) //向EEPROM写一字节数据
{
   bit temp;
   temp = EA;
   EA=0;
   IAP_CONTR = ENABLE_IAP;      //使能IAP
   IAP_CMD = CMD_PROGRAM;       //设置IAP命令
   IAP_ADDRL = addr;            //设置IAP低地址
   IAP_ADDRH = addr >> 8;       //设置IAP高地址
   IAP_DATA = dat;              //写ISP/IAP/EEPROM数据
   IAP_TRIG = 0x5a;             //写触发命令(0x5a)
   IAP_TRIG = 0xa5;             //写触发命令(0xa5)
   _nop_();                     //等待ISP/IAP/EEPROM操作完成
   IapIdle();
   EA= temp;
}

void IapEraseSector(u8 addr)                        //擦除扇区内容
{
    bit temp;
        temp = EA;
    EA=0;
        IAP_CONTR = ENABLE_IAP; //使能IAP
    IAP_CMD = CMD_ERASE; //设置IAP命令
    IAP_ADDRL = addr; //设置IAP低地址
        IAP_ADDRH = addr >> 8; //设置IAP高地址
    IAP_TRIG = 0x5a; //写触发命令(0x5a)
    IAP_TRIG = 0xa5; //写触发命令(0xa5)
    _nop_(); //等待ISP/IAP/EEPR
    IapIdle();
        EA= temp;
}

//=======================

最新回复

应该不会啊。STC的FLASH做假EEPROM可以用啊。当初还用到产品里去了。  详情 回复 发表于 2017-8-7 17:05

回复
举报

1万

帖子

141

TA的资源

版主

不知道你说的“单片机停止工作”具体何指?程序跑飞?进入低功耗态?还是其它什么?另外,楼主是用程序存储器的IAP操作替代EEPROM,二者不是同一概念,不要混用。执行IAP操作时,注意看门狗的设置,期间要等待足够长的时间,如果有中断发生,也需要关注。

点评

ena
stcIAP系列的单片机,没有专门的EEPROM,只能把用户程序区的程序flash当EEPROM使用。在执行完Read_ID函数之后,用串口发了一个数据,也能接收到,但之后好像程序就不执行了,用串口监测的也不是复位。在执行IAP操作  详情 回复 发表于 2017-7-10 16:01
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang

回复

302

帖子

0

TA的资源

一粒金砂(高级)

chunyang 发表于 2017-7-10 15:23
不知道你说的“单片机停止工作”具体何指?程序跑飞?进入低功耗态?还是其它什么?另外,楼主是用程序存储 ...

stcIAP系列的单片机,没有专门的EEPROM,只能把用户程序区的程序flash当EEPROM使用。在执行完Read_ID函数之后,用串口发了一个数据,也能接收到,但之后好像程序就不执行了,用串口监测的也不是复位。在执行IAP操作时,中断是关闭的。

点评

别说“好像”,必须确认,按我前帖说的去检查代码。  详情 回复 发表于 2017-7-10 17:14

回复

1万

帖子

141

TA的资源

版主

ena 发表于 2017-7-10 16:01
stcIAP系列的单片机,没有专门的EEPROM,只能把用户程序区的程序flash当EEPROM使用。在执行完Read_ID函数 ...

别说“好像”,必须确认,按我前帖说的去检查代码。

点评

ena
试过了,在用IAP操作读、写过之后,定时器1打不开了,因为启用了内部看门狗,然后导致复位。 不过还是不明白定时器1为什么没打开?  详情 回复 发表于 2017-7-13 23:05
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang

回复

302

帖子

0

TA的资源

一粒金砂(高级)

chunyang 发表于 2017-7-10 17:14
别说“好像”,必须确认,按我前帖说的去检查代码。

试过了,在用IAP操作读、写过之后,定时器1打不开了,因为启用了内部看门狗,然后导致复位。
不过还是不明白定时器1为什么没打开?

回复

750

帖子

3

TA的资源

版主

按照chunyang的思路调试几下不就明白了。

点评

ena
恩,试过了。在改用STC后直接就过了,不知道什么原因。  详情 回复 发表于 2017-8-5 20:17

回复

302

帖子

0

TA的资源

一粒金砂(高级)

le062 发表于 2017-8-4 09:13
按照chunyang的思路调试几下不就明白了。

恩,试过了。在改用STC后直接就过了,不知道什么原因。

回复

6117

帖子

4

TA的资源

版主

应该不会啊。STC的FLASH做假EEPROM可以用啊。当初还用到产品里去了。

点评

ena
stc的可以,单IAP的不知道怎么搞得用不了  详情 回复 发表于 2017-8-8 11:03

回复

302

帖子

0

TA的资源

一粒金砂(高级)

damiaa 发表于 2017-8-7 17:05
应该不会啊。STC的FLASH做假EEPROM可以用啊。当初还用到产品里去了。

stc的可以,单IAP的不知道怎么搞得用不了

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表