#include <stdio.h>
#include <string.h>
#include "ADE7880.h"
#include "oled.h"
#include "var_ext_head.h"
#include "SCi.h"
void ADE7880_IO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = ADE7880_SCLK_Pin|ADE7880_MOSI_Pin|ADE7880_CS_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,ADE7880_SCLK_Pin|ADE7880_MOSI_Pin|ADE7880_CS_Pin);
GPIO_InitStructure.GPIO_Pin = ADE7880_MISO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void ade7878_delay(u32 nCount)
{
volatile int i;
for (i=0;i<nCount*100;i++);
}
void Ade7878_PSM0_Enable(void)
{
// ADE_RESET_0;
// ade7878_delay(20);
// ADE_RESET_1;
// ade7878_delay(5);
// ADE_PM0_1;
// ade7878_delay(5);
// ADE_PM1_0;
// ade7878_delay(5);
}
void Ade7880_SPI_Enable(void)
{
ADE7880_CS(1);
ade7878_delay(5);
ADE7880_CS(0);
ade7878_delay(5);
ADE7880_CS(1);
ade7878_delay(5);
ADE7880_CS(0);
ade7878_delay(5);
ADE7880_CS(1);
ade7878_delay(5);
ADE7880_CS(0);
ade7878_delay(5);
ADE7880_CS(1);
ade7878_delay(5);
WriteADE7880(CONFIG2,0x00,1);
}
unsigned long ReadADE7880(unsigned short add,char byte)
{
unsigned long data=0;
unsigned long Read=0x01;
unsigned long i,bit,count=byte*8;
ADE7880_CS(1);//cs=1;
delay_us(1);
ADE7880_SCLK(1);//sclk=1;
delay_us(1);
ADE7880_CS(0);//cs=0;
delay_us(1);
for (i=0;i<8;i++)//读操作
{
ADE7880_SCLK(0);
if(Read&0x80)
{
ADE7880_MOSI(1);//置位
}
else
{
ADE7880_MOSI(0);//清零
}
Read<<=1;
ADE7880_SCLK(1);
}
for (i=0;i<16;i++)//寄存器地址
{
ADE7880_SCLK(0);
if(add&0x8000)
{
ADE7880_MOSI(1);//置位
}
else
{
ADE7880_MOSI(0);//清零
}
add<<=1;
ADE7880_SCLK(1);
}
for (i=0;i<count;i++)//寄存器值
{
ADE7880_SCLK(0);
Delay(1);
bit = GPIO_ReadInputDataBit(ADE7880_MISO_Port,ADE7880_MISO_Pin);
ADE7880_SCLK(1)
data=(data<<1)|bit;
}
ADE7880_CS(1);
return data;
}
void WriteADE7880(unsigned short add,unsigned long value,char byte)
{
unsigned long Write=0x00;
unsigned long i,bit,count=byte*8;
unsigned long VAR=0;
if(byte==1)
{
VAR = 0x80;
}
else if(byte==2)
{
VAR = 0x8000;
}
else if(byte==4)
{
VAR = 0x80000000;
}
ADE7880_CS(1);//cs=1;
delay_us(1);
ADE7880_SCLK(1);//sclk=1;
delay_us(1);
ADE7880_CS(0);//cs=0;
delay_us(1);
for (i=0;i<8;i++)//写操作
{
ADE7880_SCLK(0);
if(Write&0x80)
{
ADE7880_MOSI(1);//置位
}
else
{
ADE7880_MOSI(0);//清零
}
Write<<=1;
ADE7880_SCLK(1);
}
for (i=0;i<16;i++)//寄存器地址
{
ADE7880_SCLK(0);
if(add&0x8000)
{
ADE7880_MOSI(1);//置位
}
else
{
ADE7880_MOSI(0);//清零
}
add<<=1;
ADE7880_SCLK(1);
}
for (i=0;i<count;i++)//寄存器值
{
ADE7880_SCLK(0);
if(value&VAR)
{
ADE7880_MOSI(1);//置位
}
else
{
ADE7880_MOSI(0);//清零
}
value<<=1;
ADE7880_SCLK(1);
}
ADE7880_CS(1);
}
/*
void Write_ADE7878_SPI(unsigned int ADE_Addr, unsigned char Nr_Bytes,unsigned char *pReg_Data)
{
unsigned char i;
unsigned char MS_Addr;
unsigned char LS_Addr;
LS_Addr = (unsigned char) ADE_Addr;
MS_Addr = (unsigned char) (ADE_Addr >> 8);
CS_0;
SPI2_ReadWrite(0x00);
SPI2_ReadWrite(MS_Addr);
SPI2_ReadWrite(LS_Addr);
pReg_Data=pReg_Data+(Nr_Bytes-1);
for(i=0;i<Nr_Bytes;i++)
{
SPI2_ReadWrite(*pReg_Data);
pReg_Data--;
}
CS_1;
}
void Read_ADE7878_SPI(unsigned int ADE_Addr, unsigned char Nr_Bytes,unsigned char *pReg_Data)
{
unsigned char i;
unsigned char MS_Addr;
unsigned char LS_Addr;
LS_Addr = (unsigned char) ADE_Addr;
MS_Addr = (unsigned char) (ADE_Addr >> 8);
CS_0;
SPI2_ReadWrite(0x01);
SPI2_ReadWrite(MS_Addr);
SPI2_ReadWrite(LS_Addr);
pReg_Data=pReg_Data+(Nr_Bytes-1);
for (i=0;i<Nr_Bytes;i++)
{
*pReg_Data = SPI2_ReadWrite(0xff);
pReg_Data--;
}
CS_1;
}
*/
void ADE7878_start(void)
{
/**********************************************************
寄存器配置的初始值
**********************************************************/
WriteADE7880(GAIN,0x0000,2); //config the Gain of the PGA , which is before the ADC of ADE7878
WriteADE7880(CONFIG,0x0000,2); //
WriteADE7880(HPFDIS,0x0000,2); //enabled high-pass filters
WriteADE7880(AIGAIN,0x00000000,4); //calibration
WriteADE7880(AVGAIN,0x00000000,4);
WriteADE7880(BIGAIN,0x00000000,4);
WriteADE7880(BVGAIN,0x00000000,4);
WriteADE7880(CIGAIN,0x00000000,4);
WriteADE7880(CVGAIN,0x00000000,4);
WriteADE7880(NIGAIN,0x00000000,4);
WriteADE7880(AIRMSOS,0x00000000,4);
WriteADE7880(AVRMSOS,0x00000000,4);
WriteADE7880(BIRMSOS,0x00000000,4);
WriteADE7880(BVRMSOS,0x00000000,4);
WriteADE7880(CIRMSOS,0x00000000,4);
WriteADE7880(CVRMSOS,0x00000000,4);
WriteADE7880(NIRMSOS,0x00000000,4);
WriteADE7880(AWGAIN,0x00000000,4);
WriteADE7880(AWATTOS,0x00000000,4);
WriteADE7880(BWGAIN,0x00000000,4);
WriteADE7880(BWATTOS,0x00000000,4);
WriteADE7880(CWGAIN,0x00000000,4);
WriteADE7880(CWATTOS,0x00000000,4);
WriteADE7880(APHCAL,0x0000,2);
WriteADE7880(BPHCAL,0x0000,2);
WriteADE7880(CPHCAL,0x0000,2);
WriteADE7880(CF1DEN,0x00A7,2); //configure the ENERGY-TO-FREQUENCY
WriteADE7880(CF2DEN,0x00A7,2);
WriteADE7880(CF3DEN,0x00A7,2);
WriteADE7880(CFMODE,0x0E88,2); //CF1-total active power, disable; CF2-total reactvie power, disable; CF3- fundamental avtive power, disable
WriteADE7880(ACCMODE,0x0000,2);
WriteADE7880(COMPMODE,0x01FF,2);
WriteADE7880(MMODE,0x00,1);
WriteADE7880(WTHR0,0x007BBE61,4); //PMAX = 33,516,139 0.001WH/LSB //page 47 datasheet Rev. E
WriteADE7880(WTHR1,0x00000017,4);
WriteADE7880(VATHR0,0x007BBE61,4); //PMAX = 33,516,139
WriteADE7880(VATHR1,0x00000017,4);
WriteADE7880(VARTHR0,0x007BBE61,4); //PMAX = 33,516,139
WriteADE7880(VARTHR1,0x00000017,4);
WriteADE7880(LCYCMODE,0x0F,1); //phase A is selected for zero cross
WriteADE7880(LINECYC,0x0064,2);
WriteADE7880(MASK0,0x00000020,4); //line cycle interrupt enable
WriteADE7880(MASK1,0x00000000,4);
}
void CorrectMeter(void)
{
// unsigned char CorrectMeterReg[4*DataBufferSize] = {0x4A,0X65,0X08,0X00,0X01,0XC1,0X03,0X00,0Xff,0X3b,0Xff,0X00};
// Write_ADE7878_SPI(AVGAIN,4,CorrectMeterReg);
// Write_ADE7878_SPI(AIGAIN,4,CorrectMeterReg+4);
// Write_ADE7878_SPI(BIGAIN,4,CorrectMeterReg+8);
// Write_ADE7878_SPI(BVGAIN,4,CorrectMeterReg+12);
// Write_ADE7878_SPI(CIGAIN,4,CorrectMeterReg+16);
// Write_ADE7878_SPI(CVGAIN,4,CorrectMeterReg+20);
//
// Write_ADE7878_SPI(APHCAL,2,CorrectMeterReg+24);
// Write_ADE7878_SPI(BPHCAL,2,CorrectMeterReg+26);
// Write_ADE7878_SPI(CPHCAL,2,CorrectMeterReg+28);
///*有功功率增益校准*/
// Write_ADE7878_SPI(AWGAIN,4,CorrectMeterReg+30);
// Write_ADE7878_SPI(BWGAIN,4,CorrectMeterReg+34);
// Write_ADE7878_SPI(CWGAIN,4,CorrectMeterReg+38);
///*无功功率增益校准*/
// Write_ADE7878_SPI(AVARGAIN,4,CorrectMeterReg+42);
// Write_ADE7878_SPI(BVARGAIN,4,CorrectMeterReg+46);
// Write_ADE7878_SPI(CVARGAIN,4,CorrectMeterReg+50);
///*电流有效值偏移量校准*/
// Write_ADE7878_SPI(AIRMSO