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

📄 nsa_timer_drv.c

📁 ds1306和bs5460的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//byWhich_CS: 3(全部Three)
bool TM_CS_Set_DC_Offset(BYTE byWhich_CS)
{
	DWORD dWord;
	BYTE i;

	if( byWhich_CS!=CS_ALL ) 
		return false;

	for(i=0; i<CS_ALL; i++)
	{
		//Send soft RESET command
		dWord=0x80;
		TM_Write_CS5460(WRITE_COM|CONFIG_REG,i,&dWord);
	}
	//Wait for 10 XIN cycles
	for ( dWord =0; dWord<0x1000; dWord++ );
	for( i=0; i<CS_ALL; i++)
	{
		dWord=0xffffff;
		TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord );
		if(i==1)
			TM_Write_CS5460( CALIBRATE| OFF_CALIB| CHANNEL_I_V, i, &dWord );
		else
			TM_Write_CS5460( CALIBRATE| OFF_CALIB| CHANNEL_I_V, i, &dWord );
	}
	return true;
}
//偏置校验
//byWhich_CS: 3(全部Three)
bool TM_CS_Set_AC_Offset(BYTE byWhich_CS)
{
	DWORD dWord;
	BYTE i;

	if( byWhich_CS!=CS_ALL ) 
		return false;

	for( i=0; i<CS_ALL; i++)
	{
		dWord=0;
		TM_Write_CS5460( WRITE_COM|IACOFF_REG,	i, &dWord);
		TM_Write_CS5460( WRITE_COM|VACOFF_REG,	i, &dWord);
		dWord=0x400000;
		TM_Write_CS5460( WRITE_COM|IGN_REG,		i, &dWord);
		TM_Write_CS5460( WRITE_COM|VGN_REG,		i, &dWord);
		dWord=0xffffff;
		TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord );
		if(i==1)
			TM_Write_CS5460( CALIBRATE| R_AC| OFF_CALIB| CHANNEL_I_V, i, &dWord );
		else
			TM_Write_CS5460( CALIBRATE| R_AC| OFF_CALIB| CHANNEL_I_V, i, &dWord );
	}
	return true;
}
//增益校验
//3
bool TM_CS_Set_AC_Gain(BYTE byWhich_CS)
{
	DWORD dWord;
	BYTE i;

	if( byWhich_CS!=CS_ALL ) 
		return false;

	for( i=0; i<CS_ALL; i++)
	{
		TM_Read_CS5460( E_REG, i, &dWord );
		TM_Read_CS5460( STATUS_REG, i, &dWord );
		//if( (dWord&0x800000)==0 ) return false;
		dWord=0x400000;
		TM_Write_CS5460( WRITE_COM|IGN_REG,	i, &dWord);//1.00增益倍数
		TM_Write_CS5460( WRITE_COM|VGN_REG,	i, &dWord);
		dWord=0xffffff;
		TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord);
		//if(i==1)
		//	TM_Write_CS5460( CALIBRATE| R_AC| GAIN_CALIB| CHANNEL_V, i, &dWord );
		//else	//for PST642
			TM_Write_CS5460( CALIBRATE| R_AC| GAIN_CALIB| CHANNEL_I_V, i, &dWord );
	}
	return true;
}

//角度校验
//Special Bits in some Register
#define BYUP	0x0
#define BYDOWN  0xff
#define BASE_DEGREE		0x60000
bool TM_CS_Set_Degree(BYTE byWhich_CS,BYTE byOprate)
{
	//static DWORD dConfig0=0;
	DWORD dWord,dTempWord;
	//读取CS5460状态
	//TM_Read_CS5460( STATUS_REG, byWhich_CS, &Energy_Reg[byWhich_CS].Status );
	//清除状态标志
	//dWord=0xffffff;
	//TM_Write_CS5460( WRITE_COM| STATUS_REG, byWhich_CS, &dWord);
	TM_Read_CS5460( CONFIG_REG, byWhich_CS, &dWord );
	dTempWord=dWord&0xfe0000;
	switch( byOprate )
	{
	case BYUP:
		if(dTempWord<0xfe0000)
			dTempWord+=BASE_DEGREE;
		break;
	case BYDOWN:
		if(dTempWord>0x10000)
			dTempWord-=BASE_DEGREE;
		break;
	default:
		break;
	}
	dTempWord|=( dWord&0x01ffff );
	TM_Write_CS5460( WRITE_COM| CONFIG_REG, byWhich_CS, &dTempWord );
	//重新设置转换
	dWord=0xffffff;
	//TM_Write_CS5460( CONVERT, byWhich_CS, &dWord);
	return true;
}

//保存CS5460配置信息
//3
bool TM_Save_CS5460_Config(BYTE byWhich_CS)
{
	BYTE i;

	if( byWhich_CS!=CS_ALL ) 
		return false;

	for( i=0; i<3; i++)
	{
		if( CrcOk( (BYTE *)&Energy_Reg[i].Conf, sizeof(CONFIG_5460)-2 ) )
		{	//CRC校验正确
			TM_Write_CS5460( WRITE_COM|CONFIG_REG,	i, &Energy_Reg[i].Conf.Config);
			TM_Write_CS5460( WRITE_COM|IOFF_REG,	i, &Energy_Reg[i].Conf.Ioff);
			TM_Write_CS5460( WRITE_COM|IGN_REG,		i, &Energy_Reg[i].Conf.Ign);
			TM_Write_CS5460( WRITE_COM|VOFF_REG,	i, &Energy_Reg[i].Conf.Voff);
			TM_Write_CS5460( WRITE_COM|VGN_REG,		i, &Energy_Reg[i].Conf.Vgn);
			TM_Write_CS5460( WRITE_COM|IACOFF_REG,	i, &Energy_Reg[i].Conf.Iacoff);
			TM_Write_CS5460( WRITE_COM|VACOFF_REG,	i, &Energy_Reg[i].Conf.Vacoff);
			TM_Write_CS5460( WRITE_COM|POFF_REG,	i, &Energy_Reg[i].Conf.Poff);
			Energy_Reg[i].bUsed=true;
		}
		else
			return false;
	}
	return true;		
}

void Read_CS_Config()
{
	BYTE i;
	for( i=0; i<CS_ALL; i++ )
	{
		TM_Read_CS5460( CONFIG_REG, i, &Energy_Reg[i].Conf.Config);
		TM_Read_CS5460( IOFF_REG,	i, &Energy_Reg[i].Conf.Ioff);
		TM_Read_CS5460( IGN_REG,	i, &Energy_Reg[i].Conf.Ign);
		TM_Read_CS5460( VOFF_REG,	i, &Energy_Reg[i].Conf.Voff);
		TM_Read_CS5460( VGN_REG,	i, &Energy_Reg[i].Conf.Vgn);
		TM_Read_CS5460( IACOFF_REG, i, &Energy_Reg[i].Conf.Iacoff);
		TM_Read_CS5460( VACOFF_REG, i, &Energy_Reg[i].Conf.Vacoff);
		TM_Read_CS5460( POFF_REG,	i, &Energy_Reg[i].Conf.Poff);

		TM_Read_CS5460( E_REG,		i, &Energy_Reg[i].E );
		TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
	}
}

bool Check_CS_Status()
{
	int i;
	
	for( i=0; i<CS_ALL; i++ )
	{
		//if MATH,IOR,VOR,IROR,VROR,EOR 
		if(i==1)
		{	//Only care about MATH,VOR,VROR
			if( (Energy_Reg[i].Status&0x080000)!=0 )
				return false;
		}
		else
		{
			if( (Energy_Reg[i].Status&0x080000)!=0 )	//Change to only about MATH,EOR etc
				return false;
		}

		if( (Energy_Reg[i].Status&0x0800000)==0 ) 
			return false;
	}
	return true;
}

bool Check_Calibrate_Status()
{
	int i;

	//为了通用硬件,必须返回true!
	return true;

	for( i=0; i<CS_ALL; i++ )
	{
		//if MATH,IOR,VOR,IROR,VROR,EOR 
		if(i==1)
		{	//Only care about MATH,VOR,VROR
			if( (Energy_Reg[i].Status&0x080000)!=0 )
				return false;
		}
		else
		{
			if( (Energy_Reg[i].Status&0x080000)!=0 )	//Change to only about MATH,EOR etc
				return false;
		}

		if( (Energy_Reg[i].Status&0x800000)==0 ) 
			return false;
	}
	return true;
}

