⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysdatatree(eric).c

📁 一个电表的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
     }
     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 + -