已回答假定已回答

ADE7754读些问题

linxuan_1990@126.com 在 2014-10-27 詢問的問題
最後回覆由adi_rock於2014-11-9提供

初始化寄存器,然后读取一个寄存器(已初始化)的值,发现读出的数据在变化,请大神帮我看看程序!万分感谢!!

 

 

void init_ADE7754(void)                           //ADE7754初始化

{

 

  write_Data_8(0x0a, 0x04);   //OPMODE CF的输出不使能

  write_Data_8(0x0b, 0x10);   //mmode,相的选择,A:0x10;B:0x25;C:0x4a/0x70 ABC都选

  write_Data_8(0x0c, 0x08);      //Wavmode 第五位为0,累加有功电能

  write_Data_8(0x0d, 0x2d);   //Watmode 电能计算公式,A:0x24;B:0x12;C:0x09;ABC:0x3f

  write_Data_8(0x18,0x04);       //GAIN(绝对值求和)

  write_Data_16(0x0f, 0x0400);   //IRQEN 中断使能

  write_Data_16(0x13, 0x0004);   //LINCYC 累积周期4

  //write_Data_16(0x26, 0x0000);   //CF的输出频率

  write_Data_16(0x3d, 0x01f7);   //减小相间的耦合

 

}

 

 

 

void write_Data_8( char addr,int8 data)             //ADE7754写数据(8位)

{

  int8 i=16;

  int16 add=0;

  int16 buf1=0;

  add=0x80|addr;           //地址

  buf1=(add<<8)|data;

  IO0SET=CS_SPI;    

  IO0CLR=CS_SPI;      //通讯模式

  IO0SET=CLK_SPI;

  while(i)                      //发送地址和数据

  {

  IO0CLR=CLK_SPI;

  if(buf1&(1<<(i-1)))

  IO0SET=DIN_SPI;

  else

  IO0CLR=DIN_SPI;

  IO0SET=CLK_SPI;

  i--;

  }

  IO0CLR=CLK_SPI;

  IO0SET=CS_SPI;

}

 

 

 

int8 read_Data_8(char addr)         //读数据(8位)

{

  int8 data=0;

  int8 i=8;int8 j=8;

  IO0CLR=CLK_SPI;

  IO0CLR=CS_SPI;          

  IO0SET=CLK_SPI;               //write 要读的寄存器地址

  while(i)

  {

  IO0CLR=CLK_SPI;

  if(addr&(1<<(i-1)))

  IO0SET=DIN_SPI;

  else

  IO0CLR=DIN_SPI;

  IO0SET=CLK_SPI;

  i--;

  }

  IO0CLR=CLK_SPI;

  delay_5us();              //延时5us

  while(j)                      // 读数据

  {

  IO0SET=CLK_SPI;

  if(IO0PIN&DOUT_SPI)

  data|=1<<(i-1);

  IO0CLR=CLK_SPI;

  i--;

  }

  IO0SET=CS_SPI;

  return(data);

}

結果