zh9454的个人空间 https://bbs.21ic.com/?1105515 [收藏] [复制] [RSS]

日志

STM32&锐能微三相计量芯片RN8302驱动

已有 1443 次阅读2015-1-15 09:14 |个人分类:参考程序|系统分类:电测仪表

#ifndef __RN8302_H_
#define __RN8302_H_

#include "config.h"

#define STDUn                         220
#define STDIb                         5
#define CalVoltate 44000000         //220V电压下校表
#define CalCurrent 50000000         //5A 电流下校表
#define STDP               262260437        //标准的有功功率
#define STDP_05L         131130218        //标准的有功功率

#define RN8302_fosc         8000000        //晶振频率 标准 8192000

#define RN8302_ENABLE                      GPIO_ResetBits(GPIOA,GPIO_Pin_15)
#define RN8302_DISABLE              GPIO_SetBits(GPIOA,GPIO_Pin_15)

#define PinWrite_ADSCLK_1 GPIO_SetBits(GPIOB, GPIO_Pin_3)
#define PinWrite_ADSCLK_0 GPIO_ResetBits(GPIOB, GPIO_Pin_3)

#define PinWrite_ADSDI_1 GPIO_SetBits(GPIOB, GPIO_Pin_4)
#define PinWrite_ADSDI_0 GPIO_ResetBits(GPIOB, GPIO_Pin_4)

#define PinWrite_ADSDO_1 GPIO_SetBits(GPIOB, GPIO_Pin_5)
#define PinWrite_ADSDO_0 GPIO_ResetBits(GPIOB, GPIO_Pin_5)

#define PinRead_ADSDI GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)

#define RO  0x00
#define RW  0x01

#define bank0 0x00
#define bank1 0x01
#define bank2 0x02
#define bank3 0x03
#define bank4 0x04

#define WRENABLE           0xE5
#define WRDISABLE           0xDC
#define SAMPTEMPCLR         0x10                //50Hz采样,缓冲区清零
#define CLREMMIFH           0xFF                //清采样缓冲中断标志
#define CLREMMIFL           0xFF

#define SAMPSTART         0x20
#define WRENABLE         0xE5
#define SOFTRST           0xFA

#define EMMOD                   0xA2                //EMM模式
#define SLPMOD                 0x18
#define NVM1MOD                 0xE1
#define NVM2MOD                 0x5C

#define CHANNELEN        0xFF
#define ADCGAINVAL        0x00                //ADC 通道增益设定。电压通道1倍增益。
//#define HF6400                0x031F                        //6400常数
#define EGYRDMODVAL 0x40                //视在电能读取后清零。
#define LNWIREMODE         0x00        //三相四线接线模式。
#define LLWIREMODE         0x33        //三相三线接线模式。

#define GAIN_1  0x00
#define GAIN_2  0x01
#define GAIN_4  0x10
#define GAIN_8  0x11

//#define HFCONST1 0x39
//#define HFCONST0 0x07                        //测试常数
//#define HFCONST1 0xCE



typedef struct
{
        unsigned char bank;
        unsigned char addr;
        unsigned char bytenum;
  unsigned char rw;
  unsigned int  data;
}RegStructure;

//全波计量参数寄存器
typedef struct
{
        RegStructure        Ua_wave;
        RegStructure        Ub_wave;
        RegStructure        Uc_wave;
        RegStructure        Ia_wave;
        RegStructure        Ib_wave;
        RegStructure        Ic_wave;
        RegStructure        In_wave;
       
        RegStructure        Ua;
        RegStructure        Ub;
        RegStructure        Uc;
        RegStructure        USum_vector;
        RegStructure        Ia;
        RegStructure        Ib;
        RegStructure        Ic;
        RegStructure        In;
  
  RegStructure  Reserved1;
  
        RegStructure        ISum_vector;
  
  RegStructure        Ia_NVM1;
  RegStructure        Ib_NVM1;
  RegStructure        Ic_NVM1;
       
        RegStructure        Pa;
        RegStructure        Pb;
        RegStructure        Pc;
        RegStructure        Pt;
        RegStructure        Qa;
        RegStructure        Qb;
        RegStructure        Qc;
        RegStructure        Qt;
        RegStructure        Sa;
        RegStructure        Sb;
        RegStructure        Sc;
        RegStructure        St;
       
        RegStructure        Pfa;
        RegStructure        Pfb;
        RegStructure        Pfc;
        RegStructure        Pft;
  
  RegStructure        PAfCnt;
        RegStructure        PBfCnt;
        RegStructure        PCfCnt;
        RegStructure        PTfCnt;
  RegStructure        QAfCnt;
        RegStructure        QBfCnt;
        RegStructure        QCfCnt;
        RegStructure        QTfCnt;
  RegStructure        SAfCnt;
        RegStructure        SBfCnt;
        RegStructure        SCfCnt;
        RegStructure        STfCnt;
       
        RegStructure        EPa;
        RegStructure        EPb;
        RegStructure        EPc;
        RegStructure        EPt;
        RegStructure        PosEPa;
        RegStructure        PosEPb;
        RegStructure        PosEPc;
        RegStructure        PosEPt;
        RegStructure        NegEPa;
        RegStructure        NegEPb;
        RegStructure        NegEPc;
        RegStructure        NegEPt;
       
        RegStructure        EQa;
        RegStructure        EQb;
        RegStructure        EQc;
        RegStructure        EQt;
        RegStructure        PosEQa;
        RegStructure        PosEQb;
        RegStructure        PosEQc;
        RegStructure        PosEQt;
        RegStructure        NegEQa;
        RegStructure        NegEQb;
        RegStructure        NegEQc;
        RegStructure        NegEQt;
       
        RegStructure        ESa;
        RegStructure        ESb;
        RegStructure        ESc;
        RegStructure        ESt;
       
        RegStructure        STV;
        RegStructure        PfTV;
  RegStructure  STFVCnt;
        RegStructure        ESTV;       
}Full_wave_data;

//基波谐波计量参数寄存器
typedef struct
{
        RegStructure        YUa;
        RegStructure        YUb;
        RegStructure        YUc;
        RegStructure        YIa;
        RegStructure        YIb;
        RegStructure        YIc;
        RegStructure        YIn;
        RegStructure        UFrequence;
       
        RegStructure        FUa;
        RegStructure        FUb;
        RegStructure        FUc;
        RegStructure        FIa;
        RegStructure        FIb;
        RegStructure        FIc;
       
        RegStructure        FPa;
        RegStructure        FPb;
        RegStructure        FPc;
        RegStructure        FPt;
        RegStructure        FQa;
        RegStructure        FQb;
        RegStructure        FQc;
        RegStructure        FQt;
        RegStructure        FSa;
        RegStructure        FSb;
        RegStructure        FSc;
        RegStructure        FSt;
       
        RegStructure        FPfa;
        RegStructure        FPfb;
        RegStructure        FPfc;
        RegStructure        FPft;
       
        RegStructure        FPAFCnt;
        RegStructure        FPBFCnt;
        RegStructure        FPCFCnt;
        RegStructure        FPTFCnt;
        RegStructure        FQAFCnt;
        RegStructure        FQBFCnt;
        RegStructure        FQCFCnt;
        RegStructure        FQTFCnt;
        RegStructure        FSAFCnt;
        RegStructure        FSBFCnt;
        RegStructure        FSCFCnt;
        RegStructure        FSTFCnt;
       
        RegStructure        FEPa;
        RegStructure        FEPb;
        RegStructure        FEPc;
        RegStructure        FEPt;
        RegStructure        PoSFEPa;
        RegStructure        PoSFEPb;
        RegStructure        PoSFEPc;
        RegStructure        PoSFEPt;
        RegStructure        NegFEPa;
        RegStructure        NegFEPb;
        RegStructure        NegFEPc;
        RegStructure        NegFEPt;
       
        RegStructure        FEQa;
        RegStructure        FEQb;
        RegStructure        FEQc;
        RegStructure        FEQt;
        RegStructure        PoSFEQa;
        RegStructure        PoSFEQb;
        RegStructure        PoSFEQc;
        RegStructure        PoSFEQt;
        RegStructure        NegFEQa;
        RegStructure        NegFEQb;
        RegStructure        NegFEQc;
        RegStructure        NegFEQt;
       
        RegStructure        FESa;
        RegStructure        FESb;
        RegStructure        FESc;
        RegStructure        FESt;
       
        RegStructure        HUa;
        RegStructure        HUb;
        RegStructure        HUc;
        RegStructure        HIa;
        RegStructure        HIb;
        RegStructure        HIc;
       
        RegStructure        FSTV;
        RegStructure        FPfTV;
        RegStructure        FSTVFCnt;
        RegStructure        FESTV;
}Fundamental_wave_data;

typedef struct
{
        RegStructure        HFConst1;
        RegStructure        HFConst2;
        RegStructure        IStart_PS;
        RegStructure        IStart_Q;
        RegStructure        LostVoltT;
        RegStructure        ZXOT;
        RegStructure        PRTH1L;
        RegStructure        PRTH1H;
        RegStructure        PRTH2L;
        RegStructure        PRTH2H;
        RegStructure        IRegion3L;
        RegStructure        IRegion3H;

        RegStructure        PHSUA;
        RegStructure        PHSUB;
        RegStructure        PHSUC;

        RegStructure        PHSIA;
        RegStructure        PHSIB;
        RegStructure        PHSIC;
        RegStructure        PHSIN;
       
        RegStructure        GSUA;
        RegStructure        GSUB;
        RegStructure        GSUC;
        RegStructure        GSIA;
        RegStructure        GSIB;
        RegStructure        GSIC;
        RegStructure        GSIN;

        RegStructure        DCOS_UA;
        RegStructure        DCOS_UB;
        RegStructure        DCOS_UC;
        RegStructure        DCOS_IA;
        RegStructure        DCOS_IB;
        RegStructure        DCOS_IC;
        RegStructure        DCOS_IN;
       
        RegStructure        UA_OS;
        RegStructure        UB_OS;
        RegStructure        UC_OS;
        RegStructure        IA_OS;
        RegStructure        IB_OS;
        RegStructure        IC_OS;
        RegStructure        IN_OS;

        RegStructure        GPA;
        RegStructure        GPB;
        RegStructure        GPC;
        RegStructure        GQA;
        RegStructure        GQB;
        RegStructure        GQC;
        RegStructure        GSA;
        RegStructure        GSB;
        RegStructure        GSC;
       
        RegStructure        PA_PHSL;
        RegStructure        PB_PHSL;
        RegStructure        PC_PHSL;
        RegStructure        QA_PHSL;
        RegStructure        QB_PHSL;
        RegStructure        QC_PHSL;
       
        RegStructure        PA_OS;
        RegStructure        PB_OS;
        RegStructure        PC_OS;
        RegStructure        QA_OS;
        RegStructure        QB_OS;
        RegStructure        QC_OS;
       
        RegStructure        FUA_OS;
        RegStructure        FUB_OS;
        RegStructure        FUC_OS;
        RegStructure        FIA_OS;
        RegStructure        FIB_OS;
        RegStructure        FIC_OS;
       
        RegStructure        GFPA;
        RegStructure        GFPB;
        RegStructure        GFPC;
        RegStructure        GFQA;
        RegStructure        GFQB;
        RegStructure        GFQC;
        RegStructure        GFSA;
        RegStructure        GFSB;
        RegStructure        GFSC;
       
        RegStructure        FPA_PHS;
        RegStructure        FPB_PHS;
        RegStructure        FPC_PHS;
        RegStructure        FQA_PHS;
        RegStructure        FQB_PHS;       
        RegStructure        FQC_PHS;

        RegStructure        FPA_OS;
        RegStructure        FPB_OS;
        RegStructure        FPC_OS;
        RegStructure        FQA_OS;
        RegStructure        FQB_OS;
        RegStructure        FQC_OS;

        RegStructure        SAGCFG;
        RegStructure        OVLVL;
        RegStructure        OILVL;
  
        RegStructure        CFCFG;
        RegStructure        EMUCFG;
        RegStructure        EMUCON;
        RegStructure        WSAVECON;
        RegStructure        EMMIE;
        RegStructure        EMMIF;
        RegStructure        PQSign;
        RegStructure        Noload;
        RegStructure        IRegionS;
        RegStructure        PHASES;
        RegStructure        CheckSum1;

        RegStructure        NVM1CFG;
        RegStructure        NVM1IF;

        RegStructure        NVM2CFG;
        RegStructure        NVM2CMPA;
        RegStructure        NVM2CMPB;
        RegStructure        NVM2CMPC;
        RegStructure        NVM2IF;

        RegStructure        WREN;
        RegStructure        WMSW;
        RegStructure        SOFT_RST;
        RegStructure        ADCREG;
        RegStructure        MODSEL;

        RegStructure        SYSSR;
        RegStructure        CheckSum2 ;
        RegStructure        RData;
        RegStructure        WData;
        RegStructure        LRBufAddr;
        RegStructure        DeciceID;

        RegStructure        AUOTDC_EN;
        RegStructure        IN_WaveEN;
        RegStructure        PA_PHSM;
        RegStructure        PA_PHSH;
        RegStructure        PB_PHSM;
        RegStructure        PB_PHSH;
        RegStructure        PC_PHSM;
        RegStructure        PC_PHSH;

        RegStructure        QA_PHSM;
        RegStructure        QA_PHSH;
        RegStructure        QB_PHSM;
        RegStructure        QB_PHSH;
        RegStructure        QC_PHSM;
        RegStructure        QC_PHSH;
}Config_Stutas_REG;


struct RN_Coefficient
{
  unsigned short HFConst1;
  unsigned short HFConst2;
  unsigned short IStart_PS;
  unsigned short IStart_Q;
  unsigned short LostVoltT;
  unsigned short ZXOT;
  short GSUA;
  short GSUB;
  short GSUC;
  short GSIA;
  short GSIB;
  short GSIC;
  unsigned int PHSIA;
  unsigned int PHSIB;
  unsigned int PHSIC;
};

/////////////////////////////////////////////////////////////////////////////////

/*RN8302初始化*/
void RN8302Init(void);
/*RN8302读取刷新数据*/
void Refresh_AnalogData(void);
/*RN8302校正系数*/
void RN8302_Regulate(void);

extern Full_wave_data Fullwave_data;
extern Fundamental_wave_data Fundwave_data;
extern Config_Stutas_REG CFG_StatusREG;
extern struct RN_Coefficient RN8302_Coefficient;

#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "config.h"
#include "rn8302.h"
#include "spi.h"
#include  "tools.h"
#include "measurementdata.h"
#include
#include "systick.h"
#include "at45dbxx.h"

static uchar Rn8302_RX_Buf[10];
static uchar Rn8302_TX_Buf[10];

struct RN_Coefficient RN8302_Coefficient;

static ErrorStatus RN8302_TX_Frame(uchar num);
static ErrorStatus RN8302_RX_Frame(uchar num);
static uchar RN8302WR(RegStructure* dat);
static uchar RN8302RD(RegStructure* dat);
void RN8302_Regulate(void);

//*****注:结构体成员的单独赋值,需要编译器支持C99,默认支持C90****//

/******************************************************************************
                         RN8302全波计量参数定义及初始化
  ****************************************************************************/
Full_wave_data Fullwave_data = {

  .Ua_wave = {bank0,0x00,3,RO,0},
        .Ub_wave = {bank0,0x01,3,RO,0},
        .Uc_wave = {bank0,0x02,3,RO,0},
        .Ia_wave = {bank0,0x03,3,RO,0},
        .Ib_wave = {bank0,0x04,3,RO,0},
        .Ic_wave = {bank0,0x05,3,RO,0},
        .In_wave = {bank0,0x06,3,RO,0},
       
        .Ua = {bank0,0x07,4,RO,0},
        .Ub = {bank0,0x08,4,RO,0},
        .Uc = {bank0,0x09,4,RO,0},
        .USum_vector = {bank0,0x0A,4,RO,0},
        .Ia = {bank0,0x0B,4,RO,0},
        .Ib = {bank0,0x0C,4,RO,0},
        .Ic = {bank0,0x0D,4,RO,0},
        .In = {bank0,0x0E,4,RO,0},
  .Reserved1 = {bank0,0x0F,4,RO,0},
        .ISum_vector = {bank0,0x10,4,RO,0},

  .Ia_NVM1 = {bank0,0x11,3,RO,0},
  .Ib_NVM1 = {bank0,0x12,3,RO,0},
  .Ic_NVM1 = {bank0,0x13,3,RO,0},
       
        .Pa = {bank0,0x14,4,RO,0},
        .Pb = {bank0,0x15,4,RO,0},
        .Pc = {bank0,0x16,4,RO,0},
        .Pt = {bank0,0x17,4,RO,0},
        .Qa = {bank0,0x18,4,RO,0},
        .Qb = {bank0,0x19,4,RO,0},
        .Qc = {bank0,0x1A,4,RO,0},
        .Qt = {bank0,0x1B,4,RO,0},
        .Sa = {bank0,0x1C,4,RO,0},
        .Sb = {bank0,0x1D,4,RO,0},
        .Sc = {bank0,0x1E,4,RO,0},
        .St = {bank0,0x1F,4,RO,0},
       
        .Pfa = {bank0,0x20,3,RO,0},
        .Pfb = {bank0,0x21,3,RO,0},
        .Pfc = {bank0,0x22,3,RO,0},
        .Pft = {bank0,0x23,3,RO,0},
  
  .PAfCnt = {bank0,0x24,3,RW,0},
        .PBfCnt = {bank0,0x25,3,RW,0},
        .PCfCnt = {bank0,0x26,3,RW,0},
        .PTfCnt = {bank0,0x27,3,RW,0},
  .QAfCnt = {bank0,0x28,3,RW,0},
        .QBfCnt = {bank0,0x29,3,RW,0},
        .QCfCnt = {bank0,0x2A,3,RW,0},
        .QTfCnt = {bank0,0x2B,3,RW,0},
  .SAfCnt = {bank0,0x2C,3,RW,0},
        .SBfCnt = {bank0,0x2D,3,RW,0},
        .SCfCnt = {bank0,0x2E,3,RW,0},
        .STfCnt = {bank0,0x2F,3,RW,0},
       
        .EPa = {bank0,0x30,3,RO,0},
        .EPb = {bank0,0x31,3,RO,0},
        .EPc = {bank0,0x32,3,RO,0},
        .EPt = {bank0,0x33,3,RO,0},
        .PosEPa = {bank0,0x34,3,RO,0},
        .PosEPb = {bank0,0x35,3,RO,0},
        .PosEPc = {bank0,0x36,3,RO,0},
        .PosEPt = {bank0,0x37,3,RO,0},
        .NegEPa = {bank0,0x38,3,RO,0},
        .NegEPb = {bank0,0x39,3,RO,0},
        .NegEPc = {bank0,0x3A,3,RO,0},
        .NegEPt = {bank0,0x3B,3,RO,0},
       
        .EQa = {bank0,0x3C,3,RO,0},
        .EQb = {bank0,0x3D,3,RO,0},
        .EQc = {bank0,0x3E,3,RO,0},
        .EQt = {bank0,0x3F,3,RO,0},
        .PosEQa = {bank0,0x40,3,RO,0},
        .PosEQb = {bank0,0x41,3,RO,0},
        .PosEQc = {bank0,0x42,3,RO,0},
        .PosEQt = {bank0,0x43,3,RO,0},
        .NegEQa = {bank0,0x44,3,RO,0},
        .NegEQb = {bank0,0x45,3,RO,0},
        .NegEQc = {bank0,0x46,3,RO,0},
        .NegEQt = {bank0,0x47,3,RO,0},
       
        .ESa = {bank0,0x48,3,RO,0},
        .ESb = {bank0,0x49,3,RO,0},
        .ESc = {bank0,0x4A,3,RO,0},
        .ESt = {bank0,0x4B,3,RO,0},
       
        .STV = {bank0,0x4C,4,RO,0},
        .PfTV = {bank0,0x4D,3,RO,0},
  .STFVCnt = {bank0,0x4E,3,RW,0},
        .ESTV = {bank0,0x4F,3,RO,0}
};

