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

📄 hart1151.c

📁 有关HART通讯命令协议和使用说明
💻 C
📖 第 1 页 / 共 3 页
字号:
void JustWR(void)
{
		tag.FlashType=66; // 该段flash文件的类型,int or float
		tag.FlashSize=30; // 该段文件的大小,以字节为单位
		tag.FlashData=1; // flash写的版本
		tag.FlashMonth=0; // flash写的版本
		tag.Crc=56;//校验位
		tag.Reserved=0;
		//WriteTest();
		//ReadFlash();
}

//-------------------------------
//
//-------------------------------
void FWrite_Modulus(volatile char *flashsegment,unsigned char *point,int Num,unsigned char startlocation)//源地址、写字节大小、起始偏移地址
{
	int i;
	for(i=startlocation;i<startlocation+Num;i++)
   {
    	*(flashsegment+i)=*(point+i-TagLength);                  //写入FLASH中
   }    	
}
//-------------------------------
//
//-------------------------------
void Write_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
	int i;
   unsigned char *p,*p1;
   p=pointtag;
	//p1=(unsigned char*)&EEP_RamT.Messenger[0];
   WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
   _DINT();                                 //关中断
   
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
   FCTL3=0XA500;                            //清除LOCK位 
   FCTL2=(FWKEY+FSSEL_1+FN2); 				  //mclk 2div  
   FCTL1=0XA540;                            //允许编程   
   //FCTL1=0XA502;                            //选择段擦除
   //*modulus=0;                         //选择擦除段号
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待擦除完成   
   //FCTL1=0XA540;                            //允许编程 

   for(i=0;i<TagLength;i++)
   {
    *(flashsegment+i)=*(p+i);                  //tag写入FLASH中
   }
   //---------------------------------
 	p1=point;
 	FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
   
   /*for(i=TagLength;i<WriteNum+TagLength;i++)
   {
    *(modulus+i)=*(p1+i-TagLength);                  //写入FLASH中
    *(p2+i)=*(p1+i);
   } */   

  //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
  FCTL1=0XA500;                            //禁止编程
  FCTL3=(0XA500+LOCK);                     //LOCK位置1
  _EINT();                                 //重开中断
  WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void IniWrite_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
   int i;
   unsigned char *p,*p1;//,*p2
   //p=(unsigned char*)&tag.FlashType;
   //p=(unsigned char*)&tag;
   p=pointtag;
	//p2=(unsigned char*)&testflashtem;
	//p1=(unsigned char*)&EEP_RamT.Messenger[0];
   WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
   _DINT();                                 //关中断
   
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
   FCTL3=0XA500;                            //清除LOCK位 
   FCTL2=(FWKEY+FSSEL_1+FN2); 				  //mclk 2div  
   FCTL1=0XA540;                            //允许编程   
   //FCTL1=0XA502;                            //选择段擦除
   //*modulus=0;                         //选择擦除段号
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待擦除完成   
   //FCTL1=0XA540;                            //允许编程 

   for(i=0;i<TagLength;i++)
   {
    *(flashsegment+i)=*(p+i);                  //tag写入FLASH中
    //*(p2+i)=*(p+i);
   }
   //---------------------------------
   ///p1=(unsigned char*)&EEP_DataStaticF;
   p1=point;
   ///FWrite_Modulus(flashsegment,p1,sizeof(EEP_DataStaticF),TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
   FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
   /*for(i=TagLength;i<WriteNum+TagLength;i++)
   {
    *(modulus+i)=*(p1+i-TagLength);                  //写入FLASH中
    *(p2+i)=*(p1+i);
   } */   

  //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
  FCTL1=0XA500;                            //禁止编程
  FCTL3=(0XA500+LOCK);                     //LOCK位置1
  _EINT();                                 //重开中断
  WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void Read_Modulus(volatile char *flashsegment,unsigned char *point,int Num,unsigned char *pointtag)//源地址、写字节大小
{
	//unsigned char *p,*p1;
	int i;
	//p=flashsegment;
	//p1=(unsigned char*)&testflashtem;
	//p1=(unsigned char*)&EEP_Ram;
	//p1=point;
	for(i=0;i<TagLength;i++)
   	{
    		//*(p+i)=*(flashsegment+i); 
    		*(pointtag+i)=*(flashsegment+i);               
   	}
 
   	for(i=TagLength;i<Num+TagLength;i++)
   	{
    		*(point+i-TagLength)=*(flashsegment+i);                  
   	}  	
}
//-------------------------------
//
//-------------------------------
void Write_Parameter(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
   int i;
   unsigned char *p,*p1;
   ///p=(unsigned char*)&tag_p;
   p=pointtag;
   //p1=(unsigned char*)&EEP_RamT.Messenger[0];
   WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
   _DINT();                                 //关中断
   
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
   FCTL3=0XA500;                            //清除LOCK位 
   FCTL2=(FWKEY+FSSEL_1+FN2); 				  //mclk 2div  
   FCTL1=0XA540;                            //允许编程   
   //FCTL1=0XA502;                            //选择段擦除
   //*modulus=0;                         //选择擦除段号
   //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待擦除完成   
   //FCTL1=0XA540;                            //允许编程 

   for(i=0;i<TagLength;i++)
   {
    *(flashsegment+i)=*(p+i);                  //tag写入FLASH中
   }
   //---------------------------------
   ///p1=(unsigned char*)&EEP_RamT;
   p1=point;
   FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
   
   /*for(i=TagLength;i<WriteNum+TagLength;i++)
   {
    *(modulus+i)=*(p1+i-TagLength);                  //写入FLASH中
    *(p2+i)=*(p1+i);
   } */   

  //while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
  FCTL1=0XA500;                            //禁止编程
  FCTL3=(0XA500+LOCK);                     //LOCK位置1
  _EINT();                                 //重开中断
  WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
}
//---------------------------------------
//
//---------------------------------------
void IniWrite_Parameter(volatile char *flashsegment,unsigned char *point,unsigned char *pointtag,int num)
{
   int i;
   unsigned char *p,*p1;
   ///p=(unsigned char*)&tag_p;
   p=pointtag;
	//p1=(unsigned char*)&EEP_RamT.Messenger[0];
   WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
   _DINT();                                 //关中断
   
   while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
   FCTL3=0XA500;                            //清除LOCK位   
   FCTL1=0XA540;                            //允许编程   
   FCTL1=0XA502;                            //选择段擦除
   *flashsegment=0;                         //选择擦除段号
   while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待擦除完成   
   FCTL1=0XA540;                            //允许编程 
   //---------------------------------//tag初始化
   //tag_p.FlashType=88; // 该段flash文件的类型,int or float
   //tag_p.FlashSize=sizeof(EEP_Ram); // 该段文件的大小,以字节为单位
   //tag_p.FlashData=1; // flash写的版本
   //tag_p.FlashMonth=0; // flash写的版本
   //tag_p.Crc=56;//校验位
   //tag_p.Reserved=0;
   //---------------------------------
   for(i=0;i<TagLength;i++)
   {
    	*(flashsegment+i)=*(p+i);                  //tag写入FLASH中
   }
   //---------------------------------
   //p1=(unsigned char*)&EEP_DataStatic;
   p1=point;
   FWrite_Modulus(flashsegment,p1,num,TagLength);//flash目的段地址、数据源地址、写字节大小、起始偏移地址
   
   /*for(i=TagLength;i<WriteNum+TagLength;i++)
   {
    *(modulus+i)=*(p1+i-TagLength);                  //写入FLASH中
    *(p2+i)=*(p1+i);
   } */   

  while((FCTL3 & (0X9600+BUSY))==0X9601);  //flash忙则等待
  FCTL1=0XA500;                            //禁止编程
  FCTL3=(0XA500+LOCK);                     //LOCK位置1
  _EINT();                                 //重开中断
  WDTCTL = WDT_ARST_1000;                  //看门狗时间为1秒
}
void Defualt_init(void)
{
	BurstCmd=2;
	PreamNum=10;//
	//SAddr=0;
	Addr[0]=MFR_Rosemount;Addr[1]=Type_1151;
	//Addr[2]=9;
	//Addr[3]=1;
	//Addr[4]=1;
	Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
	//if(tag.FlashType==66)
	//if(EEP_Ram.PvDamp==1)
	if(EEP_Ram.Tag==6)
	{
		//数据正确
		//Read_Modulus(modulus,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小	
	}
	else
	{
		///Read_Modulus(modulus,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
			/*if(tag_re.FlashType==56)//不是第一次读取
			{
				恢复备份数据到原始数据内
				tag.FlashType=tag_re.FlashType; // 该段flash文件的类型,int or float
				tag.FlashSize=tag_re.FlashSize; // 该段文件的大小,以字节为单位
				tag.FlashData=tag_re.FlashData=2; // flash写的版本
				tag.FlashMonth=tag_re.FlashMonth; // flash写的版本
				tag.Crc=tag_re.Crc;//校验位
				tag.Reserved=tag_re.Reserved;
				//抬高当前电流
				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
				Flash_Clear(modulus);
				IniWrite_Modulus(modulus,(unsigned char*)&modulus_re,(unsigned char*)&tag,sizeof(EEP_Ram_re));
				///IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_Ram));
				//EEP_Ram.UpSensorLimit=100;
				//EEP_Ram.A4=99;
				//Write_Modulus();
			      //Read_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char Num,unsigned char *pointtag)//源地址、写字节大小
				Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
				//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
				//needwrite_modulus=1;	
			}
			else//初始化当前和备份两个区域*/
			{	
				tag.FlashType=56; // 该段flash文件的类型,int or float =tag_re.FlashType
				tag.FlashSize=sizeof(EEP_Ram); // 该段文件的大小,以字节为单位=tag_re.FlashSize
				tag.FlashData=0; // flash写的版本=tag_re.FlashData
				tag.FlashMonth=0; // flash写的版=tag_re.FlashMonth本
				tag.Crc=56;//校验位=tag_re.Crc
				tag.Reserved=0;//=tag_re.Reserved
				Flash_Clear(modulus);
				IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_DataStaticF));
				//EEP_Ram.UpSensorLimit=100;
				//EEP_Ram.A4=99;
				//Write_Modulus();
				Read_Modulus(modulus,(unsigned char*)&EEP_Ram,sizeof(EEP_Ram),(unsigned char*)&tag);//源地址、写字节大小
				//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
				//needwrite_modulus=1;
				
				//Flash_Clear(modulus_re);
				//IniWrite_Modulus(modulus_re,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag_re,sizeof(EEP_DataStaticF));
				//Read_Modulus(modulus_re,(unsigned char*)&EEP_Ram_re,sizeof(EEP_Ram_re),(unsigned char*)&tag_re);//源地址、写字节大小
			}	
	}
	Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
	
	if(EEP_RamT.Flag==8)
	{
		//数据正确
		//Read_Modulus(parameter,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小	
	}
	else
	{
		/*Read_Modulus(parameter,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
			if(tag_rep.FlashType==65)//不是第一次读取
			{
				//恢复备份数据到原始数据内
				tag_p.FlashType=tag_rep.FlashType; // 该段flash文件的类型,int or float
				tag_p.FlashSize=tag_rep.FlashSize; // 该段文件的大小,以字节为单位
				tag_p.FlashData=tag_rep.FlashData=2; // flash写的版本
				tag_p.FlashMonth=tag_rep.FlashMonth; // flash写的版本
				tag_p.Crc=tag_rep.Crc;//校验位
				tag_p.Reserved=tag_rep.Reserved;
				//抬高当前电流
				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
   				DA_DataOut(2000);
				Flash_Clear(parameter);
				IniWrite_Parameter(parameter,(unsigned char*)&parameter_re,(unsigned char*)&tag_p,sizeof(EEP_RamT_re));
				//EEP_Ram.UpSensorLimit=100;
				//EEP_Ram.A4=99;
				//Write_Modulus();
			      //Read_Modulus(volatile char *flashsegment,unsigned char *point,unsigned char Num,unsigned char *pointtag)//源地址、写字节大小
				Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
				//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
				//needwrite_modulus=1;	
			}
			else//初始化当前和备份两个区域*/
			{	
				tag_p.FlashType=65; // 该段flash文件的类型,int or float =tag_rep.FlashType
				tag_p.FlashSize=sizeof(EEP_RamT); // 该段文件的大小,以字节为单位=tag_rep.FlashSize
				tag_p.FlashData=0; // flash写的版本=tag_rep.FlashData
				tag_p.FlashMonth=0; // flash写的版本=tag_rep.FlashMonth
				tag_p.Crc=56;//校验位=tag_rep.Crc
				tag_p.Reserved=0;//=tag_rep.Reserved
				
				Flash_Clear(parameter);
				//IniWrite_Modulus(modulus,(unsigned char*)&EEP_DataStaticF,(unsigned char*)&tag,sizeof(EEP_DataStaticF));
				IniWrite_Parameter(parameter,(unsigned char*)&EEP_DataStatic,(unsigned char*)&tag_p,sizeof(EEP_RamT));
				//EEP_Ram.UpSensorLimit=100;
				//EEP_Ram.A4=99;
				//Write_Modulus();
				Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
				//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
				//needwrite_modulus=1;
				
				//Flash_Clear(parameter_re);
				//IniWrite_Parameter(parameter_re,(unsigned char*)&EEP_DataStatic,(unsigned char*)&tag_rep,sizeof(EEP_RamT_re));
				//Read_Modulus(parameter_re,(unsigned char*)&EEP_RamT_re,sizeof(EEP_RamT_re),(unsigned char*)&tag_rep);//源地址、写字节大小
			}
			
			
			//tag_p.FlashType=65; // 该段flash文件的类型,int or float
			//tag_p.FlashSize=sizeof(EEP_RamT); // 该段文件的大小,以字节为单位
			//tag_p.FlashData=0; // flash写的版本
			//tag_p.FlashMonth=0; // flash写的版本
			//tag_p.Crc=56;//校验位
			//tag_p.Reserved=0;
			//Flash_Clear(parameter);
			//IniWrite_Parameter();
			//Read_Modulus(parameter,(unsigned char*)&EEP_RamT,sizeof(EEP_RamT),(unsigned char*)&tag_p);//源地址、写字节大小
			//DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAZeroCode,20,4);//计算DA输出的斜率和截距
	}
	//----------------------------//old
	Addr[0]=EEP_RamT.Addr[0];
	Addr[1]=EEP_RamT.Addr[1];
	Addr[2]=EEP_RamT.Addr[2];
	Addr[3]=EEP_RamT.Addr[3];
	Addr[4]=EEP_RamT.Addr[4];
	SAddr=EEP_RamT.SAddr;
	PreamNum=EEP_RamT.WDELM_Num=10;//
	Write_p=EEP_RamT.WriteProt;
	//EEP_Ram.SensorS=SensorArry[2];
	
	DAV_KB(EEP_RamT.DAHalfCode,EEP_RamT.DAZeroCode,12,4,1);//计算DA输出的斜率和截距//4-12
	DAV_KB(EEP_RamT.DAFullCode,EEP_RamT.DAHalfCode,20,12,2);//计算DA输出的斜率和截距12-20
	
	BaseDAk=EEP_Ram.DANk;
	BaseDAb=EEP_Ram.DANb;
	/*if(EEP_Ram.TempZeroA==EEP_Ram.TempZeroB==EEP_Ram.TempZeroC==0)
	{
			EEP_Ram.TempZeroD=EEP_RamT.X0;
	}
	if(EEP_Ram.TempFullA==EEP_Ram.TempFullB==EEP_Ram.TempFullC==0)
	{
			EEP_Ram.TempFullD=EEP_RamT.Xs;
	}*/
	//TempLine(60,30,EEP_RamT.TempFull,EEP_RamT.TempZero);
}
	





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -