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