/******************************************************************************
                         RN8302基波谐波计量参数定义及初始化
  ****************************************************************************/

Fundamental_wave_data Fundwave_data ={

  .YUa = {bank0,0x50,3,RO,0},
        .YUb = {bank0,0x51,3,RO,0},
        .YUc = {bank0,0x52,3,RO,0},
        .YIa = {bank0,0x53,3,RO,0},
        .YIb = {bank0,0x54,3,RO,0},
        .YIc = {bank0,0x55,3,RO,0},
        .YIn = {bank0,0x56,3,RO,0},
        .UFrequence = {bank0,0x57,3,RO,0},
       
        .FUa = {bank0,0x58,4,RO,0},
        .FUb = {bank0,0x59,4,RO,0},
        .FUc = {bank0,0x5A,4,RO,0},
        .FIa = {bank0,0x5B,4,RO,0},
        .FIb = {bank0,0x5C,4,RO,0},
        .FIc = {bank0,0x5D,4,RO,0},
       
        .FPa = {bank0,0x5E,4,RO,0},
        .FPb = {bank0,0x5F,4,RO,0},
        .FPc = {bank0,0x60,4,RO,0},
        .FPt = {bank0,0x61,4,RO,0},
        .FQa = {bank0,0x62,4,RO,0},
        .FQb = {bank0,0x63,4,RO,0},
        .FQc = {bank0,0x64,4,RO,0},
        .FQt = {bank0,0x65,4,RO,0},
        .FSa = {bank0,0x66,4,RO,0},
        .FSb = {bank0,0x67,4,RO,0},
        .FSc = {bank0,0x68,4,RO,0},
        .FSt = {bank0,0x69,4,RO,0},
       
        .FPfa = {bank0,0x6A,3,RO,0},
        .FPfb = {bank0,0x6B,3,RO,0},
        .FPfc = {bank0,0x6C,3,RO,0},
        .FPft = {bank0,0x6D,3,RO,0},
       
        .FPAFCnt = {bank0,0x6E,3,RW,0},
        .FPBFCnt = {bank0,0x6F,3,RW,0},
        .FPCFCnt = {bank0,0x70,3,RW,0},
        .FPTFCnt = {bank0,0x71,3,RW,0},
        .FQAFCnt = {bank0,0x72,3,RW,0},
        .FQBFCnt = {bank0,0x73,3,RW,0},
        .FQCFCnt = {bank0,0x74,3,RW,0},
        .FQTFCnt = {bank0,0x75,3,RW,0},
        .FSAFCnt = {bank0,0x76,3,RW,0},
        .FSBFCnt = {bank0,0x77,3,RW,0},
        .FSCFCnt = {bank0,0x78,3,RW,0},
        .FSTFCnt = {bank0,0x79,3,RW,0},
       
        .FEPa = {bank0,0x7A,3,RO,0},
        .FEPb = {bank0,0x7B,3,RO,0},
        .FEPc = {bank0,0x7C,3,RO,0},
        .FEPt = {bank0,0x7D,3,RO,0},
        .PoSFEPa = {bank0,0x7E,3,RO,0},
        .PoSFEPb = {bank0,0x7F,3,RO,0},
        .PoSFEPc = {bank0,0x80,3,RO,0},
        .PoSFEPt = {bank0,0x81,3,RO,0},
        .NegFEPa = {bank0,0x82,3,RO,0},
        .NegFEPb = {bank0,0x83,3,RO,0},
        .NegFEPc = {bank0,0x84,3,RO,0},
        .NegFEPt = {bank0,0x85,3,RO,0},
       
        .FEQa = {bank0,0x86,3,RO,0},
        .FEQb = {bank0,0x87,3,RO,0},
        .FEQc = {bank0,0x88,3,RO,0},
        .FEQt = {bank0,0x89,3,RO,0},
        .PoSFEQa = {bank0,0x8A,3,RO,0},
        .PoSFEQb = {bank0,0x8B,3,RO,0},
        .PoSFEQc = {bank0,0x8C,3,RO,0},
        .PoSFEQt = {bank0,0x8D,3,RO,0},
        .NegFEQa = {bank0,0x8E,3,RO,0},
        .NegFEQb = {bank0,0x8F,3,RO,0},
        .NegFEQc = {bank0,0x90,3,RO,0},
        .NegFEQt = {bank0,0x91,3,RO,0},
       
        .FESa = {bank0,0x92,3,RO,0},
        .FESb = {bank0,0x93,3,RO,0},
        .FESc = {bank0,0x94,3,RO,0},
        .FESt = {bank0,0x95,3,RO,0},
       
        .HUa = {bank0,0x96,4,RO,0},
        .HUb = {bank0,0x97,4,RO,0},
        .HUc = {bank0,0x98,4,RO,0},
        .HIa = {bank0,0x99,4,RO,0},
        .HIb = {bank0,0x9A,4,RO,0},
        .HIc = {bank0,0x9B,4,RO,0},
       
        .FSTV = {bank0,0x9C,4,RO,0},
        .FPfTV = {bank0,0x9D,3,RO,0},
        .FSTVFCnt = {bank0,0x9E,3,RW,0},
        .FESTV = {bank0,0x9F,3,RO,0},
};

/******************************************************************************
                   RN8302配置及状态参数定义及初始化
  ****************************************************************************/
Config_Stutas_REG CFG_StatusREG = {
  
          //EMM校表寄存器 I
        .HFConst1 = {bank1,0x00,2,RW,0},
        .HFConst2 = {bank1,0x01,2,RW,0},
        .IStart_PS = {bank1,0x02,2,RW,0},
        .IStart_Q = {bank1,0x03,2,RW,0},
        .LostVoltT = {bank1,0x04,2,RW,0},
        .ZXOT = {bank1,0x05,2,RW,0},
        .PRTH1L = {bank1,0x06,2,RW,0},
        .PRTH1H = {bank1,0x07,2,RW,0},
        .PRTH2L = {bank1,0x08,2,RW,0},
        .PRTH2H = {bank1,0x09,2,RW,0},
        .IRegion3L = {bank1,0x0A,2,RW,0},
        .IRegion3H = {bank1,0x0B,2,RW,0},

        .PHSUA = {bank1,0x0C,1,RW,0},
        .PHSUB = {bank1,0x0D,1,RW,0},
        .PHSUC = {bank1,0x0E,1,RW,0},

        .PHSIA = {bank1,0x0F,3,RW,0},
        .PHSIB = {bank1,0x10,3,RW,0},
        .PHSIC = {bank1,0x11,3,RW,0},
        .PHSIN = {bank1,0x12,1,RW,0},
       
        .GSUA = {bank1,0x13,2,RW,0},
        .GSUB = {bank1,0x14,2,RW,0},
        .GSUC = {bank1,0x15,2,RW,0},
        .GSIA = {bank1,0x16,2,RW,0},
        .GSIB = {bank1,0x17,2,RW,0},
        .GSIC = {bank1,0x18,2,RW,0},
        .GSIN = {bank1,0x19,2,RW,0},

        .DCOS_UA = {bank1,0x1A,2,RW,0},
        .DCOS_UB = {bank1,0x1B,2,RW,0},
        .DCOS_UC = {bank1,0x1C,2,RW,0},
        .DCOS_IA = {bank1,0x1D,2,RW,0},
        .DCOS_IB = {bank1,0x1E,2,RW,0},
        .DCOS_IC = {bank1,0x1F,2,RW,0},
        .DCOS_IN = {bank1,0x20,2,RW,0},
       
        .UA_OS = {bank1,0x21,2,RW,0},
        .UB_OS = {bank1,0x22,2,RW,0},
        .UC_OS = {bank1,0x23,2,RW,0},
        .IA_OS = {bank1,0x24,2,RW,0},
        .IB_OS = {bank1,0x25,2,RW,0},
        .IC_OS = {bank1,0x26,2,RW,0},
        .IN_OS = {bank1,0x27,2,RW,0},

        .GPA = {bank1,0x28,2,RW,0},
        .GPB = {bank1,0x29,2,RW,0},
        .GPC = {bank1,0x2A,2,RW,0},
        .GQA = {bank1,0x2B,2,RW,0},
        .GQB = {bank1,0x2C,2,RW,0},
        .GQC = {bank1,0x2D,2,RW,0},
        .GSA = {bank1,0x2E,2,RW,0},
        .GSB = {bank1,0x2F,2,RW,0},
        .GSC = {bank1,0x30,2,RW,0},
       
        .PA_PHSL = {bank1,0x31,2,RW,0},
        .PB_PHSL = {bank1,0x32,2,RW,0},
        .PC_PHSL = {bank1,0x33,2,RW,0},
        .QA_PHSL = {bank1,0x34,2,RW,0},
        .QB_PHSL = {bank1,0x35,2,RW,0},
        .QC_PHSL = {bank1,0x36,2,RW,0},
       
        .PA_OS = {bank1,0x37,2,RW,0},
        .PB_OS = {bank1,0x38,2,RW,0},
        .PC_OS = {bank1,0x39,2,RW,0},
        .QA_OS = {bank1,0x3A,2,RW,0},
        .QB_OS = {bank1,0x3B,2,RW,0},
        .QC_OS = {bank1,0x3C,2,RW,0},
       
        .FUA_OS = {bank1,0x3D,2,RW,0},
        .FUB_OS = {bank1,0x3E,2,RW,0},
        .FUC_OS = {bank1,0x3F,2,RW,0},
        .FIA_OS = {bank1,0x40,2,RW,0},
        .FIB_OS = {bank1,0x41,2,RW,0},
        .FIC_OS = {bank1,0x42,2,RW,0},
       
        .GFPA = {bank1,0x43,2,RW,0},
        .GFPB = {bank1,0x44,2,RW,0},
        .GFPC = {bank1,0x45,2,RW,0},
        .GFQA = {bank1,0x46,2,RW,0},
        .GFQB = {bank1,0x47,2,RW,0},
        .GFQC = {bank1,0x48,2,RW,0},
        .GFSA = {bank1,0x49,2,RW,0},
        .GFSB = {bank1,0x4A,2,RW,0},
        .GFSC = {bank1,0x4B,2,RW,0},
       
        .FPA_PHS = {bank1,0x4C,2,RW,0},
        .FPB_PHS = {bank1,0x4D,2,RW,0},
        .FPC_PHS = {bank1,0x4E,2,RW,0},
        .FQA_PHS = {bank1,0x4F,2,RW,0},
        .FQB_PHS = {bank1,0x50,2,RW,0},       
        .FQC_PHS = {bank1,0x51,2,RW,0},

        .FPA_OS = {bank1,0x52,2,RW,0},
        .FPB_OS = {bank1,0x53,2,RW,0},
        .FPC_OS = {bank1,0x54,2,RW,0},
        .FQA_OS = {bank1,0x55,2,RW,0},
        .FQB_OS = {bank1,0x56,2,RW,0},
        .FQC_OS = {bank1,0x57,2,RW,0},

        .SAGCFG = {bank1,0x58,2,RW,0},
        .OVLVL = {bank1,0x59,2,RW,0},
        .OILVL = {bank1,0x5A,2,RW,0},
       
        //EMM配置和状态寄存器
        .CFCFG = {bank1,0x60,3,RW,0},
        .EMUCFG = {bank1,0x61,3,RW,0},
        .EMUCON = {bank1,0x62,3,RW,0},
        .WSAVECON = {bank1,0x63,1,RW,0},
        .EMMIE = {bank1,0x64,2,RW,0},
        .EMMIF = {bank1,0x65,2,RO,0},
        .PQSign = {bank1,0x66,2,RO,0},
        .Noload = {bank1,0x67,2,RO,0},
        .IRegionS = {bank1,0x68,2,RO,0},
        .PHASES = {bank1,0x69,2,RO,0},
        .CheckSum1 = {bank1,0x6A,2,RO,0},

        //NVM1配置和状态寄存器
        .NVM1CFG = {bank1,0x70,1,RW,0},
        .NVM1IF = {bank1,0x71,1,RO,0},

        //NVM2配置和状态寄存器
        .NVM2CFG = {bank1,0x72,2,RW,0},
        .NVM2CMPA = {bank1,0x73,2,RW,0},
        .NVM2CMPB = {bank1,0x74,2,RW,0},
        .NVM2CMPC = {bank1,0x75,2,RW,0},
        .NVM2IF = {bank1,0x76,1,RO,0},

        //系统配置寄存器
        .WREN = {bank1,0x80,1,RW,0},
        .WMSW = {bank1,0x81,1,RW,0},
        .SOFT_RST = {bank1,0x82,1,RW,0},
        .ADCREG = {bank1,0x83,2,RW,0},
        .MODSEL = {bank1,0x86,1,RW,0},

        //系统状态寄存器
        .SYSSR = {bank1,0x8A,2,RO,0},
        .CheckSum2  = {bank1,0x8B,2,RO,0},
        .RData = {bank1,0x8C,4,RO,0},
        .WData = {bank1,0x8D,3,RO,0},
        .LRBufAddr = {bank1,0x8E,2,RO,0},
        .DeciceID = {bank1,0x8F,3,RO,0},

        //EMM校表寄存器 II
        .AUOTDC_EN = {bank1,0x91,2,RW,0},
        .IN_WaveEN = {bank1,0x94,2,RW,0},
        .PA_PHSM = {bank1,0xB0,3,RW,0},
        .PA_PHSH = {bank1,0xB1,3,RW,0},
        .PB_PHSM = {bank1,0xB2,3,RW,0},
        .PB_PHSH = {bank1,0xB3,3,RW,0},
        .PC_PHSM = {bank1,0xB4,3,RW,0},
        .PC_PHSH = {bank1,0xB5,3,RW,0},

        .QA_PHSM = {bank1,0xB6,3,RW,0},
        .QA_PHSH = {bank1,0xB7,3,RW,0},
        .QB_PHSM = {bank1,0xB8,3,RW,0},
        .QB_PHSH = {bank1,0xB9,3,RW,0},
        .QC_PHSM = {bank1,0xBA,3,RW,0},
        .QC_PHSH = {bank1,0xBB,3,RW,0},
};


/******************************************************************************
  * *   函数名称: Refresh_AnalogData()
  * *         函数说明: 读取RN8302中的数据,刷新数据
  * *          输入参数:       
  *        *          输出参数:       
  * *                  返回值:       
  ****************************************************************************/
void Refresh_AnalogData()
{

  if(RN8302RD(&CFG_StatusREG.DeciceID))g_deviceInfo.wDeviceStatus1 &= 0xffff^DS1_ErrorRN8302;
  else g_deviceInfo.wDeviceStatus1 |= DS1_ErrorRN8302;
  RN8302RD(&CFG_StatusREG.HFConst1);
  RN8302RD(&CFG_StatusREG.HFConst2);
  RN8302RD(&CFG_StatusREG.IStart_PS);
  RN8302RD(&CFG_StatusREG.IStart_Q);
  RN8302RD(&CFG_StatusREG.LostVoltT);
  RN8302RD(&CFG_StatusREG.ZXOT);
  RN8302RD(&CFG_StatusREG.PHSUA);
  RN8302RD(&CFG_StatusREG.PHSUB);
  RN8302RD(&CFG_StatusREG.PHSUC);
  RN8302RD(&CFG_StatusREG.PHSIA);
  RN8302RD(&CFG_StatusREG.PHSIB);
  RN8302RD(&CFG_StatusREG.PHSIC);
  RN8302RD(&CFG_StatusREG.PHSIN);
  
  RN8302RD(&CFG_StatusREG.GSUA);
  RN8302RD(&CFG_StatusREG.GSUB);
  RN8302RD(&CFG_StatusREG.GSUC);
  
  RN8302RD(&CFG_StatusREG.CFCFG);
  RN8302RD(&CFG_StatusREG.EMUCFG);
  RN8302RD(&CFG_StatusREG.EMUCON);
  RN8302RD(&CFG_StatusREG.CheckSum1);
  
  RN8302RD(&CFG_StatusREG.NVM1CFG);
  RN8302RD(&CFG_StatusREG.NVM2CFG);
  RN8302RD(&CFG_StatusREG.NVM2CMPA);
  RN8302RD(&CFG_StatusREG.NVM2CMPB);
  RN8302RD(&CFG_StatusREG.NVM2CMPC);
  RN8302RD(&CFG_StatusREG.WMSW);
  RN8302RD(&CFG_StatusREG.ADCREG);
  RN8302RD(&CFG_StatusREG.DeciceID);
  RN8302RD(&CFG_StatusREG.SYSSR);
  RN8302RD(&CFG_StatusREG.CheckSum2);
  RN8302RD(&Fullwave_data.Ub);
  


  //////////////////////////////////////////////////////////////////////////////////////////////////////
  ////基波数据
  if(RN8302RD(&Fullwave_data.Ua))g_AnalogData.wDataUa = Fullwave_data.Ua.data/2000;
  if(RN8302RD(&Fullwave_data.Ub))g_AnalogData.wDataUb = Fullwave_data.Ub.data/2000;
  if(RN8302RD(&Fullwave_data.Uc))g_AnalogData.wDataUc = Fullwave_data.Uc.data/2000;
  
  if(RN8302RD(&Fullwave_data.Ia))g_AnalogData.wDataIa = Fullwave_data.Ia.data;
  if(RN8302RD(&Fullwave_data.Ib))g_AnalogData.wDataIb = Fullwave_data.Ib.data;
  if(RN8302RD(&Fullwave_data.Ic))g_AnalogData.wDataIc = Fullwave_data.Ic.data;
  if(RN8302RD(&Fullwave_data.In))g_AnalogData.wDataIn = Fullwave_data.In.data;
  
  if(RN8302RD(&Fullwave_data.Pa))g_AnalogData.wDataPa = Fullwave_data.Pa.data;
  if(RN8302RD(&Fullwave_data.Pb))g_AnalogData.wDataPb = Fullwave_data.Pb.data;
  if(RN8302RD(&Fullwave_data.Pc))g_AnalogData.wDataPc = Fullwave_data.Pc.data;
  
  if(RN8302RD(&Fullwave_data.Qa))g_AnalogData.wDataQa = Fullwave_data.Qa.data;
  if(RN8302RD(&Fullwave_data.Qb))g_AnalogData.wDataQb = Fullwave_data.Qb.data;
  if(RN8302RD(&Fullwave_data.Qc))g_AnalogData.wDataQc = Fullwave_data.Qc.data;
  
  if(RN8302RD(&Fullwave_data.Sa))g_AnalogData.wDataSa = Fullwave_data.Sa.data;
  if(RN8302RD(&Fullwave_data.Sb))g_AnalogData.wDataSb = Fullwave_data.Sb.data;
  if(RN8302RD(&Fullwave_data.Sc))g_AnalogData.wDataSc = Fullwave_data.Sc.data;
  
  if(RN8302RD(&Fullwave_data.Pfa))g_AnalogData.wDataPa = Fullwave_data.Pfa.data;
  if(RN8302RD(&Fullwave_data.Pfb))g_AnalogData.wDataPb = Fullwave_data.Pfb.data;
  if(RN8302RD(&Fullwave_data.Pfc))g_AnalogData.wDataPc = Fullwave_data.Pfc.data;
  
  if(RN8302RD(&Fullwave_data.Pt))g_AnalogData.wDataP = Fullwave_data.Pt.data;
  if(RN8302RD(&Fullwave_data.Qt))g_AnalogData.wDataQ = Fullwave_data.Qt.data;
  if(RN8302RD(&Fullwave_data.St))g_AnalogData.wDataS = Fullwave_data.St.data;
  if(RN8302RD(&Fullwave_data.Pft))g_AnalogData.wDataPF = Fullwave_data.Pft.data;
  
  if(RN8302RD(&Fullwave_data.EPa))g_AnalogData.wDataEPa = Fullwave_data.EPa.data;
  if(RN8302RD(&Fullwave_data.EPb))g_AnalogData.wDataEPb = Fullwave_data.EPb.data;
  if(RN8302RD(&Fullwave_data.EPc))g_AnalogData.wDataEPc = Fullwave_data.EPc.data;
  if(RN8302RD(&Fullwave_data.EPt))g_AnalogData.wDataEPt = Fullwave_data.EPt.data;
  if(RN8302RD(&Fullwave_data.PosEPa))g_AnalogData.wDataPosEPa = Fullwave_data.PosEPa.data;
  if(RN8302RD(&Fullwave_data.PosEPb))g_AnalogData.wDataPosEPb = Fullwave_data.PosEPb.data;
  if(RN8302RD(&Fullwave_data.PosEPc))g_AnalogData.wDataPosEPc = Fullwave_data.PosEPc.data;
  if(RN8302RD(&Fullwave_data.PosEPt))g_AnalogData.wDataPosEPt = Fullwave_data.PosEPt.data;
  if(RN8302RD(&Fullwave_data.NegEPa))g_AnalogData.wDataNegEPa = Fullwave_data.NegEPa.data;
  if(RN8302RD(&Fullwave_data.NegEPb))g_AnalogData.wDataNegEPb = Fullwave_data.NegEPb.data;
  if(RN8302RD(&Fullwave_data.NegEPc))g_AnalogData.wDataNegEPc = Fullwave_data.NegEPc.data;
  if(RN8302RD(&Fullwave_data.NegEPt))g_AnalogData.wDataNegEPt = Fullwave_data.NegEPt.data;
  
  if(RN8302RD(&Fullwave_data.EQa))g_AnalogData.wDataEQa = Fullwave_data.EQa.data;
  if(RN8302RD(&Fullwave_data.EQb))g_AnalogData.wDataEQb = Fullwave_data.EQb.data;
  if(RN8302RD(&Fullwave_data.EQc))g_AnalogData.wDataEQc = Fullwave_data.EQc.data;
  if(RN8302RD(&Fullwave_data.EQt))g_AnalogData.wDataEQt = Fullwave_data.EQt.data;
  if(RN8302RD(&Fullwave_data.PosEQa))g_AnalogData.wDataPosEQa = Fullwave_data.PosEQa.data;
  if(RN8302RD(&Fullwave_data.PosEQb))g_AnalogData.wDataPosEQb = Fullwave_data.PosEQb.data;
  if(RN8302RD(&Fullwave_data.PosEQc))g_AnalogData.wDataPosEQc = Fullwave_data.PosEQc.data;
  if(RN8302RD(&Fullwave_data.PosEQt))g_AnalogData.wDataPosEQt = Fullwave_data.PosEQt.data;
  if(RN8302RD(&Fullwave_data.NegEQa))g_AnalogData.wDataNegEQa = Fullwave_data.NegEQa.data;
  if(RN8302RD(&Fullwave_data.NegEQb))g_AnalogData.wDataNegEQb = Fullwave_data.NegEQb.data;
  if(RN8302RD(&Fullwave_data.NegEQc))g_AnalogData.wDataNegEQc = Fullwave_data.NegEQc.data;
  if(RN8302RD(&Fullwave_data.NegEQt))g_AnalogData.wDataNegEQt = Fullwave_data.NegEQt.data;
  
  if(RN8302RD(&Fullwave_data.ESa))g_AnalogData.wDataESa = Fullwave_data.ESa.data;
  if(RN8302RD(&Fullwave_data.ESb))g_AnalogData.wDataESb = Fullwave_data.ESb.data;
  if(RN8302RD(&Fullwave_data.ESc))g_AnalogData.wDataESc = Fullwave_data.ESc.data;
  if(RN8302RD(&Fullwave_data.ESt))g_AnalogData.wDataESt = Fullwave_data.ESt.data;
  
  if(RN8302RD(&Fullwave_data.STV))g_AnalogData.wDataSTV = Fullwave_data.STV.data;
  if(RN8302RD(&Fullwave_data.PfTV))g_AnalogData.wDataPfTV = Fullwave_data.PfTV.data;
  if(RN8302RD(&Fullwave_data.ESTV))g_AnalogData.wDataESTV = Fullwave_data.ESTV.data;
  
  
  if(RN8302RD(&Fullwave_data.USum_vector))g_AnalogData.wData3U0 = Fullwave_data.USum_vector.data;
  if(RN8302RD(&Fullwave_data.ISum_vector))g_AnalogData.wData3I0 = Fullwave_data.ISum_vector.data;
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(RN8302RD(&Fundwave_data.YUa))g_AnalogData.wDataYUa = Fundwave_data.YUa.data;
  if(RN8302RD(&Fundwave_data.YUb))g_AnalogData.wDataYUb = Fundwave_data.YUb.data;
  if(RN8302RD(&Fundwave_data.YUc))g_AnalogData.wDataYUc = Fundwave_data.YUc.data;
  if(RN8302RD(&Fundwave_data.YIa))g_AnalogData.wDataYIa = Fundwave_data.YIa.data;
  if(RN8302RD(&Fundwave_data.YIb))g_AnalogData.wDataYIb = Fundwave_data.YIb.data;
  if(RN8302RD(&Fundwave_data.YIc))g_AnalogData.wDataYIc = Fundwave_data.YIc.data;
  if(RN8302RD(&Fundwave_data.YIn))g_AnalogData.wDataYIn = Fundwave_data.YIn.data;
  
  if(RN8302RD(&Fundwave_data.UFrequence))g_AnalogData.wDataF = 8000000*8*10/(Fundwave_data.UFrequence.data/100);
  
  if(RN8302RD(&Fundwave_data.FUa))g_AnalogData.wDataFUa = Fundwave_data.FUa.data;
  if(RN8302RD(&Fundwave_data.FUb))g_AnalogData.wDataFUb = Fundwave_data.FUb.data;
  if(RN8302RD(&Fundwave_data.FUc))g_AnalogData.wDataFUc = Fundwave_data.FUc.data;
  if(RN8302RD(&Fundwave_data.FIa))g_AnalogData.wDataFIa = Fundwave_data.FIa.data;
  if(RN8302RD(&Fundwave_data.FIb))g_AnalogData.wDataFIb = Fundwave_data.FIb.data;
  if(RN8302RD(&Fundwave_data.FIc))g_AnalogData.wDataFIc = Fundwave_data.FIc.data;
  
  if(RN8302RD(&Fundwave_data.FPa))g_AnalogData.wDataFPa = Fundwave_data.FPa.data;
  if(RN8302RD(&Fundwave_data.FPb))g_AnalogData.wDataFPb = Fundwave_data.FPb.data;
  if(RN8302RD(&Fundwave_data.FPc))g_AnalogData.wDataFPc = Fundwave_data.FPc.data;
  if(RN8302RD(&Fundwave_data.FPt))g_AnalogData.wDataFPt = Fundwave_data.FPt.data;
  
  if(RN8302RD(&Fundwave_data.FQa))g_AnalogData.wDataFQa = Fundwave_data.FQa.data;
  if(RN8302RD(&Fundwave_data.FQb))g_AnalogData.wDataFQb = Fundwave_data.FQb.data;
  if(RN8302RD(&Fundwave_data.FQc))g_AnalogData.wDataFQc = Fundwave_data.FQc.data;
  if(RN8302RD(&Fundwave_data.FQt))g_AnalogData.wDataFQt = Fundwave_data.FQt.data;
  
  if(RN8302RD(&Fundwave_data.FSa))g_AnalogData.wDataFSa = Fundwave_data.FSa.data;
  if(RN8302RD(&Fundwave_data.FSb))g_AnalogData.wDataFSb = Fundwave_data.FSb.data;
  if(RN8302RD(&Fundwave_data.FSc))g_AnalogData.wDataFSc = Fundwave_data.FSc.data;
  if(RN8302RD(&Fundwave_data.FSt))g_AnalogData.wDataFSt = Fundwave_data.FSt.data;
  
  if(RN8302RD(&Fundwave_data.FPfa))g_AnalogData.wDataFPfa = Fundwave_data.FPfa.data;
  if(RN8302RD(&Fundwave_data.FPfb))g_AnalogData.wDataFPfb = Fundwave_data.FPfb.data;
  if(RN8302RD(&Fundwave_data.FPfc))g_AnalogData.wDataFPfc = Fundwave_data.FPfc.data;
  if(RN8302RD(&Fundwave_data.FPft))g_AnalogData.wDataFPft = Fundwave_data.FPft.data;
  
  if(RN8302RD(&Fundwave_data.FEPa))g_AnalogData.wDataFEPa = Fundwave_data.FEPa.data;
  if(RN8302RD(&Fundwave_data.FEPb))g_AnalogData.wDataFEPb = Fundwave_data.FEPb.data;
  if(RN8302RD(&Fundwave_data.FEPc))g_AnalogData.wDataFEPc = Fundwave_data.FEPc.data;
  if(RN8302RD(&Fundwave_data.FEPt))g_AnalogData.wDataFEPt = Fundwave_data.FEPt.data;
  if(RN8302RD(&Fundwave_data.PoSFEPa))g_AnalogData.wDataPoSFEPa = Fundwave_data.PoSFEPa.data;
  if(RN8302RD(&Fundwave_data.PoSFEPb))g_AnalogData.wDataPoSFEPb = Fundwave_data.PoSFEPb.data;
  if(RN8302RD(&Fundwave_data.PoSFEPc))g_AnalogData.wDataPoSFEPc = Fundwave_data.PoSFEPc.data;
  if(RN8302RD(&Fundwave_data.PoSFEPt))g_AnalogData.wDataPoSFEPt = Fundwave_data.PoSFEPt.data;
  if(RN8302RD(&Fundwave_data.NegFEPa))g_AnalogData.wDataNegFEPa = Fundwave_data.NegFEPa.data;
  if(RN8302RD(&Fundwave_data.NegFEPb))g_AnalogData.wDataNegFEPb = Fundwave_data.NegFEPb.data;
  if(RN8302RD(&Fundwave_data.NegFEPc))g_AnalogData.wDataNegFEPc = Fundwave_data.NegFEPc.data;
  if(RN8302RD(&Fundwave_data.NegFEPt))g_AnalogData.wDataNegFEPt = Fundwave_data.NegFEPt.data;
  
  if(RN8302RD(&Fundwave_data.FEQa))g_AnalogData.wDataFEQa = Fundwave_data.FEQa.data;
  if(RN8302RD(&Fundwave_data.FEQb))g_AnalogData.wDataFEQb = Fundwave_data.FEQb.data;
  if(RN8302RD(&Fundwave_data.FEQc))g_AnalogData.wDataFEQc = Fundwave_data.FEQc.data;
  if(RN8302RD(&Fundwave_data.FEQt))g_AnalogData.wDataFEQt = Fundwave_data.FEQt.data;
  if(RN8302RD(&Fundwave_data.PoSFEQa))g_AnalogData.wDataPoSFEQa = Fundwave_data.PoSFEQa.data;
  if(RN8302RD(&Fundwave_data.PoSFEQb))g_AnalogData.wDataPoSFEQb = Fundwave_data.PoSFEQb.data;
  if(RN8302RD(&Fundwave_data.PoSFEQc))g_AnalogData.wDataPoSFEQc = Fundwave_data.PoSFEQc.data;
  if(RN8302RD(&Fundwave_data.PoSFEQt))g_AnalogData.wDataPoSFEQt = Fundwave_data.PoSFEQt.data;
  if(RN8302RD(&Fundwave_data.NegFEQa))g_AnalogData.wDataNegFEQa = Fundwave_data.NegFEQa.data;
  if(RN8302RD(&Fundwave_data.NegFEQb))g_AnalogData.wDataNegFEQb = Fundwave_data.NegFEQb.data;
  if(RN8302RD(&Fundwave_data.NegFEQc))g_AnalogData.wDataNegFEQc = Fundwave_data.NegFEQc.data;
  if(RN8302RD(&Fundwave_data.NegFEQt))g_AnalogData.wDataNegFEQt = Fundwave_data.NegFEQt.data;
  
  if(RN8302RD(&Fundwave_data.FESa))g_AnalogData.wDataFESa = Fundwave_data.FESa.data;
  if(RN8302RD(&Fundwave_data.FESb))g_AnalogData.wDataFESb = Fundwave_data.FESb.data;
  if(RN8302RD(&Fundwave_data.FESc))g_AnalogData.wDataFESc = Fundwave_data.FESc.data;
  if(RN8302RD(&Fundwave_data.FESt))g_AnalogData.wDataFESt = Fundwave_data.FESt.data;
  
  
  //////谐波数据
  if(RN8302RD(&Fundwave_data.HUa))g_AnalogData.wDataHUa = Fundwave_data.HUa.data;
  if(RN8302RD(&Fundwave_data.HUb))g_AnalogData.wDataHUb = Fundwave_data.HUb.data;
  if(RN8302RD(&Fundwave_data.HUc))g_AnalogData.wDataHUc = Fundwave_data.HUc.data;
  if(RN8302RD(&Fundwave_data.HIa))g_AnalogData.wDataHIa = Fundwave_data.HIa.data;
  if(RN8302RD(&Fundwave_data.HIb))g_AnalogData.wDataHIb = Fundwave_data.HIb.data;
  if(RN8302RD(&Fundwave_data.HIc))g_AnalogData.wDataHIc = Fundwave_data.HIc.data;
  
  if(RN8302RD(&Fundwave_data.FSTV))g_AnalogData.wDataFSTV = Fundwave_data.FSTV.data;
  if(RN8302RD(&Fundwave_data.FPfTV))g_AnalogData.wDataFPfTV = Fundwave_data.FPfTV.data;
  if(RN8302RD(&Fundwave_data.FESTV))g_AnalogData.wDataFESTV = Fundwave_data.FESTV.data;
}


