247 lines
5.8 KiB
C
247 lines
5.8 KiB
C
#include "RN8209D.h"
|
||
|
||
|
||
|
||
|
||
unsigned int Sum = 0;
|
||
MeterData Pre_MeterData;
|
||
|
||
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;
|
||
|
||
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;
|
||
|
||
void rn8209d_Init(void)
|
||
{
|
||
EMU_init_xlq(); //
|
||
// delay_us(100);
|
||
}
|
||
|
||
void EMU_init_xlq(void)
|
||
{
|
||
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) //读ID
|
||
{
|
||
// printf("dev id = 0x%x erro\n",tmp32);
|
||
return;
|
||
}
|
||
|
||
// 锐能微第三代单相计量芯片RN8209C、D应用笔记v1.3.pdf:4.1 上电配置步骤
|
||
Write_SPI(WriteEn,0xE5,1); // 使能写操作
|
||
Write_SPI(WriteEn,0xFA,1); // 复位
|
||
delay_us(300);
|
||
Write_SPI(WriteEn,0xE5,1); // 使能写操作
|
||
Sum= READ_SPI(0x43,1); // 校表寄存器效验和
|
||
//printf("Sum=0x%x\n", Sum);
|
||
|
||
// v1.5第17页,系统控制寄存器 SYSCON(0x00)
|
||
data = 0<<6 | // ADC2ON =1:表示 ADC 电流通道 B 开启;
|
||
0<<4 | // 电流通道 B 模拟增益选择: PGA=4, 0 1 2 -对应1 2 4 -
|
||
0<<2 | // 电压通道模拟增益选择: PGA=1, 0 1 2 3对应1 2 4 4
|
||
1<<1 |
|
||
1; // 电流通道 A 模拟增益选择: PGA=16,0 1 2 3对应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第18页,计量控制寄存器 EMUCON(0x01)
|
||
data = 0<<15 | // =0:29/2B 电能寄存器为累加型;
|
||
0<<14 | // HPFIBOFF=0:使能 IB 通道数字高通滤波器
|
||
1<<12 | // 自定义能量累加方式选择:只累加正向功率 2BH
|
||
1<<10 | // 有功能量累加方式选择:只累加正向功率 29H
|
||
0<<6 | // HPFIAOFF=0:使能 IA 通道数字高通滤波器
|
||
0<<5 | // HPFUOFF=0:使能 U 通道数字高通滤波器
|
||
0<<1 | // DRUN=0,关闭 QF 脉冲输出和自定义电能寄存器累加。
|
||
1<<0 ; // PRUN=1,使能 PF 脉冲输出和有功电能寄存器累加
|
||
Write_SPI(ADEMUCON,data,2);
|
||
data = READ_SPI(ADEMUCON,2);
|
||
// printf("EMUCON=0x%x\n", data); // 0x1401
|
||
|
||
// v1.5第23页,计量控制寄存器 EMUCON2(0x17)
|
||
data = 0<<12 | // =00:频率测量的时间为 32 个周波;
|
||
0<<7 | // =0,功率及有效值寄存器更新速度为 3.495Hz;
|
||
3<<4 | // =11:自定义电能输入选择为通道 B 有功功率
|
||
0<<3 ; // =0,电能寄存器 2 不启用定时冻结功能,默认为读后清零寄存器。
|
||
Write_SPI(ADEMUCON2,data,2);
|
||
data = READ_SPI(ADEMUCON2,2);
|
||
// printf("EMUCON2=0x%x\n", data);
|
||
|
||
// 1.0L A通道功率增益
|
||
Write_SPI(ADGPQA,GPQA,2);
|
||
data = READ_SPI(ADGPQA,2);
|
||
// printf("ADGPQA=0x%x\n", data);
|
||
|
||
// 0.5L A通道相位
|
||
Write_SPI(ADPhsA,PhsA,1);
|
||
data = READ_SPI(ADPhsA,1);
|
||
// printf("ADPhsA=0x%x\n", data);
|
||
|
||
data = 1;
|
||
Write_SPI(ADCLKCON,data,2); //波形缓存模块时钟使能
|
||
// data = 1<<7;
|
||
// Write_SPI(ADIE,data,1); //使能波形数据更新中断
|
||
data = 1<<2|1<<1;
|
||
Write_SPI(WAVE_IE,data,1); //波形半满中断和数据覆盖错误中断
|
||
tmp8 = READ_SPI(WAVE_IF,1); //清除中断
|
||
Start_Wave(); //开启波性缓存
|
||
|
||
|
||
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);
|
||
|
||
|
||
Write_SPI(WriteEn,0xDC,1); //关闭写操作
|
||
|
||
Sum = READ_SPI(ADEMUStatus,3); // 校表寄存器效验和
|
||
Sum &= 0x00FFFF;
|
||
// printf("Sum=0x%x\n", Sum); //
|
||
}
|
||
|
||
uint32_t READ_SPI(unsigned char Address, unsigned char Data_len)
|
||
{
|
||
uint8_t i,for_len;
|
||
uint8_t data[4];
|
||
uint32_t dwData;
|
||
|
||
Address |= 0x00;
|
||
SPI_CS_LOW(); // 开启SPI传输
|
||
HAL_SPI_Transmit(&hspi1,&Address,1,SPI_TIMEOUT);
|
||
HAL_SPI_Receive(&hspi1,data,Data_len,SPI_TIMEOUT);
|
||
SPI_CS_HIGH(); //关闭SPI传输
|
||
|
||
dwData = 0x00000000; // Read 24bit
|
||
for(i=0;i<Data_len;i++)
|
||
{
|
||
dwData =(dwData<<8)|data[i];
|
||
}
|
||
return dwData;
|
||
}
|
||
|
||
/**************************Wr_Dat_8209******************************/
|
||
void Write_SPI(unsigned char Address,uint32_t dwData, unsigned char Date_len)
|
||
{
|
||
|
||
uint8_t i,data[4];
|
||
for(i =0;i<Date_len;i++)
|
||
{
|
||
data[i] = dwData>>(Date_len-1-i)*8;
|
||
}
|
||
SPI_CS_LOW(); //开启SPI传输
|
||
Address |= 0x80;//write
|
||
HAL_SPI_Transmit(&hspi1,&Address,1,SPI_TIMEOUT);
|
||
HAL_SPI_Transmit(&hspi1,data,Date_len,SPI_TIMEOUT);
|
||
|
||
SPI_CS_HIGH(); //结束传输
|
||
delay_us(2);
|
||
}
|
||
|
||
|
||
void rn8209_ReadAll(void)
|
||
{
|
||
int tmp = 0;
|
||
unsigned int tmp32 = 0;
|
||
|
||
tmp32 = READ_SPI(ADDeviceID,3);//芯片ID
|
||
if(tmp32 != 0x00820900) //读ID
|
||
{
|
||
// printf("dev id = 0x%x erro\n",tmp32);
|
||
EMU_init_xlq();
|
||
return;
|
||
}
|
||
|
||
tmp32 = READ_SPI(ADEMUStatus,3);//校表寄存器效验和,每5秒读一次即可
|
||
if(Sum != (tmp32&0x00FFFF))
|
||
{
|
||
rn8209d_Init();
|
||
// printf("erro: sum =0x%x \r\n",tmp32);
|
||
return;
|
||
}
|
||
|
||
|
||
tmp = READ_SPI(ADURMS,3); // 电压有效值
|
||
if(tmp & 0x800000)
|
||
{
|
||
tmp = 0;
|
||
}
|
||
Vol = tmp;
|
||
|
||
|
||
tmp = READ_SPI(ADIARMS,3); // A通道的电流有效值
|
||
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通道的电流有效值
|
||
if (tmp & 0x800000)
|
||
{
|
||
tmp = 0;
|
||
}
|
||
IB = tmp*Ki;
|
||
// printf("IBreg=%d, IB=%0.2f A\n",tmp,IB);
|
||
|
||
tmp = READ_SPI(ADPowerPA,4); // A通道的功率有效值
|
||
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通道的电量,单位kWh
|
||
// printf("EA=%f kWh\n",EA);
|
||
|
||
tmp = READ_SPI(ADUFreq,2);
|
||
Fr=(3579545.0/8)/tmp;
|
||
// printf("Freq=%0.2f Hz\n",Fr);
|
||
}
|
||
|
||
void Start_Wave()
|
||
{
|
||
uint8_t i,data[4] = {0};
|
||
SPI_CS_LOW(); //开启SPI传输
|
||
|
||
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(); //结束传输
|
||
delay_us(2);
|
||
}
|