打印
[MCU]

关于cs5463初始化的问题

[复制链接]
2668|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
m564522634|  楼主 | 2013-12-5 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
{       
        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才可以正常读取测量值,有什么好的办法主初始化以后不要等这么长的时间现去读。我现在的应用不能等这么长时间的

相关帖子

沙发
ningling_21| | 2013-12-5 10:19 | 只看该作者
可以试试把初始化部分逐步减少一些内容,看看哪些步骤延迟了进入工作的时间...

使用特权

评论回复
板凳
m564522634|  楼主 | 2013-12-5 10:27 | 只看该作者
顶下了

使用特权

评论回复
地板
m564522634|  楼主 | 2013-12-6 17:15 | 只看该作者
其实就是一个转换精度与转换时间的一个取舍

使用特权

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

本版积分规则

26

主题

898

帖子

7

粉丝