📄 dataverify.c
字号:
/*********************************************************************************/
/*===========================================================================
* Copyright (c) 2004,三星科技有限公司
* All rights reserved.
*
* 文件名称:dataverify.c
* 文件标识:
* 摘 要:DDS188
*
*
* 当前版本:V 1.0
* 作 者:叶孟军
* 修改内容:
* 开始日期:2005年7月25日
* 完成日期:2005年7月
/******************************************************************************/
#include "iodefine.h"
#include "extern.h"
#define Power_Io_Data (IO.PDR5.BIT.B0)
//==============================================================================*/
const unsigned char SysData_const[69]={0x00,0x08,0x00, //电表常数
0x34,0x12,0x00,0x00,0x00,0x00, //表号
0x01,0x00,0x00,0x00,0x00,0x00, //用户号
0x34,0x12,0x00,0x00,0x00,0x00, //设备码
0x06, //循显时间
0x01, //停显时间
0x00,0x01, //自动抄表日
0x00,0x00,0x00,0x00, //有功电能起始读数
0x00,0x11,0x11,0x11, //密码
0x00,0x04,0x05,0xff,0xff,0xff,0xff,0xff, //自动轮显序号
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, //键显序号
0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00}; //LCD开关显示时间
const unsigned char ClrData_const[20] = {0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00}; //
const unsigned char Time_const[7] = {0x00,0x00,0x00,0x06,0x01,0x01,0x00};
/****************************************************************************/
void EngerData_Clr(void)
{
F_BlckWrt_Eeprm(EPPwrTtl_Dtr,ClrData_const,20); //E2P当前电量清除
F_BlckWrt_Eeprm(EM4_PPwrTtl_Dtr,ClrData_const,20); //E2P反向电量清除
F_BlckWrt_Eeprm(EM9_PPwrTtl_Dtr,ClrData_const,16); //E2P上月电量清除
WatchDog_Set(); //喂狗
F_BlckWrt_Eeprm(ELDay_PPwrTtl_Dtr,ClrData_const,20); //E2P上2月电量清除
F_BlckWrt_Eeprm(ELDay_PPwrTtl_Dtr+20,ClrData_const,20); //E2P上2月电量清除
F_BlckWrt_Eeprm(EPrgrm_Cnt_Dtr,ClrData_const,20); //E2P广播编程事件清除
F_BlckWrt_Eeprm(EPrgrm_Cnt_Dtr+20,ClrData_const,20); //E2P广播编程事件清除
F_BlckWrt_Eeprm(ELPrgrm_MdCnt_Dtr,ClrData_const,20); //E2P广播编程事件清除
WatchDog_Set(); //喂狗
F_BlckWrt_Eeprm(EPdCnt_Dtr,ClrData_const,20); //E2P停电事件清除
F_BlckWrt_Eeprm(EPdCnt_Dtr+20,ClrData_const,20); //E2P停电事件清除
F_BlckWrt_Eeprm(EPdCnt_Dtr+40,ClrData_const,20); //E2P停电事件清除
F_BlckWrt_Eeprm(EPdCnt_Dtr+60,ClrData_const,20); //E2P停电事件清除
F_BlckWrt_Eeprm(EPdCnt_Dtr+80,ClrData_const,20); //E2P停电事件清除
F_BlckWrt_Eeprm(EPdCnt_Dtr+100,ClrData_const,02); //E2P停电事件清除
WatchDog_Set();
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+20,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+40,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+60,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+80,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+100,ClrData_const,20); //E2P反向事件清除
F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+100,ClrData_const,02); //E2P反向事件清除
WatchDog_Set();
F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr,ClrData_const,20); //E2P清零事件清除
F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr+20,ClrData_const,20); //E2P清零事件清除
F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr+40,ClrData_const,07); //E2P清零事件清除
F_BlckWrt_Eeprm(PowDwn_Tm,ClrData_const,20); //E2P其它参数清除
F_BlckWrt_Eeprm(PowDwn_Tm+20,ClrData_const,20); //E2P其它参数清除
F_BlckWrt_Eeprm2(EPPwrTtl_BKUP1,ClrData_const,20); //清E2P中当前电量备份
}
void Reset_Data(void) //E2P中全部数据初始化
{
unsigned char i;
EngerData_Clr(); //电量数据清零
F_BlckWrt_Eeprm(EMtCt_Dtr,SysData_const,69); //E2P中各项参数初始化
WatchDog_Set(); //喂狗
F_BlckWrt_Eeprm(Rtc_Time,Time_const,7); //
F_BlckRead_Eeprm(Rtc_Time,RTm_Dtr,7); //时间
F_BlckRead_Eeprm(Rtc_Time+3,RDtWk_Dtr,4); //日期
F_BlckWrt_Eeprm(PowDwn_Tm,ClrData_const,20); //E2P中各项事件参数清零
WatchDog_Set();
for(i=0;i<16;i++)
{
SysData_Verify[i] = 0x68;
}
F_BlckWrt_Eeprm(ESysData_Group,SysData_Verify,0x10);
RBatt_WorkTm_Dtr[0] = 0x00;
RBatt_WorkTm_Dtr[1] = 0x00;
RBatt_WorkTm_Dtr[2] = 0x00;
BrochkSec_Cnt = 0; //广播校时后秒计数器清零
}
void Dl_VerAdd_0(unsigned char *addr1,unsigned int addr2,unsigned int addr3)
{
unsigned char i;
unsigned char j = 0x00;
unsigned char p = 0x00;
for(i=0;i<4;i++)
{
j = j + *(addr1 + i);
}
F_BlckRead_Eeprm(addr2,Databuf,4); //读取E2P电量数据到RAM区1
for(i=0;i<4;i++)
{
p = p + Databuf[i];
}
if(j != p)
{
F_BlckRead_Eeprm(addr3,Databuf+30,4); //读取E2P2电量数据到RAM区2
j = 0x00;
for(i=0;i<4;i++)
{
j = j + Databuf[30+i];
}
if(j != p)
{
F_BlckWrt_Eeprm(addr2,&Databuf[30],4);
F_BlckRead_Eeprm(addr2,addr1,4);
}
else
{
F_BlckRead_Eeprm(addr2,addr1,4);
}
}
}
void Sys_DataVer(void)
{
unsigned char i;
unsigned char j = 0x00;
for(i=0;i<16;i++)
{
if(SysData_Verify[i] == 0x68)
{
++j;
}
}
if(j < 10) //RAM区系统数据校验区数据 == 0x68的个数小于10
{
Sys_Reg.BYTE=0x02; //系统认为该电表系统已初始化过,但电池未在掉电后提供电压
F_BlckRead_Eeprm(ESysData_Group,SysData_Verify,0x10);
j = 0x00;
for(i=0;i<16;i++)
{
if(SysData_Verify[i] == 0x68)
{
++j;
}
}
if(j < 10) //系统为第一次上电
{
Sys_Reg.BYTE=0x01; //系统认为第一次上电
}
}
else
{
Sys_Reg.BYTE=0x04; //系统认为该电表系统已初始化过,且电池在掉电后一直提供电压
}
}
void Sys_UpVer(void) //系统自校验
{
Sys_DataVer();
if(Sys_Reg.BYTE == 0x01) //系统第一次上电
{
Reset_Data();
BrochkSec_Cnt = 0; //广播校时后秒计数器清零
}
if(Sys_Reg.BYTE == 0x02) //系统认为该电表系统已初始化过,但电池未在掉电后提供电压
{
RBatt_WorkTm_Dtr[0] = 0x00;
RBatt_WorkTm_Dtr[1] = 0x00;
RBatt_WorkTm_Dtr[2] = 0x00;
BrochkSec_Cnt = 0; //广播校时后秒计数器清零
}
WatchDog_Set(); //喂狗
IO.PCR5 = 0xFE; //POWER作为输入、WP1、SCL1、SDA1作为输出
if(Power_Io_Data) //系统如为正常上电模式
{
Dl_VerAdd_0(RPPwrTtl_Dtr,EPPwrTtl_Dtr,EPPwrTtl_BKUP); //当前电量校验
}
IO.PCR5 = 0xFE; //POWER作为输入、WP1、SCL1、SDA1作为输出
if(Power_Io_Data) //系统如为正常上电模式
{
Dl_VerAdd_0(RNPwrTtl_Dtr,ENPwrTtl_Dtr,ENPwrTtl_BKUP); //反向电量校验
}
IO.PCR5 = 0xFE; //POWER作为输入、WP1、SCL1、SDA1作为输出
if(Power_Io_Data) //系统如为正常上电模式
{
F_BlckRead_Eeprm(ENPwrTtl_Dtr,RNPwrTtl_Dtr,0x04);
F_BlckRead_Eeprm(EMtCt_Dtr,RMtCt_Dtr,0x03); //电表常数读取
F_BlckRead_Eeprm(EMtNo_Dtr,RMtNo_Dtr,0x06); //表地址读取
F_BlckRead_Eeprm(EUsrNo_Dtr,RUsrNo_Dtr,0x06); //用户号读取
F_BlckRead_Eeprm(EDvcNo_Dtr,RDvcNo_Dtr,0x06); //设备码读取
F_BlckRead_Eeprm(EShftDspTm_Dtr,RShftDspTm_Dtr,0x01); //循显时间读取
F_BlckRead_Eeprm(EStpDspTm_Dtr,RStpDspTm_Dtr,0x01); //停显时间读取
F_BlckRead_Eeprm(EAUtRdTm_Dtr,RAUtRdTm_Dtr,0x02); //自动抄表日
F_BlckRead_Eeprm(EIntPwr_Dtr,RIntPwr_Dtr,0x04); //有功电能起始读数
F_BlckRead_Eeprm(EPassWd_Dtr,RPassWd_Dtr,0x04); //密码读取
F_BlckRead_Eeprm(ERttDspNo_Dtr,RRttDspNo_Dtr,0x10); //正常轮显序号
F_BlckRead_Eeprm(EKeyDspNo_Dtr,RKeyDspNo_Dtr,0x10); //键显序号
F_BlckRead_Eeprm(EOpnClsLcd_Dtr,ROpnClsLcd_Dtr,0x04); //LCD开关显示时间
F_BlckRead_Eeprm(E_Cf_Cnt,&CF_CUNT,1); //脉冲数
WatchDog_Set(); //喂狗
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -