400Vhuganqi/RN8209D官方资料/RN8209C 01-04资料合集/RN8209C 04支持软件/rn8209参考.C
2024-12-27 18:16:23 +08:00

232 lines
5.2 KiB
C

#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;