/******************************************************************************
  * *   函数名称: RN8302Init(void)
  * *         函数说明: RN8302初始化函数,恢复增益、相位校正系数,表常数等
  * *          输入参数:       
  *        *          输出参数:       
  * *                  返回值:       
  ****************************************************************************/
void RN8302Init(void)
{
  //写使能
  CFG_StatusREG.WREN.data = WRENABLE;
  RN8302WR(&CFG_StatusREG.WREN);
  
  //软件复位,会清除写使能
  CFG_StatusREG.SOFT_RST.data = SOFTRST;
  RN8302WR(&CFG_StatusREG.SOFT_RST);
  
  Delay_ms(20);
  
  //写使能
  CFG_StatusREG.WREN.data = WRENABLE;
  RN8302WR(&CFG_StatusREG.WREN);
  RN8302RD(&CFG_StatusREG.WREN);
  
  //GAIN_1/GAIN_2/GAIN_4/GAIN_8
  //ADC通道增益设置-----------------IN-----------IC----------IB---------IA---------UC---------UB--------UA---
  CFG_StatusREG.ADCREG.data = GAIN_1<<12|GAIN_1<<10|GAIN_1<<8|GAIN_1<<6|GAIN_1<<4|GAIN_1<<2|GAIN_1;
  RN8302WR(&CFG_StatusREG.ADCREG);
  CFG_StatusREG.ADCREG.data = 0;

  //能量寄存器读后清零
  CFG_StatusREG.EMUCFG.data = 0x400000;
  RN8302WR(&CFG_StatusREG.EMUCFG);
  CFG_StatusREG.EMUCFG.data = 0;
  
  //计量控制寄存器,用于使能各相有功、无功、基波、谐波电能计量
  CFG_StatusREG.EMUCON.data = 0x777777;
  RN8302WR(&CFG_StatusREG.EMUCON);
  CFG_StatusREG.EMUCON.data = 0;

  //RN8302_Regulate();
  AT45DB0XReadBlock(EEPROMADDR_RN8302COF,(WORD*)&RN8302_Coefficient,MYSIZEOF(RN8302_Coefficient));
  //系数恢复
  CFG_StatusREG.HFConst1.data = RN8302_Coefficient.HFConst1;
  RN8302WR(&CFG_StatusREG.HFConst1);
  CFG_StatusREG.HFConst1.data = 0;
  
  CFG_StatusREG.HFConst2.data = RN8302_Coefficient.HFConst2;
  RN8302WR(&CFG_StatusREG.HFConst2);
  CFG_StatusREG.HFConst2.data = 0;
  
//以下校准A相参数
  CFG_StatusREG.GSUA.data = RN8302_Coefficient.GSUA;
  RN8302WR(&CFG_StatusREG.GSUA);
  CFG_StatusREG.GSUA.data = 0;
  
        //CFG_StatusREG.GSIA.data =  RN8302_Coefficient.GSIA;
  //  RN8302WR(&CFG_StatusREG.GSIA);
// CFG_StatusREG.GSIA.data = 0;
  
        //CFG_StatusREG.PHSIA.data  = RN8302_Coefficient.PHSIA;
//   RN8302WR(&CFG_StatusREG.PHSIA);
// CFG_StatusREG.PHSIA.data = 0;
//以下校准B相参数
  CFG_StatusREG.GSUB.data = RN8302_Coefficient.GSUB;
    RN8302WR(&CFG_StatusREG.GSUB);
  CFG_StatusREG.GSUB.data = 0;
  
        //CFG_StatusREG.GSIB.data =  RN8302_Coefficient.GSIB;
  //  RN8302WR(&CFG_StatusREG.GSIB);
// CFG_StatusREG.GSIB.data = 0;
  
        //CFG_StatusREG.PHSIB.data  = RN8302_Coefficient.PHSIB;
  //  RN8302WR(&CFG_StatusREG.PHSIB);
// CFG_StatusREG.PHSIB.data = 0;
//以下校准C相参数
  CFG_StatusREG.GSUC.data = RN8302_Coefficient.GSUC;
    RN8302WR(&CFG_StatusREG.GSUC);
  CFG_StatusREG.GSUC.data = 0;
  
        //CFG_StatusREG.GSIC.data =  RN8302_Coefficient.GSIC;
  //  RN8302WR(&CFG_StatusREG.GSIC);
  //CFG_StatusREG.GSIC.data = 0;
  
        //CFG_StatusREG.PHSIC.data  = RN8302_Coefficient.PHSIC;
   // RN8302WR(&CFG_StatusREG.PHSIC);
  //CFG_StatusREG.PHSIC.data = 0;
  
  
  //选择计量EMM模式
//  CFG_StatusREG.WMSW.data= EMMOD;
//  RN8302WR(&CFG_StatusREG.WMSW);
  
  //写保护
  CFG_StatusREG.WREN.data = WRDISABLE;
  RN8302WR(&CFG_StatusREG.WREN);
}

