📄 sysdatatree(eric).c
字号:
}
else if (DaAtt == xRAM)
{
xCp = (unsigned char __xdata *)DataAdr ; //xRAM指针
return (*xCp);
}
else if (DaAtt == pROM)
{
oCp = (const unsigned char __code *)DataAdr; //pROM指针
return (*oCp);
}
return 0xEE;
}
//-------------------------------------------------------------------------------------------------
// 系统数据传输函数
// input: 数据原地址,数据目的地址,传输数据长度
// output:
/* ==================================================================================================================
* 文件名称:MoveData_Api( unsigned int Sdata,unsigned int Ddata,unsigned char Len)
* 文件标识:
* 摘 要: 1、系统物理介质之间的数据传输。
2、物理介质有:iRAM(内部SRAM),xRAM(外部SRAM),pROM(程序flash),e2prom(重要参数和变量)。
3、转送方法:(a) iRAM--->iRAM , iRAM--->xRAM , iRAM--->e2prom
(b) xRAM--->iRAM , xRAM--->xRAM , xRAM--->e2prom
(c) e2prom--->iRAM , e2prom--->xRAM
(d) pROM--->iRAM , pROM---->xRAM , pROM---->e2prom
4、e2prom错误检测在这函数中完成
*输入参数: 参数1:数据源地址值(int型数据),参数2:数据目的地地址值(int型数据),参数2:传输数据长度(char型数据)
地址值取值范围:iRAM地址为物理地址原值,xRAM地址为物理地址原值+0x4000,
e2prom地址为物理地址原值+0x8000, prom(flash)地址为物理地址原值+0xC000。
*输出参数:有参数设置正确返回“ErrorFalse”,如有误返回 “ErrorTrue”
* 引用函数: I2C读写函数等:I2C_Write(); I2C_Read();
* 当前版本:Ver 1.0
* 作 者:罗冬生
* 修改内容:
* 修改日期:
* 完成日期:
--------------------------------------------------------------------------------------------------------------------*/
void MoveData_Api( unsigned int Sdata,unsigned int Ddata,unsigned char Len)
{
unsigned char k,m;
k = DataAdrCheck(Sdata);
m = DataAdrCheck(Ddata);
if (k != e2RAM)
{
Ddata &=0x3FFF;
if (m != e2RAM)
{
Sdata &=0x3FFF;
while (Len--)
{
PutData_Api(GetData_Api(Sdata,k),Ddata,m); // porm ,idata,xdata之间转送数据
Sdata++;
Ddata++;
}
}
else
{ WriteE2prom_Api(Ddata,Sdata,Len); } // 数据目的地在E2PROM,写e2prom
}
else
{
ReadE2prom_Api((Sdata & 0x3FFF),Ddata,Len); // 数据源在E2PROM,读e2prom
}
}
/*===============================================================================================
Author: Luo Dong Sheng
Company: Ning Bo San Xing.
Revision: 1.00
Date: 11/18/2006
=======================================================*/
// 系统数据结构数据搜索,数据库为SysDataTree[]
// 入口:标识序列号(通信使用的标识序列号),形式参数输入
// 出口:1、函数返回数据为数据在数据库数组中的自然序列号(int)
// 2、函数返回数据为"0"则搜索无此标识序列号
/*-----根据逻辑ID---------得到物理行号--数据块不做偏移-----*/
unsigned int Search(unsigned int sign)
{
unsigned int low;
unsigned int high;
unsigned int mid_aa;
low=1;
high = sizeof SysDataTree; //取最大空间
while(low<=high)
{
mid_aa = (low+high) / 2;
if(sign == SysDataTree[mid_aa].iD)
{
return mid_aa;
}
else
if(sign < SysDataTree[mid_aa].iD)
high = mid_aa - 1;
else
low = mid_aa + 1;
}
return 0;
}
//--------------------------------------------------------------------------------------------
/*--根据
intpu: 逻辑ID,叶点
返回: 数据物理地址和长度
该函数只支持一个数据层 0x0F 0x1F 0x2F等
--*/
unsigned int GetDataTree_Adr_Len(unsigned int iD,unsigned char *len)
{
unsigned int ID_No;
ID_No = Search(iD);
*len =SysDataTree[ID_No].Length;
return (SysDataTree[ID_No].Adr);
}
/*--------------------------------------------------------------------------------------------
功能:系统数据初始化模块
入口:初始化内容,1、变量数据区清零,2、参数区清零,3参数和变量数据区清零。
返回
-----------------------------------------*/
void SysData_Init(void)
{
unsigned char i,k,sum;
k=IE_bit.EA;
IE_bit.EA=0;
sum =0;
MoveData_Api((InitFlgBuf1+e2RAM_Adr),(unsigned int)&RxTxBuf[0]+xRAM_Adr,8); //读初始标志0x68十六个字节
MoveData_Api((InitFlgBuf2+e2RAM_Adr),(unsigned int)&RxTxBuf[8]+xRAM_Adr,8);
for (i=0;i<16;i++)
{
if (RxTxBuf[i]!= 0x68)
{
RxTxBuf[i] = 0x68;
sum ++;
}
}
if (sum>8)
{
ClearVariableBuf1(); // 参变量数据区清零
SetParameterInit(); // 参数区设置最原始的PROM数据
}
if (sum)
{
MoveData_Api((unsigned int)&RxTxBuf[0]+xRAM_Adr,(InitFlgBuf1+e2RAM_Adr),8); //设定初始标志0x68十六个字节
MoveData_Api((unsigned int)&RxTxBuf[8]+xRAM_Adr,(InitFlgBuf2+e2RAM_Adr),8);
}
// 增加一些参数的装载
MoveData_Api(eUpDownPowerDataBuf+e2RAM_Adr,(unsigned int)(&rUpDownPowerDataBuf[0])+iRAM_Adr,UpSaveDataLen); //装载掉电时的数据
MoveData_Api((unsigned int)(&rSysTmDt_Dtr[0])+iRAM_Adr,ePdTime_Dtr+e2RAM_Adr,6); //保存上次停电时间
i=3;
while (i--)
{
MoveData_Api( eSysTmDt_Dtr+e2RAM_Adr, (unsigned int)(&rSysTmDt_Dtr[0])+iRAM_Adr,8);
if (DataSum(rSysTmDt_Dtr,7)==TimeSum)
{
break;
}
}
if (!i)
{
; //取RAM 四个字节中的内容作为日期
}
TimeUpdate(); //读时分秒
MoveData_Api((unsigned int)(&rSysTmDt_Dtr[0])+iRAM_Adr,ePuTime_Dtr+e2RAM_Adr,6); //保存最近一次上电时间
//添加计算电池工作时间
CommRefurbish(); //通信需要刷新的数据,在此也要刷新
CF_const = BCD2Hex(rMtCt_Dtr[1]); //bcd码脉冲常数转换成十六进制
if (k)
IE_bit.EA=1;
}
//-----------------------------------------------------------------------------------------------
// 求数据校验和
unsigned char DataSum(unsigned char __idata *Data,unsigned char Len)
{
unsigned char sum;
sum =0x68;
while (Len--)
{
sum += *Data;
Data++;
}
return sum;
}
//===============================================================================================
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -