用C對RN8302B進行數(shù)據(jù)讀寫
- typedef unsigned char u8;
- typedef signed char s8;
- typedef unsigned short u16;
- typedef signed short s16;
- typedef unsigned long int u32;
- typedef signed long int s32;
- typedef unsigned short WORD;
- typedef unsigned char BOOL;
- #define PinWrite_ADSCLK(x) ( (x) ? (P0_bit.no6 = 1 , PM0_bit.no6 = 1) : (PM0_bit.no6 = 0 , P0_bit.no6 = 0) ) //
- #define PinMode_ADSCLK(x) ( (x == GPIO_MODE_OUT) ? (PM0_bit.no6 = 0) : (PM0_bit.no6 = 1) )
- #define PinRead_ADSDI() (P4_bit.no4)
- #define PinWrite_ADSDO(x) ( (x) ? (P6_bit.no0 = 1 , PM6_bit.no0 = 1) : (PM6_bit.no0 = 0 , P6_bit.no0 = 0) ) //
- #define PinWrite_ADCS(x) ( (x) ? (P6_bit.no1 = 1 , PM6_bit.no1 = 1) : (PM6_bit.no1 = 0 , P6_bit.no1 = 0 ) )
- #define PinWrite_ADRST(x) ( (x) ? (P0_bit.no5 = 1 , PM0_bit.no5 = 1) : (PM0_bit.no5 = 0 , P0_bit.no5 = 0 ) )
- typedef enum {ERROR = 0 , SUCCESS = !ERROR} ErrorStatus;
- typedef struct {
- // u32 Dat : 23;
- // u32 S : 1;
- u8 Dat0;
- u8 Dat1;
- u8 Dat2 : 7;
- u8 S : 1;
- } sDF09;
- typedef struct {
- u32 Dat;
- } sDF11;
- typedef sDF11 sFsEgSh_TypeDef;
- #pragma vector = INTTM01_vect
- __interrupt void MD_INTTM01(void)
- {
- TMIF01 = 0; /* INTTM01 interrupt flag clear */
- SysStamp ++ ;
- }
- u16 fnStamp_Through(u16 Ago)
- {
- extern u16 SysStamp;
- if (SysStamp >= Ago)
- {return (SysStamp - Ago);}
- else
- {return ( (0xffff - Ago) + SysStamp);}
- }
- u16 fnHexToBcd_u16(u16 Dat)
- {
- u16 Result = 0;
- Dat = Dat % 10000;
- Result += (Dat / 1000) * 0x1000;
- Dat = Dat % 1000;
- Result += (Dat / 100) * 0x100;
- Dat = Dat % 100;
- Result += (Dat / 10) * 0x10;
- Dat = Dat % 10;
- Result += Dat;
-
- return(Result);
- }
- u32 fnHexToBcd_u32(u32 Dat)
- {
- u32 result = 0;
-
- Dat = Dat % 100000000;
- result += (Dat / 10000000) * 0x10000000;
- Dat = Dat % 10000000;
- result += (Dat / 1000000) * 0x1000000;
- Dat = Dat % 1000000;
- result += (Dat / 100000) * 0x100000;
- Dat = Dat % 100000;
- result += (Dat / 10000) * 0x10000;
- Dat = Dat % 10000;
- result += (Dat / 1000) * 0x1000;
- Dat = Dat % 1000;
- result += (Dat / 100) * 0x100;
- Dat = Dat % 100;
- result += (Dat / 10) * 0x10;
- Dat = Dat % 10;
- result += Dat;
-
- return(result);
- }
- u16 fnDFConver_Bcd16To16(s16 Dat)
- {
- u16 Result;
- Result = abs(Dat) % 8000;
- Result = fnHexToBcd_u16(Result);
- if(Dat < 0 ) Result |= 0x8000;
- else Result &= 0x7fff;
- return(Result);
- }
- u32 fnDFConver_Bcd32To32(s32 Dat)
- {
- u32 Result;
- Result = labs(Dat) % 80000000;
- Result = fnHexToBcd_u32(Result);
- if(Dat < 0 ) Result |= 0x80000000;
- else Result &= 0x7fffffff;
- return(Result);
- }
- sDF09 fnDFConver_Hex32ToDF09(s32 Dat)
- {
- sDF09 Result;
- memset(&Result , 0 , sizeof(sDF09) );
- if(Dat < 0) Result.S = 1;
- else Result.S = 0;
-
- Dat = labs(Dat) % 800000;
- Dat = fnHexToBcd_u32(Dat);
-
- Result.Dat0 = Dat;
- Result.Dat1 = Dat >> 8;
- Result.Dat2 = Dat >> 16;
- return(Result);
- }
- typedef union //公共數(shù)據(jù)運算區(qū)8字節(jié)
- {
- u8 ucTempBuf[8];
- u32 lTemp32;
- u16 wTemp16;
- u8 ucTemp8;
- }sDl645StruDataComm_TypeDef;
- __no_init sDl645StruDataComm_TypeDef Dl645RN8302DataComm;
- __no_init sDl645FrontTmp_TypeDef Dl645FrontTmp;
- __no_init sDl645Front_TypeDef Dl645Front;
- __no_init sDl645Eg_TypeDef Dl645Eg;
- __no_init sDl645FirmParaFile_TypeDef Dl645FirmPara;
- typedef struct
- {
- u8 ChkErrCnt; //讀錯誤計數(shù)1
-
- s32 Pw[12]; //{Pa Pb Pc P Qa Qb Qc Q Sa Sb Sc S} 48
- s32 UI[7]; //Ua Ub Uc Ia Ib Ic Inal 28
- s32 VectorU[9]; // 正序、負序、零序電壓
- s32 VectorI[9]; // 正序、負序、零序電流
- s32 Pf[4]; //Pf Pfa Pfb Pfc 16
- u32 Frequency; //電網(wǎng)頻率,單位: 4
- s32 YUI[3],YUU[2]; //20
-
- s32 Pulse[15]; //前臺高頻脈沖48
- //---電能脈沖---
- s32 Pulse_EgTmp[20]; //高頻脈沖{P,Q,Ps},{Pa,Qa,Psa},{Pb,Qb,Psb},{Pc,Qc,Psc}{Fp,Fq}{Fpa,Fqa}{Fpb,Fqb}{Fpc,Fqc}
- u32 Pulse_Eg[20]; //低頻脈沖數(shù)
- //---需量脈沖---
- s32 Pulse_NeedTmp[12];
- u16 Pulse_Need[12]; //{PNeed,QNeed,PsNeed},{PNeeda,QNeeda,PsNeeda},{PNeedb,QNeedb,PsNeedb},{PNeedc,QNeedc,PsNeedc}48
-
- u16 Angle[9];
- u16 PDirect; //4
- u32 ChkSum1; //4
- u32 ChkSum2; //4
-
- u16 Temperature; //溫度4
- u32 ClockBat; //時鐘電池4
- u32 BackupBat; //后備電池4
-
- u16 CF1DelayStamp;
- u16 CF2DelayStamp;
-
- u16 CfIn_P;
- u16 CfIn_q;
-
- u16 CfTime_P;
- u16 CfTime_q;
-
- } sDl645FrontTmp_TypeDef;
- typedef struct
- {
- struct sFrontPubData_TypeDef {
- u16 U[3]; //---電壓---NNN.N6
- u16 VectorU[9]; // 正序電壓 0--2 負序電壓 3---5 零序電壓 6---8
- u32 I[4]; //---電流NNNN.NNNN(電流值要求3整3小,整定值要求2整4小,最高位表示方向)---16
- u32 VectorI[9]; // 正序電流 0--2 負序電流 3---5 零序電流 6---8
- sDF09 Pw[12]; //---瞬時有功/無功/視在功率NN.NNNN---{P Pa Pb Pc Q Qa Qb Qc S Sa Sb Sc}36
- u16 Pf[4]; //---功率因數(shù)N.NNN--- 最高位表示方向{Pf Pfa Pfb Pfc} 8 sDF05
- u16 Angle[9]; //---相角NNN.N--- 18
- //PhUb,PhUc, 以A相電壓為基準,B、C相角度 //(hyg) BCD碼
- //PhIa,PhIb,PhIc,A相電流與A相電壓間角度、B相電流與B相電壓間角度、C相電流與C相電壓間角度
- //Angle A,Angle B,Angle C, A相電流與A相電壓間角度、B相電流與A相電壓間角度、C相電流與A相電壓間角度
- //Angle C-Angle A
- u32 UnblU; //電壓不平衡度NNNN.NN%4
- u32 UnblI; //電流不平衡度NNNN.NN%4
-
- u16 FuzzyU[3]; //---電壓波形失真度NN.NN%--- 6
- u16 FuzzyI[3]; //---電流波形失真度NN.NN%--- 6
- u16 WaveU[3][21]; //---相電壓諧波含量NN.NN%--- 126
- u16 WaveI[3][21]; //---相電流諧波含量NN.NN%--- 126
- //---其他---
- u16 Frequency; //NN.NN 2
- u32 PPwave; //NN.NNNN 4
-
- u16 Temperature; //NNN.N 2
- u16 ClockBat; //NN.NN 2
- u16 BackupBat; //NN.NN 2
- u8 PDirect; //原功率方向,用于需量處理(0總/1A/2B/3C , 注意與FrontTmp不同) 1
- } PubData;
-
- struct sFrontPriData_TypeDef {
- u8 Flag; //---工作異常標志---1
- u8 PhaseCalStep;
- u16 FrontStamp;
- // u8 BatCalStep;
- u16 BatStamp;
- // u16 BatDetStamp;
- } PriData;
-
- struct sFrontPriPara_TypeDef {
- u32 PConstE; //有功常數(shù)
- u32 QConstE; //無功常數(shù)(Hex碼)4
- u16 Crc;//2
- } PriPara;
- } sDl645Front_TypeDef; //緩沖區(qū)轉(zhuǎn)換后的有效數(shù)據(jù)
- typedef struct
- {
- u8 FractionI;/*電流小數(shù)位數(shù)*/
- u8 FractionU;/*電壓小數(shù)位數(shù)*/
- u8 FractionE;/*電能小數(shù)位數(shù)*/
- u8 FractionP;/*功率需量小數(shù)位數(shù)*/
- u16 ConstE;/*電表有功常數(shù)*/
- u16 Pulse_deltaE;/*數(shù)*/
- u8 HighPulseRate;
- u8 PhaseCalStep;
- u32 IRmsConst; //10
- u16 Reserve[2];
- u16 NOLOAD;
- u16 ZEROSTAR; //20
- u32 ChkSum1;
- u16 HFConst1;
- u16 HFConst2;
- u32 VRmsConst; //30
- u16 Reserve1;
- u32 PRmsConst;
- u16 Reserve2;
- u16 VGain[3]; // 42
- u16 IGain[4]; //48
- u8 PHSU[2]; // 56
- u32 PHSI[3];
- u16 PRth[4]; //70
- u16 UI_Offset[7];
- u16 P_PHS[3];/*有功相位校正寄存器*/ // 92
- u16 PGain[3];/*有功增益校正寄存器*/
- }sDl645FirmParaFile_TypeDef;
- typedef struct {
- #pragma pack(1)
- struct sDl645EgPubData_TypeDef
- {
- sFsEgSh_TypeDef AllPEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef PtPEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef NtPEgSh[DL645_MAX_FL + 1];
-
- sFsEgSh_TypeDef AllQEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef PtQEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef NtQEgSh[DL645_MAX_FL + 1];
-
- sFsEgSh_TypeDef Qd1QEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef Qd2QEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef Qd3QEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef Qd4QEgSh[DL645_MAX_FL + 1];
-
- sFsEgSh_TypeDef PtPsEgSh[DL645_MAX_FL + 1];
- sFsEgSh_TypeDef NtPsEgSh[DL645_MAX_FL + 1];
-
- sFsEgSh_TypeDef AssEgSh;
- sFsEgSh_TypeDef BasePtPEgSh;
- sFsEgSh_TypeDef BaseNtPEgSh;
- sFsEgSh_TypeDef WavePtPEgSh;
- sFsEgSh_TypeDef WaveNtPEgSh;
- sFsEgSh_TypeDef CopPEgSh;
- sFsEgSh_TypeDef IronPEgSh;
- //-------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
msp430單片機源程序如下:
所有資料51hei提供下載:
三相計量RN8302B.7z
(4.52 MB, 下載次數(shù): 202)
2021-3-24 22:25 上傳
點擊文件名下載附件
|