#define PinWrite_RN8209CS1(x) ( (x) ? (P5_bit.no7 = 1 , PM5_bit.no7 = 0) : (P5_bit.no7 = 0 , PM5_bit.no7 = 0) ) //----SPI2定义----- #define PinMode_MISO2(x) ( (x == GPIO_MODE_OUT) ? (PM4_bit.no5 = 0) : (PM4_bit.no5 = 1) ) #define PinMode_MOSI2(x) ( (x == GPIO_MODE_OUT) ? (PM4_bit.no4 = 0) : (PM4_bit.no4 = 1) ) #define PinMode_SCK2(x) ( (x == GPIO_MODE_OUT) ? (PM4_bit.no3 = 0) : (PM4_bit.no3 = 1) ) #define PinPullUp_MISO2(x) ( (x == GPIO_PULLUP_ON) ? (PU4_bit.no5 = 1) : (PU4_bit.no5 = 0) ) #define PinPullUp_MOSI2(x) ( (x == GPIO_PULLUP_ON) ? (PU4_bit.no4 = 1) : (PU4_bit.no4 = 0) ) #define PinPullUp_SCK2(x) ( (x == GPIO_PULLUP_ON) ? (PU4_bit.no3 = 1) : (PU4_bit.no3 = 0) ) #define PinWrite_MISO2(x) ( (x) ? (P4_bit.no5 = 1 , PM4_bit.no5 = 0) : (P4_bit.no5 = 0 , PM4_bit.no5 = 0) ) #define PinWrite_MOSI2(x) ( (x) ? (P4_bit.no4 = 1 , PM4_bit.no4 = 0) : (P4_bit.no4 = 0 , PM4_bit.no4 = 0) ) #define PinWrite_SCK2(x) ( (x) ? (P4_bit.no3 = 1 , PM4_bit.no3 = 0) : (P4_bit.no3 = 0 , PM4_bit.no3 = 0) ) #define PinRead_MISO2(x) (P4_bit.no5) void fnSpi2_WriteByte(u8 Dat) { u8 i; for(i=0;i<8;i++) { PinWrite_SCK2(1); PinWrite_SCK2(1); fnDelay2us(); fnDelay2us(); if(Dat & 0x80) { PinWrite_MOSI2(1); PinWrite_MOSI2(1); fnDelay2us(); fnDelay2us(); fnDelay2us(); } else { PinWrite_MOSI2(0); PinWrite_MOSI2(0); fnDelay2us(); fnDelay2us(); fnDelay2us(); } PinWrite_SCK2(0); PinWrite_SCK2(0); fnDelay2us(); fnDelay2us(); fnDelay2us(); Dat <<= 1; } PinWrite_MOSI2(1); PinWrite_MOSI2(1); fnDelay2us(); fnDelay2us(); fnDelay2us(); } u8 fnSpi2_ReadByte(void) { u8 i,B=0; for(i=0;i<8;i++) { B<<=1; PinWrite_SCK2(1); PinWrite_SCK2(1); fnDelay2us(); fnDelay2us(); fnDelay2us(); fnDelay2us(); PinWrite_SCK2(0); PinWrite_SCK2(0); fnDelay2us(); fnDelay2us(); fnDelay2us(); fnDelay2us(); if (PinRead_MISO2()){B=B+0x1;} fnDelay2us(); fnDelay2us(); fnDelay2us(); } return B; } ErrorStatus fnRn8209_Write(u8 Dst , u8 *Src , u8 DatLen , u8 Repeat ) { u8 i , Tmp; ErrorStatus err = SUCCESS; if( (DatLen == 0) || (DatLen > 3) ) return(ERROR); for( ; Repeat != 0 ; Repeat--) { //写数据 PinWrite_RN8209CS1(0); Dst |=0x80; fnSpi2_WriteByte( Dst); for(i = 0 ; i < DatLen ; i++) { Tmp = Src[DatLen - 1 - i]; fnSpi2_WriteByte(Tmp); } NOP(); fnSpi2_WriteByte(0x45); for(i = 2 ; i > 0 ; i--) { Tmp = fnSpi2_ReadByte(); if(DatLen >= i) { if(Tmp != Src[i - 1]) { err = ERROR; break; } } } PinWrite_RN8209CS1(1); NOP(); if(err == SUCCESS) break; } return(err); } ErrorStatus fnRn8209_Read(u8 *Dst , u8 Src , u8 DatLen , u8 Repeat) { u8 i , Tmp; ErrorStatus err = SUCCESS; if( (DatLen == 0) || (DatLen > 3) ) return(ERROR); for( ; Repeat != 0 ; Repeat--) { //---读数据------------------------------------ PinWrite_RN8209CS1(0); NOP(); fnSpi2_WriteByte(Src); for(i = 0 ; i < DatLen ; i++) { Tmp = fnSpi2_ReadByte(); Dst[DatLen - 1 - i] = Tmp; } NOP(); fnSpi2_WriteByte(0x44); for(i = 4 ; i > 0 ; i--) { Tmp = fnSpi2_ReadByte(); if(DatLen >= i) { if(Tmp != Dst[i - 1]) { err = ERROR; break; } } } PinWrite_RN8209CS1(1); if(err == SUCCESS) break; } return(err); } case 0x00081300: // 单相RN8209校正 if(RxFrm->Len != (12+14)) return(DL645B_ERRINFO_DATA); memcpy(&tempconst , &(RxFrm->UDat.Dat[8]) , 2); memcpy(&temphfconst , &(RxFrm->UDat.Dat[10]) , 2); memcpy(&tempub , &(RxFrm->UDat.Dat[12]) , 2); memcpy(&tempus , &(RxFrm->UDat.Dat[14]) , 4); Dl645FirmPara.SPRmsConst=(float)tempus/(tempub); fnRn8209_Read((u8 *)&temppw[0] , 0x26 , 4,3) ; ADErr=((float)temppw[0]-(float)tempus)/tempus; ADErr=(-ADErr/(1+ADErr)); if(ADErr>0) Dl645FirmPara.GPQA=(u16)(ADErr*32768); else Dl645FirmPara.GPQA = (u16)(65535 + ADErr*32768); memcpy(&tempib , &(RxFrm->UDat.Dat[20]) , 2); tempis = 0; fnRn8209_Read((u8 *)&tempis , 0x22 , 3 ,0x03) ; i=4; B=1; while(i--) { B*=10; } B = B/1000; Dl645FirmPara.SIRmsConst=(float)tempis/((float)tempib*B); memcpy(&tempub , &(RxFrm->UDat.Dat[18]) , 2); tempus = 0; fnRn8209_Read((u8 *)&tempus , 0x24 , 3 ,0x03) ; i=2; B=1; while(i--) { B*=10; } B = B/100; Dl645FirmPara.SVRmsConst=(float)tempus/(tempub*B); Dl645RN8302DataComm.ucTemp8 = 0xDC; // 写保护 fnRn8209_Write(0xEA,Dl645RN8302DataComm.ucTempBuf,1,3); break; case 0x00081400: //单相RN8209相位校正 if(RxFrm->Len != (12+6)) return(DL645B_ERRINFO_DATA); memcpy(&tempub , &(RxFrm->UDat.Dat[8]) , 2); memcpy(&tempus , &(RxFrm->UDat.Dat[10]) , 4); Dl645RN8302DataComm.ucTemp8 = 0xe5; // 写使能位 fnRn8209_Write(0xEA,Dl645RN8302DataComm.ucTempBuf,1,3); fnRn8209_Read((u8 *)&temppw[0] , 0x26 , 4,3) ; ADErr=((float)temppw[0]-(float)tempus)/tempus; ADErr=(ADErr/(1+ADErr)); ADErr= (asin(-ADErr/1.732))*50*57.29578; // 弧度转成角度 if(ADErr>0) Dl645FirmPara.PhsA=(u8)(ADErr); else Dl645FirmPara.PhsA = (u8)(256 + ADErr); fnRn8209_Write(0x07,(u8 *)&Dl645FirmPara.PhsA,1,3); Dl645RN8302DataComm.ucTemp8 = 0xDC; // 写保护 fnRn8209_Write(0xEA,Dl645RN8302DataComm.ucTempBuf,1,3); break;