2024-12-27 18:16:23 +08:00
# include "RN8209D.h"
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
unsigned int Sum = 0 ;
MeterData Pre_MeterData ;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
static unsigned short EC = 2400 ;
static unsigned int HFConst = 8840 ;
static float Kp = 3.7028E-05 ;
float Kv = 1 ;
float Ki = 0.000109495519149863 ;
static unsigned int GPQA = 0 ; //0xf528;
static unsigned char PhsA = 0 ; //0xcf;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
float IA = 0.0 ;
float IB = 0.0 ;
float Vol = 0.0 ;
float PA = 0.0 ;
float PB = 0.0 ;
float EA = 0.0 ;
float Fr = 0.0 ;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
void rn8209d_Init ( void )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
EMU_init_xlq ( ) ; //
// delay_us(100);
2024-12-10 20:11:28 +08:00
}
2024-12-27 18:16:23 +08:00
void EMU_init_xlq ( void )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
uint16_t data = 0 ;
uint32_t tmp32 = 0 ;
uint8_t tmp8 = 0 ;
tmp32 = READ_SPI ( ADDeviceID2 , 3 ) ; //о ƬID
sprintf ( Tx3_Buff , " ID2:0x%x \r \n " , tmp32 ) ;
HAL_UART_Transmit_DMA ( & huart3 , Tx3_Buff , strlen ( Tx3_Buff ) ) ;
if ( tmp32 ! = 0x00820904 ) //<2F> <> ID
{
// printf("dev id = 0x%x erro\n",tmp32);
return ;
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <CEA2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> о ƬRN8209C<39> <43> DӦ<44> ñʼ <C3B1> v1.3.pdf<64> <66> 4.1 <20> ϵ<EFBFBD> <CFB5> <EFBFBD> <EFBFBD> ò<EFBFBD> <C3B2> <EFBFBD>
Write_SPI ( WriteEn , 0xE5 , 1 ) ; // ʹ <> <CAB9> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD>
Write_SPI ( WriteEn , 0xFA , 1 ) ; // <20> <> λ
delay_us ( 300 ) ;
Write_SPI ( WriteEn , 0xE5 , 1 ) ; // ʹ <> <CAB9> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD>
Sum = READ_SPI ( 0x43 , 1 ) ; // У <> <D0A3> <EFBFBD> Ĵ<EFBFBD> <C4B4> <EFBFBD> Ч<EFBFBD> <D0A7> <EFBFBD> <EFBFBD>
//printf("Sum=0x%x\n", Sum);
// v1.5<EFBFBD> <EFBFBD> 17ҳ<EFBFBD> <EFBFBD> ϵͳ<EFBFBD> <EFBFBD> <EFBFBD> Ƽ Ĵ<EFBFBD> <EFBFBD> <EFBFBD> SYSCON(0x00)
data = 0 < < 6 | // ADC2ON =1<> <31> <EFBFBD> <EFBFBD> ʾ ADC <20> <> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> B <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
0 < < 4 | // <20> <> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> B ģ<> <C4A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> : PGA=4<> <34> 0 1 2 -<2D> <> Ӧ1 2 4 -
0 < < 2 | // <20> <> ѹͨ<D1B9> <CDA8> ģ<EFBFBD> <C4A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> : PGA=1<> <31> 0 1 2 3<> <33> Ӧ1 2 4 4
1 < < 1 |
1 ; // <20> <> <EFBFBD> <EFBFBD> ͨ<EFBFBD> <CDA8> A ģ<> <C4A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> : PGA=16<31> <36> 0 1 2 3<> <33> Ӧ1 2 8 16
Write_SPI ( ADSYSCON , data , 2 ) ;
data = READ_SPI ( ADSYSCON , 2 ) ;
// printf("SYSCON=0x%x\n", data);
Write_SPI ( ADHFConst , HFConst , 2 ) ;
data = READ_SPI ( ADHFConst , 2 ) ;
// printf("HFConst = 0x%x",data);
// v1.5<EFBFBD> <EFBFBD> 18ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƽ Ĵ<EFBFBD> <EFBFBD> <EFBFBD> EMUCON(0x01)
data = 0 < < 15 | // =0<> <30> 29/2B <20> <> <EFBFBD> ܼĴ<DCBC> <C4B4> <EFBFBD> Ϊ<EFBFBD> ۼ<EFBFBD> <DBBC> ͣ<EFBFBD>
0 < < 14 | // HPFIBOFF=0<> <30> ʹ <EFBFBD> <CAB9> IB ͨ<> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> ͨ<EFBFBD> ˲<EFBFBD> <CBB2> <EFBFBD>
1 < < 12 | // <20> Զ<EFBFBD> <D4B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۼӷ<DBBC> ʽ ѡ <CABD> <D1A1> :ֻ<> ۼ<EFBFBD> <DBBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 2BH
1 < < 10 | // <20> й<EFBFBD> <D0B9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۼӷ<DBBC> ʽ ѡ <CABD> <D1A1> :ֻ<> ۼ<EFBFBD> <DBBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 29H
0 < < 6 | // HPFIAOFF=0<> <30> ʹ <EFBFBD> <CAB9> IA ͨ<> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> ͨ<EFBFBD> ˲<EFBFBD> <CBB2> <EFBFBD>
0 < < 5 | // HPFUOFF=0<> <30> ʹ <EFBFBD> <CAB9> U ͨ<> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> ͨ<EFBFBD> ˲<EFBFBD> <CBB2> <EFBFBD>
0 < < 1 | // DRUN=0<> <30> <EFBFBD> ر<EFBFBD> QF <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Զ<EFBFBD> <D4B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܼĴ<DCBC> <C4B4> <EFBFBD> <EFBFBD> ۼӡ<DBBC>
1 < < 0 ; // PRUN=1<> <31> ʹ <EFBFBD> <CAB9> PF <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> й<EFBFBD> <D0B9> <EFBFBD> <EFBFBD> ܼĴ<DCBC> <C4B4> <EFBFBD> <EFBFBD> ۼ<EFBFBD>
Write_SPI ( ADEMUCON , data , 2 ) ;
data = READ_SPI ( ADEMUCON , 2 ) ;
// printf("EMUCON=0x%x\n", data); // 0x1401
// v1.5<EFBFBD> <EFBFBD> 23ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƽ Ĵ<EFBFBD> <EFBFBD> <EFBFBD> EMUCON2(0x17)
data = 0 < < 12 | // =00:Ƶ<> ʲ<EFBFBD> <CAB2> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> Ϊ 32 <20> <> <EFBFBD> ܲ<EFBFBD> <DCB2> <EFBFBD>
0 < < 7 | // =0<> <30> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> Чֵ<D0A7> Ĵ<EFBFBD> <C4B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ٶ<EFBFBD> Ϊ 3.495Hz<EFBFBD> <EFBFBD>
3 < < 4 | // =11:<3A> Զ<EFBFBD> <D4B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѡ <EFBFBD> <D1A1> Ϊͨ<CEAA> <CDA8> B <20> й<EFBFBD> <D0B9> <EFBFBD> <EFBFBD> <EFBFBD>
0 < < 3 ; // =0<> <30> <EFBFBD> <EFBFBD> <EFBFBD> ܼĴ<DCBC> <C4B4> <EFBFBD> 2 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ö<EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> Ṧ<EFBFBD> ܣ<EFBFBD> Ĭ<EFBFBD> <C4AC> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĵ<EFBFBD> <C4B4> <EFBFBD> <EFBFBD> <EFBFBD>
Write_SPI ( ADEMUCON2 , data , 2 ) ;
data = READ_SPI ( ADEMUCON2 , 2 ) ;
// printf("EMUCON2=0x%x\n", data);
// 1.0L Aͨ<41> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
Write_SPI ( ADGPQA , GPQA , 2 ) ;
data = READ_SPI ( ADGPQA , 2 ) ;
// printf("ADGPQA=0x%x\n", data);
// 0.5L Aͨ<41> <CDA8> <EFBFBD> <EFBFBD> λ
Write_SPI ( ADPhsA , PhsA , 1 ) ;
data = READ_SPI ( ADPhsA , 1 ) ;
// printf("ADPhsA=0x%x\n", data);
data = 1 ;
Write_SPI ( ADCLKCON , data , 2 ) ; //<2F> <> <EFBFBD> λ<EFBFBD> <CEBB> <EFBFBD> ģ<EFBFBD> <C4A3> ʱ<EFBFBD> <CAB1> ʹ <EFBFBD> <CAB9>
// data = 1<<7;
// Write_SPI(ADIE,data,1); //ʹ <> ܲ<EFBFBD> <DCB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݸ<EFBFBD> <DDB8> <EFBFBD> <EFBFBD> ж<EFBFBD>
data = 1 < < 2 | 1 < < 1 ;
Write_SPI ( WAVE_IE , data , 1 ) ; //<2F> <> <EFBFBD> ΰ<EFBFBD> <CEB0> <EFBFBD> <EFBFBD> жϺ <D0B6> <CFBA> <EFBFBD> <EFBFBD> ݸ<EFBFBD> <DDB8> Ǵ<EFBFBD> <C7B4> <EFBFBD> <EFBFBD> ж<EFBFBD>
tmp8 = READ_SPI ( WAVE_IF , 1 ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> ж<EFBFBD>
Start_Wave ( ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ի<EFBFBD> <D4BB> <EFBFBD>
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
HAL_Delay ( 1 ) ;
sprintf ( Tx3_Buff , " WAVE_IF:0x%x \r \n " , tmp8 ) ;
HAL_UART_Transmit_DMA ( & huart3 , Tx3_Buff , strlen ( Tx3_Buff ) ) ;
HAL_Delay ( 1 ) ;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
Write_SPI ( WriteEn , 0xDC , 1 ) ; //<2F> ر<EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD>
Sum = READ_SPI ( ADEMUStatus , 3 ) ; // У <> <D0A3> <EFBFBD> Ĵ<EFBFBD> <C4B4> <EFBFBD> Ч<EFBFBD> <D0A7> <EFBFBD> <EFBFBD>
Sum & = 0x00FFFF ;
// printf("Sum=0x%x\n", Sum); //
2024-12-10 20:11:28 +08:00
}
2024-12-27 18:16:23 +08:00
uint32_t READ_SPI ( unsigned char Address , unsigned char Data_len )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
uint8_t i , for_len ;
uint8_t data [ 4 ] ;
uint32_t dwData ;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
Address | = 0x00 ;
SPI_CS_LOW ( ) ; // <20> <> <EFBFBD> <EFBFBD> SPI<50> <49> <EFBFBD> <EFBFBD>
HAL_SPI_Transmit ( & hspi1 , & Address , 1 , SPI_TIMEOUT ) ;
HAL_SPI_Receive ( & hspi1 , data , Data_len , SPI_TIMEOUT ) ;
SPI_CS_HIGH ( ) ; //<2F> ر<EFBFBD> SPI<50> <49> <EFBFBD> <EFBFBD>
dwData = 0x00000000 ; // Read 24bit
for ( i = 0 ; i < Data_len ; i + + )
{
dwData = ( dwData < < 8 ) | data [ i ] ;
}
return dwData ;
2024-12-10 20:11:28 +08:00
}
2024-12-27 18:16:23 +08:00
/**************************Wr_Dat_8209******************************/
void Write_SPI ( unsigned char Address , uint32_t dwData , unsigned char Date_len )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
uint8_t i , data [ 4 ] ;
for ( i = 0 ; i < Date_len ; i + + )
{
data [ i ] = dwData > > ( Date_len - 1 - i ) * 8 ;
}
SPI_CS_LOW ( ) ; //<2F> <> <EFBFBD> <EFBFBD> SPI<50> <49> <EFBFBD> <EFBFBD>
Address | = 0x80 ; //write
HAL_SPI_Transmit ( & hspi1 , & Address , 1 , SPI_TIMEOUT ) ;
HAL_SPI_Transmit ( & hspi1 , data , Date_len , SPI_TIMEOUT ) ;
SPI_CS_HIGH ( ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
delay_us ( 2 ) ;
2024-12-10 20:11:28 +08:00
}
2024-12-27 18:16:23 +08:00
void rn8209_ReadAll ( void )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
int tmp = 0 ;
unsigned int tmp32 = 0 ;
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
tmp32 = READ_SPI ( ADDeviceID , 3 ) ; //о ƬID
if ( tmp32 ! = 0x00820900 ) //<2F> <> ID
{
// printf("dev id = 0x%x erro\n",tmp32);
EMU_init_xlq ( ) ;
return ;
}
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
tmp32 = READ_SPI ( ADEMUStatus , 3 ) ; //У <> <D0A3> <EFBFBD> Ĵ<EFBFBD> <C4B4> <EFBFBD> Ч<EFBFBD> <D0A7> <EFBFBD> <EFBFBD> ,ÿ5<C3BF> <35> <EFBFBD> <EFBFBD> һ <EFBFBD> μ<EFBFBD> <CEBC> <EFBFBD>
if ( Sum ! = ( tmp32 & 0x00FFFF ) )
{
rn8209d_Init ( ) ;
// printf("erro: sum =0x%x \r\n",tmp32);
return ;
}
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
tmp = READ_SPI ( ADURMS , 3 ) ; // <20> <> ѹ<EFBFBD> <D1B9> Чֵ
if ( tmp & 0x800000 )
{
tmp = 0 ;
}
Vol = tmp ;
tmp = READ_SPI ( ADIARMS , 3 ) ; // Aͨ<41> <CDA8> <EFBFBD> ĵ<EFBFBD> <C4B5> <EFBFBD> <EFBFBD> <EFBFBD> Чֵ
if ( tmp & 0x800000 )
{
tmp = 0 ;
}
IA = tmp ;
// tmp32 = READ_SPI(ADUFreq,2); //pinlv
sprintf ( Tx3_Buff , " URMS=%0.0f, IARMS=%0.0f \r \n " , Vol , IA * Ki ) ;
HAL_UART_Transmit_DMA ( & huart3 , Tx3_Buff , strlen ( Tx3_Buff ) ) ;
tmp = READ_SPI ( ADIBRMS , 3 ) ; // Bͨ<42> <CDA8> <EFBFBD> ĵ<EFBFBD> <C4B5> <EFBFBD> <EFBFBD> <EFBFBD> Чֵ
if ( tmp & 0x800000 )
{
tmp = 0 ;
}
IB = tmp * Ki ;
// printf("IBreg=%d, IB=%0.2f A\n",tmp,IB);
tmp = READ_SPI ( ADPowerPA , 4 ) ; // Aͨ<41> <CDA8> <EFBFBD> Ĺ<EFBFBD> <C4B9> <EFBFBD> <EFBFBD> <EFBFBD> Чֵ
if ( tmp < 0 )
{
tmp = 0xffffffff - tmp ;
}
PA = tmp * Kp ;
// printf("PA reg = %d,PA=%0.2f W\n",tmp,PA);
tmp = READ_SPI ( ADPowerPB , 4 ) ;
if ( tmp & 0x80000000 )
{
tmp = 0 ;
}
PB = tmp * Kp ;
// printf("PB=%0.2f W\n",PB);
tmp = READ_SPI ( ADEnergyP , 3 ) ;
EA = tmp * 1.0 * ( 1 / EC ) ; // Aͨ<41> <CDA8> <EFBFBD> ĵ<EFBFBD> <C4B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λkWh
// printf("EA=%f kWh\n",EA);
2024-12-10 20:11:28 +08:00
2024-12-27 18:16:23 +08:00
tmp = READ_SPI ( ADUFreq , 2 ) ;
Fr = ( 3579545.0 / 8 ) / tmp ;
// printf("Freq=%0.2f Hz\n",Fr);
2024-12-10 20:11:28 +08:00
}
2024-12-27 18:16:23 +08:00
void Start_Wave ( )
2024-12-10 20:11:28 +08:00
{
2024-12-27 18:16:23 +08:00
uint8_t i , data [ 4 ] = { 0 } ;
SPI_CS_LOW ( ) ; //<2F> <> <EFBFBD> <EFBFBD> SPI<50> <49> <EFBFBD> <EFBFBD>
data [ 0 ] = 0xEA ;
data [ 1 ] = 0x87 ;
data [ 2 ] = 0 < < 6 | 1 ;
data [ 3 ] = ~ ( data [ 0 ] + data [ 1 ] + data [ 2 ] ) ;
HAL_SPI_Transmit ( & hspi1 , data , 4 , SPI_TIMEOUT ) ;
SPI_CS_HIGH ( ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
delay_us ( 2 ) ;
2024-12-10 20:11:28 +08:00
}