**--------------文件信息-------------------------------------------------------------------------------
** 文件名称: EMU.c
** 创建日期: 2008-05-10
** 最终版本: 1.0
** 描 述: 数据处理函数库
********************************************************************************************************/
#include "config.h"
/*******************************************************************************************
** 函数名称: WriteEMU
** 函数描述: 对EMU中间接寄存器写操作
** 输入参数: sdar:要写入的寄存器的地址
*ptr:写入数据的首地址
** 输出参数: 无
*******************************************************************************************/
void WriteEMU_REG(uint8 sadr,__U32_U08 val)
{
EADR=0x00;
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
EDTAH=val.TBuf.buf2;
EDTAM=val.TBuf.buf1;
EDTAL=val.TBuf.buf0;
EADR=sadr|0x80;
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
}
/*******************************************************************************************
** 函数名称: ReadEMU
** 函数描述: 对EMU中间接寄存器读操作
** 输入参数: sdar:要读入的寄存器的地址
num :读入数组的字节数
datatype:数据类型,0:无符号型;1:有符合型
** 输出参数: rdata:返回寄存器的值
*******************************************************************************************/
__U32_U08 ReadEMU_REG(uint8 sadr)
{
__U32_U08 val;
val.val=0x00;
EADR=sadr&0x7F;
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
_nop_(); //一个NOP
val.TBuf.buf2=EDTAH;
val.TBuf.buf1=EDTAM;
val.TBuf.buf0=EDTAL;
return(val);
}
/*********************************************************************************************************
** 函数名称: Verify_EMUReg
** 功能描述: 校验并恢复EMU寄存器配置
** 入口参数: 无
** 出口参数: 无
********************************************************************************************************/
void Verify_EMUReg(void)
{
__U32_U08 regval;
if(EA==0) return;
if(Adjust_Param.crc!=Cal_CRC16((uint8 xdata *)&Adjust_Param,sizeof(Adjust_Param)-2))
{
Read_Adjust_Param();
}
regval=ReadEMU_REG(CHNLCR);
if((regval.TBuf.buf0&Bin(00011110))!=Bin(00011010))
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
Cal_L_Mode();
}
}
// if(((regval.TBuf.buf0&Bin(00011100))!=Bin(00011000))&&((regval.TBuf.buf0&Bin(00011100))!=Bin(00011100)))
// {
// if(gbReadEMUFlag)
// {
// gbReadEMUFlag=0;
// }
// else
// {
// if(cur_td==0x00)
// {
// Cal_L_Mode();
// }
// if(cur_td==0x55)
// {
// Cal_N_Mode();
// }
// }
// }
regval=ReadEMU_REG(GAIN);
if(regval.TBuf.buf0!=Bin(00000011))
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=0;
regval.TBuf.buf0=Bin(00000011);
WriteEMU_REG(GAIN,regval);
}
}
regval=ReadEMU_REG(CALMODE);
if((regval.TBuf.buf0&Bin(00000011))!=Bin(00000010))
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=0;
regval.TBuf.buf0=Bin(00000010);
WriteEMU_REG(CALMODE,regval); //使能内部基准
}
}
regval=ReadEMU_REG(W1GAIN);
if(regval.val!=Adjust_Param.w1gain)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.w1gain;
WriteEMU_REG(W1GAIN,regval);
WriteEMU_REG(Q1GAIN,regval);
WriteEMU_REG(S1GAIN,regval);
}
}
regval=ReadEMU_REG(P1CAL);
if(regval.val!=Adjust_Param.p1cal)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.p1cal;
WriteEMU_REG(P1CAL,regval);
}
}
regval=ReadEMU_REG(WATT1OS);
if(regval.val!=Adjust_Param.watt1os)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.watt1os;
WriteEMU_REG(WATT1OS,regval);
}
}
regval=ReadEMU_REG(IRMS1OS);
if(regval.val!=Adjust_Param.irms1os)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.irms1os;
WriteEMU_REG(IRMS1OS,regval);
}
}
// regval=ReadEMU_REG(W2GAIN);
// if(regval.val!=Adjust_Param.w2gain)
// {
// if(gbReadEMUFlag)
// {
// gbReadEMUFlag=0;
// }
// else
// {
// regval.val=Adjust_Param.w2gain;
// WriteEMU_REG(W2GAIN,regval);
// WriteEMU_REG(Q2GAIN,regval);
// WriteEMU_REG(S2GAIN,regval);
// }
// }
//
// regval=ReadEMU_REG(P2CAL);
// if(regval.val!=Adjust_Param.p2cal)
// {
// if(gbReadEMUFlag)
// {
// gbReadEMUFlag=0;
// }
// else
// {
// regval.val=Adjust_Param.p2cal;
// WriteEMU_REG(P2CAL,regval);
// }
// }
//
// regval=ReadEMU_REG(WATT2OS);
// if(regval.val!=Adjust_Param.watt2os)
// {
// if(gbReadEMUFlag)
// {
// gbReadEMUFlag=0;
// }
// else
// {
// regval.val=Adjust_Param.watt2os;
// WriteEMU_REG(WATT2OS,regval);
// }
// }
// regval=ReadEMU_REG(IRMS2OS);
// if(regval.val!=Adjust_Param.irms2os)
// {
// if(gbReadEMUFlag)
// {
// gbReadEMUFlag=0;
// }
// else
// {
// regval.val=Adjust_Param.irms2os;
// WriteEMU_REG(IRMS2OS,regval);
// }
// }
regval=ReadEMU_REG(I2GAIN);
if(regval.val!=0x00)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=0;
WriteEMU_REG(I2GAIN,regval);
}
}
regval=ReadEMU_REG(ICONT);
if(regval.val!=Adjust_Param.icont)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.icont;
WriteEMU_REG(ICONT,regval);
}
}
regval=ReadEMU_REG(SPTS);
if(regval.val!=Adjust_Param.spts)
{
if(gbReadEMUFlag)
{
gbReadEMUFlag=0;
}
else
{
regval.val=Adjust_Param.spts;
WriteEMU_REG(SPTS,regval);
}
}
if(EMUIE!=Bin(01001000)) //关闭无功脉冲输出,允许有功脉冲输出 使能有功脉冲输出中断
{ //bit6
EMUIE=Bin(01001000);
}
if((IEN1&Bin(00000001))==0) //使能PCF中断
{
IEN1|=Bin(00000001);
}
if(EMUSR!=Bin(11000000)) //打开ADC和DSP
{
EMUSR=Bin(11000000);
}
}
/*********************************************************************************************************
** 函数名称: Init_EMU
** 功能描述: 初始化EMU
** 入口参数: 无
** 出口参数: 无
********************************************************************************************************/
void Init_EMU(void)
{
Verify_EMUReg();
}
/*********************************************************************************************************
** 函数名称: Cal_L_Mode
** 功能描述: 使用L线计量
** 入口参数: 无
** 出口参数: 无
*********************************************************
EMU.zip_SOC_SinoWealth_emu 电表_中颖 电表_中颖计量
版权申诉
193 浏览量
2022-09-21
19:35:19
上传
评论
收藏 6KB ZIP 举报
周楷雯
- 粉丝: 79
- 资源: 1万+