| 
 
| 生产一批板子 一部分是好的  一部分保存的数据 读出来是错误的,进入存储空间看了,发现是需要保存的数据一部分被更改了,尝试了好多方法,都没有找到原因,希望大侠们指点 //将结构体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; //开总中断
 }
 
 | 
 |