232 lines
5.2 KiB
C
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; |