bool Check_All_Data_Ready()
{
	BYTE i;
	DWORD dWord;
	
	for( i=0; i<CS_ALL; i++ )
	{
		TM_Read_CS5460( STATUS_REG, i, &dWord );
		if( (dWord&0x800000)==0 ) 
			return false;
	}
	return true;
}
void Clear_CS_Status()
{
	BYTE i;
	DWORD dWord;
	for( i=0; i<CS_ALL; i++ )
	{
		dWord=0xffffff;
		TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord);
	}
}
//设置转换
void Command_Convert()
{
	BYTE i;
	DWORD dWord;

	for( i=0; i<CS_ALL; i++)
	{
		dWord=0xffffff;
		TM_Write_CS5460( CONVERT, i, &dWord);
	}

}

void Read_CS_Sample()
{
	BYTE i;

	for( i=0; i<CS_ALL; i++)
	{
		
		//读取CS5460电能
		TM_Read_CS5460( E_REG, i, &Energy_Reg[i].E );

		//读取CS5460其他电量
		TM_Read_CS5460( P_REG, i, &Energy_Reg[i].P );
		TM_Read_CS5460( IRMS_REG, i, &Energy_Reg[i].Irms );
		TM_Read_CS5460( VRMS_REG, i, &Energy_Reg[i].Vrms );
		TM_Read_CS5460( MASK_REG, i, &Energy_Reg[i].Mask );

		//读取CS5460状态
		TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
	}

}


//校验运行中CS5460配置信息
//3
bool TM_Check_CS5460_Config(BYTE byWhich_CS)
{
	static ENERGY_REG Eng_Reg[3];
	BYTE i;

	if( byWhich_CS!=CS_ALL ) 
		return false;
	//CS5460配置信息(初始化)在Energy_Reg[i].Conf中
	for( i=0; i<CS_ALL; i++ )
	{
		//获取CS5460当前信息
		TM_Read_CS5460( CONFIG_REG, i, &Eng_Reg[i].Conf.Config );
		TM_Read_CS5460( IOFF_REG,	i, &Eng_Reg[i].Conf.Ioff );
		TM_Read_CS5460( IGN_REG,	i, &Eng_Reg[i].Conf.Ign );
		TM_Read_CS5460( VOFF_REG,	i, &Eng_Reg[i].Conf.Voff );
		TM_Read_CS5460( VGN_REG,	i, &Eng_Reg[i].Conf.Vgn );
		TM_Read_CS5460( IACOFF_REG,	i, &Eng_Reg[i].Conf.Iacoff );
		TM_Read_CS5460( VACOFF_REG,	i, &Eng_Reg[i].Conf.Vacoff );
		TM_Read_CS5460( POFF_REG,	i, &Eng_Reg[i].Conf.Poff );

		CrcMake( (BYTE *)&Eng_Reg[i].Conf, sizeof(CONFIG_5460)-sizeof(WORD) );	//Waaa 0916	
		if( Eng_Reg[i].Conf.wCRC != Energy_Reg[i].Conf.wCRC )
			return false;
	}
	return true;
}

//实际保存能量清0
void TM_Clear_Real_Energy()
{

	BYTE i;

	BYTE *pb=(BYTE*)&tDian_Liang;

	for( i=0; i<sizeof(DIAN_LIANG); i++ )
	{
		*pb++=0;
	}
	TM_Write_DS_Array( (char)(ENERGY_OFFSET), sizeof(DIAN_LIANG) ,
						(BYTE *)&tDian_Liang );
}

//读取CS5460状态
//3
bool TM_Read_CS5460_Status(BYTE byWhich_CS)
{
	BYTE i;
	if( byWhich_CS!=CS_ALL ) return false;

	for( i=0; i<3; i++ )
		TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
	return true;

}

void Deal_Energy();
void Convert_Raw_Ive();

//define for Degree Calibrate
#ifdef TEST_CS5460ABS
#define MAX_INDEX	32
const DWORD daDegree[MAX_INDEX+1]={\
				0x7e0000,0x780000,0x700000,0x680000,0x600000,0x580000,0x500000,0x480000,\
				0x400000,0x380000,0x300000,0x280000,0x200000,0x180000,0x100000,0x080000,\
				0x0,\
				0xf80000,0xf00000,0xe80000,0xe00000,0xd80000,0xd00000,0xc80000,0xc00000,\
				0xb80000,0xb00000,0xa80000,0xa00000,0x980000,0x900000,0x880000,0x800000};

