/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#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);
}