打印
[其它应用]

SH79F085内部EEPROM数据被改写什么原因?

[复制链接]
1049|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linbo411|  楼主 | 2014-9-2 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
贴上EEPROM读写程序
/*------------------------------------------------------------------------------
** 函数原型:        void EEPROM_Erase(void)
** 功能描述:        擦除扇区
** 参数说明:       
**                               
** 返回值:           
**                               
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Erase(uchar PAGE)
{
        bit CY;
       
        CY = EA;                            // 保存中断状态  
  EA = 0;                       // 关闭中断        
        FLASHCON = 0x01;        // 访问eeprom
        XPAGE    = PAGE;        // 选择扇区0
        IB_CON1  = 0xE6;        // 扇区擦除
        IB_CON2  = 0x05;  // 关键字
        IB_CON3  = 0x0A;  // 关键字
        IB_CON4  = 0x09;  // 关键字
        IB_CON5  = 0x06;  // 启动擦除
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        XPAGE                 = 0X00;  // 扇区清0
        FLASHCON        = 0x00;  // 清0  
        EA    = CY;        // 中断恢复
}
/*------------------------------------------------------------------------------
** 函数原型:        void EEPROM_Read_data(void)
** 功能描述:        读EEPROM数据
** 参数说明:       
**                               
** 返回值:           
**                               
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Read_data(uint addr )
{
  bit CY;
        uchar          i;
        uchar  code *  EEPROM_Addr;
        uchar              *  RAM_Addr;
       
        CY = EA;                                                                               // 保存中断状态
        EA = 0;                                                                                                               // 关闭中断
        FLASHCON           = 0x01;                                                      // 访问eeprom
  EEPROM_Addr  = (uchar code *) addr;                        // 保存EEPROM起始地址                                                       
        RAM_Addr                 = (uchar *)0x70;                                        // 需要保存的变量起始地址                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  );
        for(i=0;i<29;i++)
        {
                *(RAM_Addr++) = *(EEPROM_Addr++) ;        // 读EEPROM数据
        }
        XPAGE                 = 0X00;                                  // 扇区清0
        FLASHCON           = 0x00;        
        EA           = CY;                                      // 中断恢复
}               

/*------------------------------------------------------------------------------
** 函数原型:        void EEPROM_Write_data(void)
** 功能描述:        写EEPROM数据
** 参数说明:       
**                                    
** 返回值:           
**                               
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Write_data(uchar PAGE)
{
        bit CY;
        uchar    i;
        uchar *  RAM_Addr;
        uchar           EEPROM_Addr;
       
        CY = EA;                                                       // 保存中断状态
        EA = 0;                                                                                       // 关闭中断
  FLASHCON          = 0x01;                                      // 访问eeprom
        EEPROM_Addr = 0;                                                                // 保存EEPROM起始地址                                                       
        RAM_Addr                =(uchar *)0x70;                        // 需要保存的变量起始地址
        for(i=0;i<29;i++)                                                                // 所有变量加起来29个字节
        {
                XPAGE     = PAGE;                                           // 选择扇区0
                IB_OFFSET = EEPROM_Addr;                        // 要写入EEPROM偏移地址
                IB_DATA = *(RAM_Addr++);            // 要写入的数据
                EEPROM_Addr++;                                                           // 地址+1
                IB_CON1 = 0x6E;                                                                 // 扇区编程
                IB_CON2 = 0x05;                                        // 关键字
                IB_CON3 = 0x0A;                                                                 // 关键字
                IB_CON4 = 0x09;                                        // 关键字
                IB_CON5 = 0x06;                                        // 启动编程
                _nop_();
                _nop_();
                _nop_();
                _nop_();
        }
        XPAGE                 = 0X00;                                  // 扇区清0
        FLASHCON  = 0x00;
        EA    = CY;                                                    // 中断恢复
}

利用内部EEPROM保存仪表的校准参数,1000台中发现有几台参数变成0不知道怎么回事?
沙发
gx_huang| | 2014-9-3 10:07 | 只看该作者
你想象一下,这个是需要先擦除扇区再编程的,如果擦除完成,没有来得及写入新的参数就掉电了,那参数就没有了。
所以,需要程序处理意外的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

58

帖子

0

粉丝