以下是cs5464初始化的过程,在初始化完成后CS5464就可以使用了。
//CS5464寄存器
//寄存器0页
#define PAGE_REG 0X1F //页寄存器
#define CONFIG_REG 0X00 //配置寄存器
#define I1_REG 0X01 // 00001 通道1瞬时电流
#define V1_REG 0X02 // 00010 通道1瞬时电压
#define P1_REG 0x03 //00011 通道1瞬时功率
#define P1AVG_REG 0X04 //00100 通道1有功功率
#define I1RMS_REG 0X05 // 00101 通道1电流有效值
#define V1RMS_REG 0X06 //00110 通道1电压有效值
#define I2_REG 0X07 //00111 通道2瞬时电流
#define V2_REG 0X08 //01000 通道2瞬时电压
#define P2_REG 0X09 //01001 通道2瞬时功率
#define P2_AVG 0X0A //01010 通道2有功功率
#define I2RMS_REG 0X0B //01011 通道2电流有效值
#define V2RMS_REG 0X0C //01100 通道2电压有效值
#define Q1AVG_REG 0X0D //01101 通道1平均无功功率
#define Q1_REG 0X0E //01110 通道1瞬时无功功率
#define STATUS_REG 0X0F //01111 状态寄存器
#define Q2AVG_REG 0X10 //10000 通道2平均无功功率
#define Q2_REG 0X11 //10001 通道2瞬时无功功率
#define I1PEAK_REG 0X12 //10010 通道1峰值电流
#defineV1PEAK_REG 0X13 //10011 通道1峰值电压
#define S1_REG 0X14 //10100 通道1视在功率
#define PF1_REG 0X15 //10101 通道1功率因数
#defineI2PESK_REG 0X16 //10110 通道2峰值电流
#define V2PESK_REG 0X17 //10111 通道2峰值电压
#define S2_REG 0X18 //11000 通道2视在功率
#define PF2_REG 0X19 //11001 通道2功率因数
#define MASK_REG 0X1A //11010 中断屏蔽
#define T_REG 0X1B //11011 温度
#defineCTRL_REG 0X1C //11100 控制
#define EPULSE_REG 0X1D //11101 有功功率脉冲输出
#define SPULSE_REG 0X1E //11110 视在功率脉冲输出
#//define SPULSE_REG 0X1F //11111 无功功率脉冲输出
//寄存器1页
#define I1DCOFF_REG 0x00 //00000 通道1电流通道DC偏移
#define I1GAIN_REG 0X01 //00001 通道1电流通道增益
#define V1DCOFF_REG 0X02 //00010 通道1电压通道DC偏移
#define V1GAIN_REG 0X03 //00011 通道1电压通道增益
#define P1OFF_REG 0X04 //00100 通道1功率偏移
#define I1ACOFF_REG 0X05 //00101 通道1电流通道AC偏移
#define V1ACOFF_REG 0X06 //00110 通道1电压通道AC偏移
#define I2DCOFF_REG 0X07 //00111 通道2电流通道DC偏移
#define I2GAIN_REG 0X08 //01000 通道2电流通道增益
#define V2DCOFF_REG 0X09 //01001 通道2电压通道DC偏移
#define V2GAIN_REG 0X0A //01010 通道2电压通道增益
#define P2OFF_REG 0X0B //01011 通道2功率偏移
#define I2ACOFF_REG 0X0C //01100 通道2电流通道AC偏移
#define V2ACOFF_REG 0X0D //01101 通道2电压通道AC偏移
#define PW_REG 0X0E // 01110 脉冲输出宽度
#define PULSERATE_REG 0X0F //01111 脉冲输出速率
#define MODE_REG 0X10 //10000 模式控制
#define EPSILON_REG 0X11 //10001 在线电压频率的一个比率值
#define ICHANLEVEL_REG 0X12 //10010 Irms或能量通道选择转换电平
#define CYCLE_COUT_REG 0x13 //10011 一个计算周期的A/D转换数
#define Q1WB_REG 0X14 //10100 通道1三角无功功率
#define Q2WB_REG 0X15 //10101 通道2三角无功功率
#define TGAIN_REG 0X16 //10110 温度传感器增益
#define TOFF_REG 0X17 //10111 温度传感器偏移
#define EMIN_REG 0X18 //11000 能量通道选择最小运转电平
#define TSETTEL_REG 0X19 //11001 Tsettle 转换启动滤波器的处理时间
#define LOADMIN_REG 0X1A //11010 LoadMin 无负载门限
#define VFRMS_REG 0X1B //11011 电压RMS固定参考值
#define GAIN_RMS 0X1C //11100 G 系统增益
#define TIME_REG 0X1D //11101 Time 采样中的系统时间
#define V1SAGDUR_REG 0X00 //00000 通道1电压下跌持续时间
#define V1SAGLEVEL_REG 0X01 //00001 V1SAGlevel 通道1电压下跌电平
#define I1FAULTDUR_REG 0X04 //00100 通道1电流故障持续时间
#define I1FAULTLEVEL_REG 0X05 //00101 通道1电流故障电平
#define V2SAGDUR_REG 0X08 //01000 通道2电压下跌持续时间
#define V2SAGLEVEL_REG 0X09 //01001 通道2电压下跌电平
#define I2FAULTDUR_REG 0X0C //01100 I2Faultdur 通道2电流故障持续时间
#define I2FAULTLEVEL_REG 0X0D // 01101 I2Faultlevel 通道2电流故障电平
sbit CS5464_SDI = P2^3;
sbit CS5464_SDO = P2^2;
sbit CS5464_CLK = P2^1;
sbit CS5464_CS = P0^3;
sbit CS5464_INT = P0^7;
sbit CS5464_RET = P3^2;
void Init_CS5464(unsigned int n)
{
unsigned char dat[4];
CS5464_OFF_ST CS5464_OFFSET;
CS5464_CS=1;
_nop_();
_nop_();
CS5464_CS=0;
_nop_();
_nop_();
CS5464_RET = 0; //复位CS5460A
cs5464_para_read(&CS5464_OFFSET, sizeof(CS5464_OFFSET));
CS5464_MEA.meaPeriod = 400;
CS5464_RET = 1;
_nop_();
_nop_();
//写同步信号
dat[0] = 0xff; //SYNC1
dat[1] = 0xff;//SYNC1
dat[2] = 0xff;//SYNC1
dat[3] = 0xfe;//SYNC0
Write_CS5464(dat,4); //写同步 参见手册第4.3.2节,串口初始化
//写page0寄存器 0x1F值置为0
dat[0] = (PAGE_REG<<1)|0x40;
dat[1] = 0x00;
dat[2] = 0x00;
dat[3] = 0x00;
Write_CS5464(dat,4); //页寄存器置0
dat[0] = (CONFIG_REG<<1)|0x40; //写配置寄存器,配置寄存器地址0x00,写地址第6为置1。所以或0x40
dat[1] = 0x00;
dat[2] = 0x11; //中断形式:00-高电平、08-低电平、10-下降沿、18-上升沿
dat[3] = 0x01; //DCLK-MCLK/1
//写状态寄存器,清除所有状态
dat[0] = (STATUS_REG<<1)|0x40;
dat[1] = 0xFF;
dat[2] = 0xFF;
dat[3] = 0xFF;
Write_CS5464(dat,4); //清除状态寄存器
//写中断屏蔽寄存器
dat[0] = (MASK_REG<<1)|0x40;
dat[1] = 0xFF;
dat[2] = 0xFF;
dat[3] = 0xFF;
Write_CS5464(dat,4); //写屏蔽寄存器
dat[0] =(CTRL_REG<<1)|0x40; //控制寄存器
dat[1] = 0x00; //通道2电流相位补偿
dat[2] = 0x01; //增益范围250mV,停止E2PROM操作
dat[3] = 0x04; //
Write_CS5464(dat,4); //写控制寄存器
dat[0] = (PAGE_REG<<1)|0x40;
dat[1] = 0x00;
dat[2] = 0x00;
dat[3] = 0x01;
Write_CS5464(dat,4);
dat[0] = (CYCLE_COUT_REG<<1)|0x40;//周期寄存器
dat[1] = 0x00;
dat[2] = n>>8 ;
dat[3] = n&0x00FF; //每秒计算10次,N=400
Write_CS5464(dat,4); //写cycle count寄存器
//写通道1电流增益寄存器
dat[0]=(I1GAIN_REG<<1)|0x40;
dat[1] = 0x40; //增益1
dat[2] = 0x00;
dat[3] = 0x00;
Write_CS5464(dat,4);
//写通道1电压增益寄存器
dat[0] = (V1GAIN_REG<<1)|0x40;
dat[1] = 0x40; //增益1
dat[2] = 0x00;
dat[3] = 0x00;
Write_CS5464(dat,4);
//写通道2电流增益寄存器
dat[0]=(I2GAIN_REG<<1)|0x40;
dat[1] = 0x40; //增益1
dat[2] = 0x00;
dat[3] = 0x00;
Write_CS5464(dat,4);
//写通道2电压增益寄存器
dat[0] = (V2GAIN_REG<<1)|0x40;
dat[1] = 0x40; //增益1
dat[2] = 0x00;
dat[3] = 0x00;
Write_CS5464(dat,4);
//通道1电压通道DC偏移
dat[0] = (V1DCOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.V1_DCOFFSET[0];
dat[2] = CS5464_OFFSET.V1_DCOFFSET[1];
dat[3] = CS5464_OFFSET.V1_DCOFFSET[2];
Write_CS5464(dat,4);
//写通道1电压通道AC偏移
dat[0] = (V1ACOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.V1_ACOFFSET[0];
dat[2] = CS5464_OFFSET.V1_ACOFFSET[1];
dat[3] = CS5464_OFFSET.V1_ACOFFSET[2];
Write_CS5464(dat,4);
//写通道1电流通道DC偏移
dat[0] = (I1DCOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.I1_DCOFFSET[0];
dat[2] = CS5464_OFFSET.I1_DCOFFSET[1];
dat[3] = CS5464_OFFSET.I1_DCOFFSET[2];
Write_CS5464(dat,4);
//写通道1电流通道AC偏移
dat[0] = (I1ACOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.I1_ACOFFSET[0];
dat[2] = CS5464_OFFSET.I1_ACOFFSET[1];
dat[3] = CS5464_OFFSET.I1_ACOFFSET[2];
Write_CS5464(dat,4);
//写通道2电流通道DC偏移
dat[0] = (I2DCOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.I2_DCOFFSET[0];
dat[2] = CS5464_OFFSET.I2_DCOFFSET[1];
dat[3] = CS5464_OFFSET.I2_DCOFFSET[2];
Write_CS5464(dat,4);
//通道2电压通道DC偏移
dat[0] = (V2DCOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.V2_DCOFFSET[0];
dat[2] = CS5464_OFFSET.V2_DCOFFSET[1];
dat[3] = CS5464_OFFSET.V2_DCOFFSET[2];
Write_CS5464(dat,4);
//写通道2电流通道AC偏移
dat[0] = (I1ACOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.I2_ACOFFSET[0];
dat[2] = CS5464_OFFSET.I2_ACOFFSET[1];
dat[3] = CS5464_OFFSET.I2_ACOFFSET[2];
Write_CS5464(dat,4);
//写通道2电压通道AC偏移
dat[0] = (V2ACOFF_REG<<1)|0x40;
dat[1] = CS5464_OFFSET.V2_ACOFFSET[0];
dat[2] = CS5464_OFFSET.V2_ACOFFSET[1];
dat[3] = CS5464_OFFSET.V2_ACOFFSET[2];
Write_CS5464(dat,4);
}
1,首先CS5464必须首先复位,CS5464_CS=0使能,CS5464_RET=0然后CS5464_RET=1.校正同步信号,写3个0XFF和1个0xfe。校正了CS5464的读写时序的同步信号。
2,写CONFIG_REG寄存器,
3,清除STATUS_REG状态寄存器
4,写MASK_REG寄存器
5,写CTRL_REG寄存器
6,写CYCLE_COUT_REG寄存器,这个非常重要,cs5464每秒40000个采样点。
7,写电流增益I1GAIN_REG寄存器
8,写电压增益V1GAIN_REG寄存器
9,写电流I2GAIN_REG寄存器
10,写通道2电压增益寄存器
11,通道1电压通道DC偏移
12,写通道1电压通道AC偏移
13,写通道1电流通道DC偏移
14,写通道1电流通道AC偏移
15,写通道2电流通道DC偏移
16,通道2电压通道DC偏移
17,写通道2电流通道AC偏移
18,写通道2电压通道AC偏移