#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>(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); }