单片机程序EEPROM不理解,请各位帮忙看下
有以下问题:1,cs为校验和,为何要加校验和 ;2,Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para); 数据长度,变量,地址,
3,unsigned char judg_eeprom_init(void)//eeprom为何要加EEPROM判断,是用来判断 新的存储器,把出厂的数据写进去吗
void energy_add(void)
{
unsigned chartemp_pulse,cs;
temp_pulse=pulse_constant_01kwh;
if(real_energy.pulse>=temp_pulse)
{
real_energy.pulse-=temp_pulse;
//real_energy.moto_flag=1;
//moto_time++;//
bcdadd(real_energy.energy,4);
kwh_flag++;
if(kwh_flag>=2)//0.1kwh back energy
{
down_save=0;
kwh_flag-=1;
cs=xaoyanghe_cs(real_energy.energy,5);
real_energy.cs=cs;
DI();
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
EI();
}
}
}
void eeprom(void)
{
unsigned char cali_data;
unsigned buff,relay;
if(judg_eeprom_init())
{
Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para);
Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
buff=xaoyanghe_cs(real_energy.energy,5);
if(buff!=real_energy.cs)
{
Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
}
}
else
{
L_default();
}
}
unsigned char judg_eeprom_init(void)//eeprom
{
unsigned char temp;
Read_EEPROM(1,&temp,eepadd_iniflag);
if(temp==0xaa)
return 0xff;
else
{
if(temp==0xaa)
return 0xff;
else
return 0x00;
}
//if(real_energy.relay_flag)
//{
// CTR_ON=1;
// CTR_OFF=0;
//}
// else
// {
// CTR_ON=0;
// CTR_OFF=1;
//}
}
void L_default(void)
{
unsigned char i,buff=0;
for(i=0;i<sizeof(meter_para.meter_number);i++)
meter_para.meter_number=0x00;//
meter_para.prg_password=prg_password0;//pro_password
meter_para.prg_password=prg_password1;
meter_para.prg_password=prg_password2;
meter_para.prg_password=prg_password3;
meter_para.pulse_constant=pulse_constant_L;//晥泿翍魥厞B曽
meter_para.pulse_constant=pulse_constant_M;
meter_para.pulse_constant=pulse_constant_H;
Write_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para);
Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
buff=xaoyanghe_cs(real_energy.energy,5);
if(buff!=real_energy.cs)//
{
Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
//buff=xaoyanghe_cs(real_energy.energy,5);
//if(buff!=real_energy.cs)//
// {
for(i=0;i<5;i++)
real_energy.energy=0x00;//
real_energy.cs=0x00;
real_energy.moto_flag=0x00;
real_energy.relay_flag=0xaa;//
// }
}
real_energy.relay_flag=0xaa;
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
}
加个标志表明保存过参数,没标志就用默认参数或提示出错。 加校验和是为了保证数据正确性,防止有些字节意外出错了 tcm123 发表于 2017-7-28 16:05
加个标志表明保存过参数,没标志就用默认参数或提示出错。 加校验和是为了保证数据正确性,防止有些字节意 ...
eepadd_iniflag请问这个是标志吗,是读存储器里的标志吗 谁帮看看啊,解读下原理 本帖最后由 kebaojun305 于 2017-7-28 17:37 编辑
三国小兵 发表于 2017-7-28 16:28
eepadd_iniflag请问这个是标志吗,是读存储器里的标志吗
明显是 eeprom 的初始化标志 上电的时候读取这个标志位,如果不对,就用默认值初始化eeprom一次,如果标志位置位了,就读取eeprom参数。
页:
[1]