typedef struct tagCALIBRATEDEGREETEMP
{
	BYTE byIndexMax[CS_ALL];
	BYTE byIndexMid[CS_ALL];
	BYTE byIndexMin[CS_ALL];
	DWORD dEMax[CS_ALL];
	DWORD dEMid[CS_ALL];
	DWORD dEMin[CS_ALL];
	bool bDone_Max[CS_ALL];
	bool bDone_Mid[CS_ALL];
	bool bDone_Min[CS_ALL];
	bool bDegreeOK[CS_ALL];
}CALIBRATEDEGREETEMP;

static CALIBRATEDEGREETEMP tDegree;

bool TM_CS_Set_Degree1(BYTE which_cs)
{
	int i;

	for( i=0; i<CS_ALL; i+=2 )
	{
		if(!tDegree.bDone_Min[i])
		{
			Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMin[i]]|0x000001;
		}
		else if(!tDegree.bDone_Max[i])
		{
			Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMax[i]] |0x000001;
		}
		else
		{
			Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMid[i]] |0x000001;
		}
		TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
	}

	//重新设置转换
	Command_Convert();

	return true;
}


////////////////////////// for every step/////////////////////////
#define INDEXSTART	0x28ul
#define INDEXEND    0x58ul
static DWORD dIndex=INDEXSTART;
static DWORD dE[CS_ALL][128];

DWORD Get_dDegree(DWORD dIn)
{
	//		40,60,	7f,		0,1f,	3f
	//128:  0 ~		3f ,	40 ~	7f
 
	if(dIn<=0x3f)
	{
		return ( (dIn+0x40ul)<<17 );
	}
	else if(dIn<0x80)
	{
		return ( (dIn-0x40ul)<<17 );
	}
	else
	{
		return (0x0ul);
	}
}
bool TM_CS_Set_Degree2(BYTE which_cs)
{
	int i;
	for( i=0; i<CS_ALL; i+=2 )
	{

		Energy_Reg[i].Conf.Config= Get_dDegree(dIndex) | 0x000001 ;

		TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
	}
	//重新设置转换
	Command_Convert();

	return true;
}
void Record_P2(void)
{
	int i;
	for (i=0; i<CS_ALL ; i+=2 )
	{
		dE[i][dIndex]+=Energy_Reg[i].E;
	}
}
DWORD dET[3],dINdex[3];
bool Judge_Degree2()
{
	int i,j;
	
	if( dIndex<INDEXSTART )
	{
		dIndex=INDEXSTART;
		return false;
	}
	if( dIndex<INDEXEND ) 
	{
		dIndex++;
		return false;
	}
	for(i=0;i<3;i+=2)
	{
		dET[i]=0;
		dINdex[i]=0;
		for ( j=INDEXSTART; j<INDEXEND; j++ )
		{
			if( dE[i][j]>dET[i] )
			{
				dET[i]=dE[i][j];
				dINdex[i]=j;
			}
		}
		Energy_Reg[i].Conf.Config= Get_dDegree(dINdex[i]) |0x000001;
		TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
	}
	return true;
}
void InitDegreeCalibrateBuffer2()
{
	int i,j;
	dIndex=INDEXSTART;
	for( i=0; i<CS_ALL; i++)
	{
		dET[i]=0;
		dINdex[i]=0x40;
		for( j=INDEXSTART; j<INDEXEND; j++ )
		{
			dE[i][j]=0;
		}
	}	
}
void InitDegreeCalibrateBuffer()
{
	int i;
	BYTE *pby=(BYTE *)&tDegree;

	for( i=0; i<sizeof(CALIBRATEDEGREETEMP); i++)
	{
		*(pby++)=0;
	}
	for( i=0; i<CS_ALL; i++ )
	{
		tDegree.byIndexMax[i]=MAX_INDEX;
		tDegree.byIndexMid[i]=MAX_INDEX/2;
	}
}
void Record_P()
{
	int i;
	for( i=0; i<CS_ALL; i+=2 )
	{
		if( !tDegree.bDone_Min[i] )
		{
			tDegree.dEMin[i]+=Energy_Reg[i].E;
		}
		else if( !tDegree.bDone_Max[i] ) 
		{
			tDegree.dEMax[i]+=Energy_Reg[i].E;
		}

⌨️ 快捷键说明

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