打印
[技术问答]

新唐N76E003 使用IAP保存一组数据 一部分数据被修改

[复制链接]
1648|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
woshicainiao|  楼主 | 2018-5-2 19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
生产一批板子 一部分是好的  一部分保存的数据 读出来是错误的,进入存储空间看了,发现是需要保存的数据一部分被更改了,尝试了好多方法,都没有找到原因,希望大侠们指点
//将结构体Temp_Para中的数据写入APROM  结构体中的数据类型为u16
void Write_Data()
{
        u8 count = 0, data_h = 0, data_l = 0,temp_h = 0,temp_l = 0;
  u16 *pt = &Temp_Para.temp_setting;  //结构体首地址
  u16 ps = startaddress;
  EA = 0; //关总中断

        TA = 0xAA;               //产生3个时钟周期 这个周期内写入0x55
        TA = 0x55;                            //产生4个时钟周期 这个周期内操作寄存器
        CHPCON |= 0x01;    //IAPEN 使能置1

        TA = 0xAA;                           
        TA = 0x55;                                   
        IAPUEN = 0x01;     //选择APROM区域升级

        IAPCN = 0x22;      //命令 APROM  页擦除                 page 0x4780-0x47ff                128Byte
        IAPAH = 0x47;             //page 地址高8位
        IAPAL = 0x80;                         //page 地址低8位
        IAPFD = 0xFF;                         
        TA = 0xAA;                           
        TA = 0x55;                                   
        IAPTRG |= 0x01;    //IAPGO置1 触发   执行之后 自动清零

        for(count=0;count<sizeof(TempPara_TypeDef)/2;count++)
        {
                data_h = (*(pt+count)>>8) & 0xFF;
          data_l = (*(pt+count)) & 0xFF;

                IAPCN = 0x21;      //命令 APROM  字节写入
                IAPAH = (ps >> 8);             // 存储地址高8位
                IAPAL = (ps & 0xFF);                 // 存储地址低8位
                IAPFD = data_l;          //写数据低8位
          TA = 0xAA;                           
                TA = 0x55;                                   
                IAPTRG |= 0x01;    //IAPGO置1 触发   执行之后 自动清零
                temp_l = *((u8 code*) ps);
                ps++;

                IAPCN = 0x21;      //命令 APROM  字节写入
                IAPAH = (ps >> 8);             // 存储地址高8位
                IAPAL = (ps & 0xFF);                 // 存储地址低8位
                IAPFD = data_h;          //写数据高8位
          TA = 0xAA;                           
                TA = 0x55;                                   
                IAPTRG |= 0x01;    //IAPGO置1 触发   执行之后 自动清零
                temp_h = *((u8 code*) ps);                //读出保存的数据 校验
                 ps++;
                if((temp_l!=data_l)||(temp_h!=data_h))//将读出的数据 和 需要保存的数据对比  如果不一致 重新保存数据, 最初是没有校验语句的 加上此语句后 保存的数据被修改现象明显改善,250块板子 还是能发现2-3块
                {
                        ps -= 2;  //重新保存数据
                        count--;
                }
        }
       
  TA = 0xAA;                            //产生3个时钟周期 这个周期内写入0x55
        TA = 0x55;                                   //产生4个时钟周期 这个周期内操作寄存器
        IAPUEN &= ~0x01;   //禁止APROM区域升级

        TA = 0xAA;               //产生3个时钟周期 这个周期内写入0x55
        TA = 0x55;                            //产生4个时钟周期 这个周期内操作寄存器
        CHPCON &= ~0x01;   //IAPEN置0         关闭IAP功能

        EA = 1; //开总中断
}
沙发
pmw_56| | 2018-5-3 15:52 | 只看该作者
保存在Flashz的数据可能被其它的程序覆盖了,IAP存储的数据应该放到程序的最后扇区。原来用STC的时候碰到这个问题

使用特权

评论回复
板凳
zhuotuzi| | 2018-5-3 16:25 | 只看该作者
pmw_56 发表于 2018-5-3 15:52
保存在Flashz的数据可能被其它的程序覆盖了,IAP存储的数据应该放到程序的最后扇区。原来用STC的时候碰到这 ...

是的,我都是倒着放。

使用特权

评论回复
地板
woshicainiao|  楼主 | 2018-5-4 12:08 | 只看该作者
zhuotuzi 发表于 2018-5-3 16:25
是的,我都是倒着放。

是放在最后一页的

使用特权

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

本版积分规则

2

主题

32

帖子

0

粉丝