打印
[控制方法]

CS5464电能监控芯片

[复制链接]
1416|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinshiyouquan|  楼主 | 2014-5-2 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近研究了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,执行连续周期计算
}

相关帖子

沙发
yinshiyouquan|  楼主 | 2014-5-6 08:23 | 只看该作者
随便给CS5464_buf赋值,然后利用tmp = (CS5464_buf[0]<<16)|(CS5464_buf[1]<<8)|CS5464_buf[2]将数据读出,结果测试这种赋值方式有问题,读tmp数值与赋值不一样,我将这段代码做个变化,变化如下:
one =  CS5464_buf[0]*65535;
   two = CS5464_buf[1]*256;
   three = CS5464_buf[2]*2;
   tmp1 = one + two + three;
   tmp = (float)tmp1/0xffffff;
这样读tmp1的数值与赋值就相同

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