小弟最近研究了CS5464,碰到了一些问题,发出来请教下大家主要问题是:
寄存器的数值能够读取,但是我在读取有效电压寄存器数值(数值未经过处理),并在1602上显示时发现,读出的值老是在固定的四个数值变化,而读其它寄存器数值时候,也出现了数值间跳变,当我断开VIN ,IIN输入时候,数值就不会跳变,请问这是怎么回事,这是读写代码:
void voltage_manage() //电压处理
{
float VoltRMS; //
// VoltRMS = (int)VoltRMS ;
int xdata i,len,ch;
// unsigned long t;
unsigned long tmp;
static unsigned char str[9] = {0};
Read_CS5464(0x0c,CS5464_buf);
tmp = (CS5464_buf[0]<<16)|(CS5464_buf[1]<<8)|CS5464_buf[2];
//VoltRMS *= 0.00160;
//VoltRMS = (CS5464_buf[1]<<16)|(CS5464_buf[2]<<8)|CS5464_buf[3];
// VoltRMS = (float)t/0xffffff;
// if((buf[1]&0x80) != 0)
// VoltRMS-=1.000;
// VoltRMS *= 10000;
//VoltRMS*=500;
memset(str, 0x0, sizeof(str));
// tmp = (int)VoltRMS;
len = 1;
while(1)
{
tmp /= 10;
if(tmp == 0)
break;
len++;
}
tmp = (CS5464_buf[0]<<16)|(CS5464_buf[1]<<8)|CS5464_buf[2];
for(i=len-1;i>=0;i--)
{
ch = tmp % 10;
tmp = tmp / 10;
str[i] = ch+0x30;
}
LCD_display_string(8,1,str);
}
//写一个字节数据
void Write_CS5464_Byte(unsigned char temp)
{
unsigned char i;
CS5464_SCLK = 0;
for(i=0;i<8;i++) //循环8次 写入数据
{
CS5464_SCLK = 0;
//if(temp & 0x80) CS5464_SDI = 1;
//else CS5464_SDI = 0;
CS5464_SDI = (bit) (temp&0x80); //每次传输高字节
delay_US(50);
CS5464_SCLK = 1;
delay_US(20);
temp<<=1;
}
CS5464_SCLK = 0;
}
//******可选择写入一个命令字或者读寄存器名后加三个字节的内容****//
void Write_CS5464(unsigned char *ptr,unsigned char n)
{
unsigned char i;
CS5464_CS = 1;
delay_US(15);
CS5464_SCLK = 0;
delay_US(20);
CS5464_CS = 0;
for(i=0;i<n;i++)
{
Write_CS5464_Byte(*(ptr + i));
}
CS5464_SCLK = 0;
delay_US(10);
CS5464_CS = 1;
}
//读一个字节
unsigned char Read_CS5464_Byte()
{
unsigned int i;
unsigned char tmp=0;
for(i=0;i<7;i++) //循环8次 写入数据
{
//if(i == 7) CS5464_SDI = 0;
CS5464_SCLK = 0;
delay_MS(6);
//tmp <<= 1;
CS5464_SDI = 1; //发送SYS0同步命令0xFF高7位
CS5464_SCLK = 1;
if( CS5464_SDO ) tmp |= 0x80 >> i;
CS5464_SCLK = 0;
}
// CS5464_SDI = 1;
i=7;
CS5464_SCLK = 0;
delay_MS(6);
CS5464_SDI = 0; //发送SYS0同步命令0xFE高7位
CS5464_SCLK = 1;;
if( CS5464_SDO ) tmp |= 0x01;
return(tmp);
}
//读取寄存器数值
void Read_CS5464(unsigned char address,unsigned char *temp)
{
unsigned char i;
CS5464_CS = 1;
delay_US(10);
CS5464_SCLK = 0;
delay_US(10);
CS5464_CS = 0;
//static unsigned char tmp[4],k=0;
Write_CS5464_Byte(address);
for(i=0;i<3;i++)
{
*(temp+i) = Read_CS5464_Byte();
}
/*CS5464_buf[0] = Read_CS5464_Byte();
CS5464_buf[1] = Read_CS5464_Byte();
CS5464_buf[2] = Read_CS5464_Byte(); */
CS5464_SCLK = 0;
delay_US(10);
CS5464_CS = 1;
}
void Clear_DRDY()
{
CS5464_buf[0]=0x5e;
CS5464_buf[1]=0xff;
CS5464_buf[2]=0xff;
CS5464_buf[3]=0xff;
Write_CS5464(buf,4);
}
void Wait_DRDY_High()
{
while(1)
{
Read_CS5464(0x1e,CS5464_buf);
if( (CS5464_buf[0]&0x80) != 0 ) break;
}
}
void CS5464_write_page(unsigned char page)
{
CS5464_SCLK = 0;
delay_US(10);
CS5464_CS = 0;
Write_CS5464_Byte(0x7e);
delay_US(20);
Write_CS5464_Byte(page);
delay_US(20);
}
//*************CS5464初始化函数*********//
void Init_CS5464()
{
CS5464_CS = 0;
delay_US(10);
CS5464_RST = 0;
delay_MS(50); //复位30ms
CS5464_RST = 1;
delay_MS(80);
CS5464_buf[0]=0xff;//SYNC1
CS5464_buf[1]=0xff;//SYNC1
CS5464_buf[2]=0xff;//SYNC1
CS5464_buf[3]=0xff;//SYNC1
Write_CS5464(CS5464_buf,4);//多写几个SYNC1,有利于稳定,真正实现复位
CS5464_buf[0]=0xff;//SYNC1
CS5464_buf[1]=0xff;//SYNC1
CS5464_buf[2]=0xff;//SYNC1
CS5464_buf[3]=0xfe;//SYNC0
Write_CS5464(CS5464_buf,4);//写串口初始化//
CS5464_buf[0]=0x5e;
CS5464_buf[1]=0xff;
CS5464_buf[2]=0xff;
CS5464_buf[3]=0xff;
Write_CS5464(CS5464_buf,4);//清状态寄存器
CS5464_buf[0]=0x40;//写配置寄存器
CS5464_buf[1]=0x00;//相位补偿通道
CS5464_buf[2]=0x00;//中断形式:00-低电平 08-高电平 10-新中断低脉冲 18-新中断高脉冲
CS5464_buf[3]=0x01;//DLCK=MCLK/1 ,设置K = 1
Write_CS5464(CS5464_buf,4);
CS5464_buf[0]=0x74;
CS5464_buf[1]=0x00;
CS5464_buf[2]=0x00;
CS5464_buf[3]=0x00;
Write_CS5464(CS5464_buf,4);//写屏蔽中断寄存器 --全部屏蔽
CS5464_buf[0]=0x78;
CS5464_buf[1]=0x00;
CS5464_buf[2]=0x00;
CS5464_buf[3]=0x00;
Write_CS5464(CS5464_buf,4);//写控制寄存器
CS5464_write_page(0x01);//选择第一页
CS5464_buf[0]=0x66;
CS5464_buf[1]=0x00;
CS5464_buf[2]=0x00;
CS5464_buf[3]=0x64; //每秒计算1次,N=400
Write_CS5464(CS5464_buf,4);//写CYCLE COUNT寄存器
CS5464_write_page(0x01);//选择第一页
CS5464_buf[0]=0x60;//模式控制
CS5464_buf[1]=0x00;//电能驱动通道-1,VFIX参考电压为内部
CS5464_buf[2]=0x00;// E2输出模式为使能E1,
CS5464_buf[3]=0x01;//电压电流高通滤波器开启
Write_CS5464(CS5464_buf,4);
CS5464_buf[0]=0xe8;
Write_CS5464(CS5464_buf,1);//启动Cs5460,执行连续周期计算
} |