/**************************************
Vu=324mv,1倍增益,Vipp=300mV 适应2In的范围。如果小电流精度达不到要求,可以放弃2In要求。
Vu/800*2^27 详细计算查看手册
Vi/800*2^27
Vu,Vi均为有效值
U标准=44000000,   I标准=50000000    P=262260437
HFconst=0x3CFC   6400imp/kwh
***************************************/
static short RN8302CALRMS(RegStructure* datUI,RegStructure* datGain,unsigned int CalREF)
{
  int temp;
        unsigned short caldata;
        float ERR,ERRTEMP;
  
  RN8302RD(datUI);        //读A相电压有效值寄存器,4个字节长
  temp = datUI->data;
        temp =temp - CalREF;
        ERR = ((float)temp)/CalREF;
        ERRTEMP =-ERR/(1+ERR);
        if(ERRTEMP>=0)
                caldata = (short)(ERRTEMP*32768);
        else
                caldata = (short)(65536+ ERRTEMP*32768);
  
  return caldata;
}

static unsigned int RN8302CALLAANG(RegStructure* datP,RegStructure* datPH)
{
  float ERRP,Angle;
        unsigned int caldata;

  RN8302RD(datP);
  ERRP = ((float)(datP->data - STDP_05L))/STDP_05L;
  Angle = (float)asin(-ERRP/1.732);

        caldata =0x80+Angle/0.0175178;
  return caldata;
}

static unsigned short RN8302CALHF(unsigned short EC)
{
  unsigned short  HFConst;
  float temp1 ;
        float temp2;
  float  temp3;
        temp1 = 32*EC*STDUn*STDIb;
        temp2 = STDP/temp1;
  temp3 = ((float)3600000/256)*((float)8000000/256)/(1024*32) ;
  HFConst = (unsigned short)(temp2*temp3);
  
  return  (unsigned short)HFConst;
}

/******************************************************************************
  * *   函数名称: RN8302_Regulate(void)
  * *         函数说明: RN8302校表程序,并更新系数
  * *          输入参数:        num 帧字节数
  *        *          输出参数:       
  * *                  返回值:        校验结果,正确返回1,错误返回0
  ****************************************************************************/
void RN8302_Regulate(void)
{

    CFG_StatusREG.GSUA.data = 0;
  RN8302WR(&CFG_StatusREG.GSUA);
//以下校准B相参数
  CFG_StatusREG.GSUB.data = 0;
    RN8302WR(&CFG_StatusREG.GSUB);
//以下校准C相参数
  CFG_StatusREG.GSUC.data = 0;
    RN8302WR(&CFG_StatusREG.GSUC);
  Delay_ms(500);
//以下校准常数
        RN8302_Coefficient.HFConst1=(unsigned short)RN8302CALHF(6400);
  RN8302_Coefficient.HFConst2=(unsigned short)RN8302CALHF(6400);
        RN8302_Coefficient.ZXOT= 0x73;                //增加过零阀值设置,防止频率测试值跳变。
//以下校准A相参数
        RN8302_Coefficient.GSUA=RN8302CALRMS(&Fullwave_data.Ua,&CFG_StatusREG.GSUA,CalVoltate);
        RN8302_Coefficient.GSIA=RN8302CALRMS(&Fullwave_data.Ia,&CFG_StatusREG.GSIA,CalCurrent);
        RN8302_Coefficient.PHSIA=(unsigned int)RN8302CALLAANG(&Fullwave_data.Pa,&Fundwave_data.YIa);
//以下校准B相参数
        RN8302_Coefficient.GSUB=RN8302CALRMS(&Fullwave_data.Ub,&CFG_StatusREG.GSUB,CalVoltate);
        RN8302_Coefficient.GSIB=RN8302CALRMS(&Fullwave_data.Ib,&CFG_StatusREG.GSIB,CalCurrent);
        RN8302_Coefficient.PHSIB=(unsigned int)RN8302CALLAANG(&Fullwave_data.Pb,&Fundwave_data.YIb);
//以下校准C相参数
        RN8302_Coefficient.GSUC=RN8302CALRMS(&Fullwave_data.Uc,&CFG_StatusREG.GSUC,CalVoltate);
        RN8302_Coefficient.GSIC=RN8302CALRMS(&Fullwave_data.Ic,&CFG_StatusREG.GSIC,CalCurrent);
        RN8302_Coefficient.PHSIC=(unsigned int)RN8302CALLAANG(&Fullwave_data.Pc,&Fundwave_data.YIc);
  
  AT45DB0XWriteBlock(EEPROMADDR_RN8302COF,(WORD*)&RN8302_Coefficient,MYSIZEOF(RN8302_Coefficient));
  
  RN8302Init();
  //FLAG.uFRAM |= ((unsigned int)1<<FCOEF);

}

/*----------------------------------------------------------------------------*/
/*----------------底层函数(包括模拟SPI和硬件SPI,模拟的备用)-------------------*/
/*----------------------------------------------------------------------------*/

/******************************************************************************
  * *   函数名称: Spi_SendByte(uchar dat)
  * *         函数说明: 模拟SPI发送数据
  * *          输入参数:        dat 发送的数据
  *        *          输出参数:       
  * *                  返回值:       
  ****************************************************************************/
