400Vhuganqi/project/400V/user/Src/RN8209D.c

247 lines
5.8 KiB
C
Raw Normal View History

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><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
}