{
BYTE buf[4];//=0;
#if 1
cs5463_rest_high();
DelayUs(5);
cs5463_rest_low();
DelayUs(100);
cs5463_rest_high(); //cs5463复位
#endif
// U16 i=0;
// U32 tmp;
SPI_SEL_CS5463();
DelayUs(1);
#if 10
buf[0]=0xff; //SYNC1
buf[1]=0xff; //SYNC1
buf[2]=0xff; //SYNC1
buf[3]=0xfe; //SYNC0
RtWriteCs5463(buf,4); // 3 1 1 0
//RtReadCs5463(offSet, buf1); //
#if 10
buf[0]=0x40;//WRITE|CONFIG;
buf[1]=0x01; //GI=1
buf[2]=0x10;
// buf[3]=0x61; //DCLK=MCLK/1,高通
buf[3]=0x68; //DCLK=MCLK/8,高通 ----Johnson--121106
RtWriteCs5463(buf,4); //写配置寄存器
buf[0]=WRITE|CYCLE_COUNT;
buf[1]=0x00;
// buf[2]=0x0F;//0x01; //每秒钟计算20 次,N=400
// buf[3]=0xA0;
buf[2]=0x01;
buf[3]=0xF4;//Computation cycle is 1024*500/DCLK ----Johnson--121106
RtWriteCs5463(buf,4); //写CYCLE COUNT 寄存器
/**************************************************/
//#ifndef NEW_CALIBRATION_METHOD
#if 0
SPI_UN_SEL_CS5463();
RT_Memory_ReadBuffer(EEOFFSET_CALI_MAGIC,buf,1);
SPI_SEL_CS5463();
//check if cs5463 calibrated, read calibration data from eeprom and set to cs5463!
if(CALI_MAGIC_VAL==buf[0])
{
//current ac offset!
SPI_UN_SEL_CS5463();
////init reference data from eeprom!
RT_Memory_ReadBuffer(EEOFFSET_110V_V_RMS, buf, 3);
//ConfigurationCcRpt(0xff, 9, CONFIGURATION_REPORT, buf-1, 4);
#if 0
gu32_110vRms=buf[0];
gu32_110vRms=(gu32_110vRms<<8)+buf[1];
gu32_110vRms=(gu32_110vRms<<8)+buf[2];
#else
memcpy((U8 *)&gu32_110vRms+1, buf, 3);
#endif
RT_Memory_ReadBuffer(EEOFFSET_220V_V_RMS, buf, 3);
#if 0
gu32_220vRms=buf[0];
gu32_220vRms=(gu32_220vRms<<8)+buf[1];
gu32_220vRms=(gu32_220vRms<<8)+buf[2];
#else
memcpy((U8 *)&gu32_220vRms+1, buf, 3);
#endif
RT_Memory_ReadBuffer(EEOFFSET_LVL_1_I_RMS, buf, 3);
#if 0
gu32_L1iRms=buf[0];
gu32_L1iRms=(gu32_L1iRms<<8)+buf[1];
gu32_L1iRms=(gu32_L1iRms<<8)+buf[2];
#else
memcpy((U8 *)&gu32_L1iRms+1, buf, 3);
#endif
RT_Memory_ReadBuffer(EEOFFSET_LVL_2_I_RMS, buf, 3);
#if 0
gu32_L2iRms=buf[0];
gu32_L2iRms=(gu32_L2iRms<<8)+buf[1];
gu32_L2iRms=(gu32_L2iRms<<8)+buf[2];
#else
memcpy((U8 *)&gu32_L2iRms+1, buf, 3);
#endif
////init reference data from eeprom! End!
RT_Memory_ReadBuffer(EEOFFSET_CURRENT_AC_OFFSET,buf+1,3);
SPI_SEL_CS5463();
DelayUs(0);
buf[0]=WRITE|CURRENT_AC_OFFSET;
RtWriteCs5463(buf,4); //电流 交流偏置 校准寄存器
//voltage ac offset!
SPI_UN_SEL_CS5463();
RT_Memory_ReadBuffer(EEOFFSET_VOLTAGE_AC_OFFSET,buf+1,3);
SPI_SEL_CS5463();
DelayUs(0);
buf[0]=WRITE|VOLTAGE_AC_OFFSET;
RtWriteCs5463(buf,4); //电压 交流偏置 校准寄存器
//voltage gain!
SPI_UN_SEL_CS5463();
RT_Memory_ReadBuffer(EEOFFSET_VOLTAGE_GAIN,buf+1,3);
SPI_SEL_CS5463();
buf[0]=WRITE|VOLTAGE_GAIN;
RtWriteCs5463(buf,4); //电压 交流偏置 校准寄存器
//current gain!
SPI_UN_SEL_CS5463();
RT_Memory_ReadBuffer(EEOFFSET_CURRENT_GAIN,buf+1,3);
SPI_SEL_CS5463();
buf[0]=WRITE|CURRENT_GAIN;
RtWriteCs5463(buf,4); //电压 交流偏置 校准寄存器
}
#else
buf[0]=WRITE|VOLTAGE_AC_OFFSET;
buf[1]=0x00;
buf[2]=0x00;
buf[3]=0x00;
RtWriteCs5463(buf,4);
buf[0]=WRITE|CURRENT_AC_OFFSET;
// buf[1]=0x00;
// buf[2]=0x00;
// buf[3]=0x00;
RtWriteCs5463(buf,4);
buf[0]=WRITE|CURRENT_GAIN;
buf[1]=0x40;
// buf[2]=0;
// buf[3]=0;
RtWriteCs5463(buf,4);
buf[0]=WRITE|VOLTAGE_GAIN;
buf[1]=0x40;
buf[2]=0;
buf[3]=0;
RtWriteCs5463(buf,4);
#endif
RtReadCs5463(OPERATIONAL_MODE_REG,buf); //写CYCLE COUNT 寄存器
buf[0]=WRITE|OPERATIONAL_MODE_REG;
buf[3]=buf[3]|0x60;//open high pass filter!
RtWriteCs5463(buf,4); //写CYCLE COUNT 寄存器
RtReadCs5463(STATUS,buf); //读状态寄存器
buf[0]=STATUS|WRITE;
RtWriteCs5463(buf,4); //写状态寄存器
buf[0]=TRANSFORM_START;
RtWriteCs5463(buf,1); //启动CS5460A
SPI_UN_SEL_CS5463();
#endif
/*--------校准过程--------------------
//清除DTDY,发送Power_halt 命令:
Clear_DRDY() ;
Wait_DRDY_High() ;
Clear_DRDY();
buf[0]=0xa0;
Write_CS5460A(buf,1); //发送POWER_HALT 命令
/*================================================
第一阶段:交流偏置校准,方法:将电流电压输入短接,
读偏置寄存器。
-------------------------------------------------/
//电流 交流偏置校准:
Clear_DRDY();
buf[0]=0xcd ;
Write_CS5460A(buf,1); //写校准命令寄存器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x20,buf); //读Iacoff 寄存器
glcdSetAddress(0,LINE1);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE1);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE1);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE1);
rprintfNum(16,2,FALSE,'0',buf[3]);
//电压 交流偏置校准:
Clear_DRDY();
buf[0]=0xd5 ;
Write_CS5460A(buf,1); //写校准命令寄存器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x22,buf); //读电压偏置寄存器
glcdSetAddress(0,LINE2);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE2);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE2);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE2);
rprintfNum(16,2,FALSE,'0',buf[3]);
/*=======================================================*/
/*====================================================
第二阶段:校准交流增益寄存器。方法:将电压和电流输入加
至满幅,读取增益寄存器的值。
-----------------------------------------------------/
//电流 交流增益校准:
Clear_DRDY();
buf[0]=0xce;
Write_CS5460A(buf,1); //写校准命令寄器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x04,buf);
glcdSetAddress(0,LINE1);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE1);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE1);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE1);
rprintfNum(16,2,FALSE,'0',buf[3]);
//电压 交流增益校准
Clear_DRDY();
buf[0]=0xd6;
Write_CS5460A(buf,1); //写校准命令寄器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x08,buf);
glcdSetAddress(0,LINE2);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE2);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE2);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE2);
rprintfNum(16,2,FALSE,'0',buf[3]);
/*===================================================*/
/*=====================================================
第三阶段:同上。
------------------------------------------------------/
//电流 直流偏置校准:
Clear_DRDY();
buf[0]=0xc9;
Write_CS5460A(buf,1); //写校准命令寄器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x02,buf);
glcdSetAddress(0,LINE1);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE1);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE1);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE1);
rprintfNum(16,2,FALSE,'0',buf[3]);
//电压 直流偏置校准
Clear_DRDY();
buf[0]=0xd1;
Write_CS5460A(buf,1); //写校准命令寄器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x06,buf);
glcdSetAddress(0,LINE2);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE2);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE2);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE2);
rprintfNum(16,2,FALSE,'0',buf[3]);
//功率 偏置校准
Clear_DRDY();
buf[0]=0xdd;
Write_CS5460A(buf,1); //写校准命令寄器
Wait_DRDY_High(); //等待校准完成
Read_CS5460A(0x12,buf);
glcdSetAddress(0,LINE3);
rprintfNum(16,2,FALSE,'0',buf[0]);
glcdSetAddress(24,LINE3);
rprintfNum(16,2,FALSE,'0',buf[1]);
glcdSetAddress(48,LINE3);
rprintfNum(16,2,FALSE,'0',buf[2]);
glcdSetAddress(72,LINE3);
rprintfNum(16,2,FALSE,'0',buf[3]);
/==================================================*/
#endif
}
上面是我的cs5463的初始化程序,程序基本上没什么问题了,现在我的一个问题了每当我对cs5463进行初始化以后,要等6s以后程序才可以测出正常的值。在前6s之前读到时的数都是00,有谁用过cs5463。是不 是cs5463初始化后必须等6s才可以正常读取测量值,有什么好的办法主初始化以后不要等这么长的时间现去读。我现在的应用不能等这么长时间的 |