static void RN8302_Spi_SendByte(uchar dat)
{
  u8 i;
       
        for(i=0;i<8;i++)
        {
                PinWrite_ADSCLK_1;
                if(dat & 0x80)
                {
                        PinWrite_ADSDO_1;
                }
                else
                {
      PinWrite_ADSDO_0;
                }
                PinWrite_ADSCLK_0;
                dat <<= 1;
        }
        PinWrite_ADSDO_1;
}

/******************************************************************************
  * *   函数名称: Spi_SendByte(uchar dat)
  * *         函数说明: 模拟SPI接收数据
  * *          输入参数:       
  *        *          输出参数:       
  * *                  返回值:        接收的数据字节
  ****************************************************************************/
static uchar  RN8302_Spi_ReadByte()
{
    u8 i,B=0;
    for(i=0;i<8;i++)
    {
        B<<=1;
                    PinWrite_ADSCLK_1;
        PinWrite_ADSCLK_0;
        if (PinRead_ADSDI){B=B+0x1;}
    }
    return        B;
}

/*----------------------------------------------------------------------------*/
/*----------------底层函数--------------硬件SPI读写函数------------------------*/
/*----------------------------------------------------------------------------*/

/******************************************************************************
  * *   函数名称: RN8302WR(RegStructure* dat)
  * *         函数说明: 向RN8302指定的寄存器中写数据
  * *          输入参数:        RegStructure* dat,指定的寄存器结构指针
  *        *          输出参数:       
  * *                  返回值:       
  ****************************************************************************/
static uchar RN8302WR(RegStructure* dat)
{
  uchar data1,data2,data3;
  uchar check;
  if(dat->rw == RO)return ERROR;
  switch(dat->bytenum)
  {
     case 1:
            data1 = dat->data & 0xff;
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x80|(dat->bank<<4);
            Rn8302_TX_Buf[2] = data1;
            check = RN8302_TX_Frame(3);
            break;
            
     case 2:
            data1 = (dat->data>>8) & 0xff;
            data2 = dat->data & 0xff;
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x80|(dat->bank<<4);
            Rn8302_TX_Buf[2] = data1;
            Rn8302_TX_Buf[3] = data2;
            check = RN8302_TX_Frame(4);
            break;
     case 3:
            data1 = (dat->data>>16) & 0xff;
            data2 = (dat->data>>8) & 0xff;
            data3 = dat->data & 0xff;
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x80|(dat->bank<<4);
            Rn8302_TX_Buf[2] = data1;
            Rn8302_TX_Buf[3] = data2;
            Rn8302_TX_Buf[4] = data3;
            check = RN8302_TX_Frame(5);
            break;
     default:break;
  }
  return check;
}

/******************************************************************************
  * *   函数名称: RN8302RD(RegStructure* dat)
  * *         函数说明: 从RN8302指定的寄存器中读取数据
  * *          输入参数:        RegStructure* dat,指定的寄存器结构指针
  *        *          输出参数:       
  * *                  返回值:        校验结果,正确返回1,错误返回0
  ****************************************************************************/
static uchar RN8302RD(RegStructure* dat)
{
  uchar check = 0;
  if(dat->rw != RO && dat->rw != RW)return 0;
  switch(dat->bytenum)
  {
      case 1:
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x00|(dat->bank<<4);
            check = RN8302_RX_Frame(1);
            if(check)dat->data = Rn8302_RX_Buf[0];
            break;
            
     case 2:
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x00|(dat->bank<<4);
            check = RN8302_RX_Frame(2);
            if(check)dat->data = Rn8302_RX_Buf[0]<<8|Rn8302_RX_Buf[1];
            break;
     case 3:
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x00|(dat->bank<<4);
            check = RN8302_RX_Frame(3);
            if(check)dat->data = Rn8302_RX_Buf[0]<<16|Rn8302_RX_Buf[1]<<8|Rn8302_RX_Buf[2];
            break;
     case 4:
            Rn8302_TX_Buf[0] = dat->addr;
            Rn8302_TX_Buf[1] = 0x00|(dat->bank<<4);
            check = RN8302_RX_Frame(4);
            if(check)dat->data = Rn8302_RX_Buf[0]<<24|Rn8302_RX_Buf[1]<<16|Rn8302_RX_Buf[2]<<8|Rn8302_RX_Buf[3];
            break;
     default:break;
  }
  return check;
}

/******************************************************************************
  * *   函数名称: RN8302_TX_Frame(uchar num)
  * *         函数说明: 向8302中发送一帧数据,Rn8302_TX_Buf发送缓冲区
  * *          输入参数:        num 帧字节数
  *        *          输出参数:       
  * *                  返回值:       
  ****************************************************************************/
static ErrorStatus RN8302_TX_Frame(uchar num)
{
  uchar i,Repeat,temp;
  uchar checksum = 0;
  uchar* p;
  ErrorStatus        err = SUCCESS;
  
  RN8302_ENABLE;
  
  for(Repeat=3;Repeat>0;Repeat--)
  {
    p = Rn8302_TX_Buf;
    for(i=0;i<num;i++)
    {
      Spi_RN8302_SendByte(*p);
      checksum += *p;
      p++;
    }
    checksum = ~checksum;
   
    Spi_RN8302_SendByte(checksum);
   
   
//读WData寄存器检查-----------------------  
    Spi_RN8302_SendByte( 0x8D);
                checksum = 0x8D;
                temp = 0x10;                       
                Spi_RN8302_SendByte( temp );
                checksum += temp;
                for(i = 3 ; i > 0 ; i--)
                {
                        temp = Spi_RN8302_ReadByte();
      if((num-2)>=i)
      {        
        if(temp != Rn8302_TX_Buf[num-i])
        {
          err = ERROR;
          break;       
        }
      }
                        checksum += temp;
                }
                if(err == SUCCESS)
    {
             checksum = ~checksum;
             temp = Spi_RN8302_ReadByte();   
       if(temp != checksum)  err = ERROR;
    }       
                if(err == SUCCESS)
    {
      if(num-2 == 3)CFG_StatusREG.WData.data =  Rn8302_TX_Buf[2]<<16|Rn8302_TX_Buf[3]<<8|Rn8302_TX_Buf[4];
      else if(num-2 == 2)CFG_StatusREG.WData.data =  Rn8302_TX_Buf[2]<<8|Rn8302_TX_Buf[3];
      else if(num-2 == 1)CFG_StatusREG.WData.data =  Rn8302_TX_Buf[2];
      break;
    }     
  }
  RN8302_DISABLE;
  return(err);
}


/******************************************************************************
  * *   函数名称: RN8302_RX_Frame(uchar num)
  * *         函数说明: 从8302中读取一帧数据,Rn8302_RX_Buf接收缓冲区
  * *          输入参数:        num 帧字节数
  *        *          输出参数:       
  * *                  返回值:        校验结果,正确返回1,错误返回0
  ****************************************************************************/
static ErrorStatus RN8302_RX_Frame(uchar num)
{

  uchar i,Repeat,temp;
  uchar checksum = 0;
  uchar* p;
  ErrorStatus err = SUCCESS;
  
  RN8302_ENABLE;
  
  for(Repeat=3;Repeat>0;Repeat--)
  {
    p = Rn8302_RX_Buf;
    Spi_RN8302_SendByte(Rn8302_TX_Buf[0]);
    checksum = Rn8302_TX_Buf[0];
    Spi_RN8302_SendByte(Rn8302_TX_Buf[1]);
    checksum += Rn8302_TX_Buf[1];

    for(i=0;i<num;i++)
    {
      *p= Spi_RN8302_ReadByte();
      checksum += *p;
      p++;
    }
    checksum =~checksum;
   
    if(checksum != Spi_RN8302_ReadByte())err = ERROR;
    if(err != SUCCESS)continue;
//---读RData寄存器检查------------------------------------  
    Spi_RN8302_SendByte( 0x8C);
                checksum = 0x8C;
                temp = 0x10;                       
                Spi_RN8302_SendByte( temp );
                checksum += temp;
                for(i = 4 ; i > 0 ; i--)
                {
                        temp = Spi_RN8302_ReadByte();
                        if(num >= i)
                        {                                       
                                if(temp != Rn8302_RX_Buf[num-i])
                                {
                                        err = ERROR;
                                        break;       
                                }       
                        }
                        checksum += temp;
                }
                if(err == SUCCESS)
    {
             checksum = ~checksum;
             temp = Spi_RN8302_ReadByte();     
       if(temp != checksum)  err = ERROR;
    }
                if(err == SUCCESS)
    {
      if(num == 4)CFG_StatusREG.RData.data =  Rn8302_RX_Buf[0]<<24|Rn8302_RX_Buf[1]<<16|Rn8302_RX_Buf[2]<<8|Rn8302_RX_Buf[3];
      else if(num == 3)CFG_StatusREG.RData.data =  Rn8302_RX_Buf[0]<<16|Rn8302_RX_Buf[1]<<8|Rn8302_RX_Buf[2];
      else if(num == 2)CFG_StatusREG.RData.data =  Rn8302_RX_Buf[0]<<8|Rn8302_RX_Buf[1];
      else if(num == 1)CFG_StatusREG.RData.data =  Rn8302_RX_Buf[0];
      break;
    }
        }
  RN8302_DISABLE;
        return(err);   
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)