| 
 
| 小弟最近研究了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,执行连续周期计算
 }
 | 
 |