OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15544|回复: 41

求助!STM32F103+ATT7022EU,读不到电压、电流、频率

[复制链接]

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2013-6-29
在线时间
24 小时
发表于 2014-11-9 19:35:25 | 显示全部楼层 |阅读模式
5金钱

各位大侠,我用STM32F103读取ATT7022E,只读各相电压、电流、频率,为何只能偶尔读取到(10次能读取到1次,显示各相电压为250多V,频率为50Hz);串口调试助手显示的内容也不稳定,有时某些寄存器内容正确,有时又不正确,重启后下一次又正确了。
请用过ATT7022E的朋友帮我看看代码,到底问题出在哪里?
按照《ATT7022EU应用笔记》中的描述,我检查了VCC、AVCC、VDD、REFCAP、RESET、IRQ引脚的电平,全部正常,说明芯片工作正常。
做项目,结尾阶段,最后卡在这里了,急啊!
请用过ATT7022E的朋友帮忙,万分感谢!


ATT7022E.h内容如下:

#ifndef _ATT7022EU_H_
#define _ATT7022EU_H_

#define RST_Port GPIOE //ATT7022EU与STM32连接用的RST引脚定义
#define CS_Port  GPIOA //ATT7022EU与STM32连接用的CS引脚定义(STM32输出数据至ATT7022EU)
#define SCL_Port GPIOA //ATT7022EU与STM32连接用的SCL引脚定义(STM32输出数据至ATT7022EU)
#define DATA_Port GPIOA //ATT7022EU与STM32连接用的DATA引脚定义(STM32输出数据至ATT7022EU)
#define DIN_Port GPIOA //ATT7022EU与STM32连接用的DIN引脚定义(ATT7022EU输出数据至STM32)

#define RST_Pin  GPIO_Pin_2 //ATT7022EU与STM32连接用的RST引脚定义
#define CS_Pin  GPIO_Pin_4 //ATT7022EU与STM32连接用的CS引脚定义(STM32输出数据至ATT7022EU)
#define SCL_Pin  GPIO_Pin_5 //ATT7022EU与STM32连接用的SCL引脚定义(STM32输出数据至ATT7022EU)
#define DATA_Pin GPIO_Pin_7 //ATT7022EU与STM32连接用的DATA引脚定义(STM32输出数据至ATT7022EU)
#define DIN_Pin  GPIO_Pin_6 //ATT7022EU与STM32连接用的DIN引脚定义(ATT7022EU输出数据至STM32)

#define Set_CS   GPIO_SetBits (CS_Port, CS_Pin)
#define Clr_CS   GPIO_ResetBits (CS_Port, CS_Pin)
#define Rev_CS   GPIO_WriteBit(CS_Port, CS_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(CS_Port, CS_Pin)))

#define Set_SCL   GPIO_SetBits (SCL_Port, SCL_Pin)
#define Clr_SCL   GPIO_ResetBits (SCL_Port, SCL_Pin)
#define Rev_SCL   GPIO_WriteBit(SCL_Port, SCL_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(SCL_Port, SCL_Pin)))

#define Set_DATA  GPIO_SetBits (DATA_Port, DATA_Pin)
#define Clr_DATA  GPIO_ResetBits (DATA_Port, DATA_Pin)
#define Rev_DATA  GPIO_WriteBit(DATA_Port, DATA_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(DATA_Port, DATA_Pin)))

#define Set_RST   GPIO_SetBits (RST_Port, RST_Pin)
#define Clr_RST   GPIO_ResetBits (RST_Port, RST_Pin)
#define Rev_RST   GPIO_WriteBit(RST_Port, LED54_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(RST_Port, RST_Pin)))

#define Rd_MISO   GPIO_ReadInputDataBit(DIN_Port, DIN_Pin)==1

#define r_Pflag   0x3D  //功率方向
#define R_Sflag   0x2C  //状态寄存器

#define r_Pa    0x01
#define r_Pb    0x02
#define r_Pc    0x03
#define r_Pt    0x04 //有功功率

#define r_Qa    0x05
#define r_Qb    0x06
#define r_Qc    0x07
#define r_Qt    0x08 //无功功率

#define r_Sa    0x09
#define r_Sb    0x0A
#define r_Sc    0x0B
#define r_St    0x0C //视在功率

#define r_UaRms   0x0D
#define r_UbRms   0x0E
#define r_UcRms   0x0F
#define r_UtRms   0x2B //电压有效值  

#define r_IaRms   0x10
#define r_IbRms   0x11
#define r_IcRms   0x12
#define r_ItRms   0x13  //电流有效值

#define r_Pfa    0x14
#define r_Pfb    0x15
#define r_Pfc    0x16
#define r_Pft    0x17 //功率因数

#define r_Freq   0x1C //线网频率

#define r_Epa    0x1E
#define r_Epb    0x1F
#define r_Epc    0x20
#define r_Ept    0x21 //累加型有功电能

#define r_Eqa    0x22
#define r_Eqb    0x23
#define r_Eqc    0x24
#define r_Eqt    0x25 //累加型无功电能

#define r_Epa2   0x31
#define r_Epb2   0x32
#define r_Epc2   0x33
#define r_Ept2   0x34 //清零型有功电能

#define r_Eqa2   0x35
#define r_Eqb2   0x36
#define r_Eqc2   0x37
#define r_Eqt2   0x38 //清零型无功电能

#define HFconst   0xA0 //高频输出参数

#define UADC    0xBF //电压通道增益

#define UgainA   0x9B
#define UgainB   0x9C
#define UgainC   0x9D //分相电压校准

#define IgainA   0x1A
#define IgainB   0x1B
#define IgainC   0x1C //分相电压校准

#define PgainB   0x05 //B相有功功率增益

// // #define Vu     0.190 //电压通道采样电压
// // #define Vi     0.003 //电流通道采样电压
// // #define Un     220  //额定电压
// // #define In     4.15 //额定电流

// // #define Meter_G   1.163 //ATT7022E常数

// // //#define Meter_HFConst ((2.592*1E10*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))

// // #define Meter_HFConst  ((2.592*pow(10,10)*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))

// // #define Meter_K     (2.592*pow(10,10)/(Meter_HFConst*Meter_Ec*pow(2,23)))

// // u16 Meter_Ec = 3200;   //电表常数,默认值为3200,应该根据实际测量误差更改!!!

typedef struct      //只需要读电压、电流和频率,其它暂不需要
{
// //  u32 P;      //有功功率
// //  float Rp;
// //  u32 Q;      //无功功率
// //  float Rq;
// //  u32 S;      //视在功率
// //  float Rs;
 u32 URms;        //电压有效值
 float Rurms;
 u32 IRms;        //电流有效值
 float Rirms;
// //  u32 Pf;      //功率因数
// //  float Rpf;
 u32 Freq;        //线网频率
 float Rfreq;
}DataTypeDef;

DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;

float PhaseA_I_Amp_Factor = 1.0;   //A相电流放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseB_I_Amp_Factor = 1.0;   //B相电流放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseC_I_Amp_Factor = 1.0;   //C相电流放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseT_I_Amp_Factor = 1.0;   //T相电流放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseA_V_Amp_Factor = 1.0;   //A相电压放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseB_V_Amp_Factor = 1.0;   //B相电压放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseC_V_Amp_Factor = 1.0;   //C相电压放大倍数,默认值为1.0,应该根据实际测量误差更改!!!
float PhaseT_V_Amp_Factor = 1.0;   //T相电压放大倍数,默认值为1.0,应该根据实际测量误差更改!!!

void delay_us1(u16 time);
u32 SPI_ATT_Read(u8 data);             //  SIG --> Sflag.7
void SPI_ATT_Write(u8 com_add,u32 data2);//  0xD3,0x000000 可进行软件复位
void ATT7022_Init(void);
void ATT_Adjust(void);
void ATT_Test(void);
void Read_ATT_AData(void);
void Read_ATT_BData(void);
void Read_ATT_CData(void);
void Read_ATT_TData(void);

void Output_ATT(DataTypeDef output);
void Read_ATT_TestData(void);

void Task_Monitor(void *pdata);

extern char *itoa(int value, char *string, int radix);

#endif

 

ATT7022E.c内容如下:

#include "ATT7022E.h"

//7022初始化
void ATT7022_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin = CS_Pin|SCL_Pin|DATA_Pin;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //复用推挽输出
 GPIO_Init(GPIOA,&GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = RST_Pin;
 GPIO_Init(GPIOE,&GPIO_InitStructure);

 Clr_SCL;
 
 GPIO_InitStructure.GPIO_Pin = DIN_Pin;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入
 GPIO_Init(DIN_Port,&GPIO_InitStructure);

 //硬件复位
 Clr_RST;
 delay_us1(50);
 Set_RST;
 delay_us1(600);
 
}

/*校表函数*/
void ATT_Adjust(void)
{
 u32 read1=0x55;

 SPI_ATT_Write(0xC3, 0x000000);  //清校表数据
 SPI_ATT_Write(0xC9, 0x00005A);  //打开校准数据写
 SPI_ATT_Write(0x01, 0xB9FE);   //填写模式配置寄存器
 SPI_ATT_Write(0x03, 0xF804);   //填写EMU单元配置寄存器
 SPI_ATT_Write(0x31, 0x3437);   //填写模拟模块使能寄存器
 SPI_ATT_Write(0x02, 0x0100);   //电压通道增益为2,其余各路ADC增益均为1
 SPI_ATT_Write(0x6D, 0xFF00);   //
 SPI_ATT_Write(0x6E, 0x0DB8);   //
 SPI_ATT_Write(0x6F, 0xD1DA);   //
 SPI_ATT_Write(UADC, 0x000000);  //电压通道增益为1
// SPI_ATT_Write(HFconst, 0x00016D);   //高频输出参数为1511
///*----------------------------------------
//    分相电压电流校准参数
//-----------------------------------------*/
// SPI_ATT_Write(UgainA, 0x000000);
// SPI_ATT_Write(UgainB, 0x000000);
// SPI_ATT_Write(UgainC, 0x8172F5);  //8483573
  SPI_ATT_Write(0xC9, 0x000001);    //关闭校准数据写
  SPI_ATT_Write(0xC6, 0x00005A);    //校表数据读出使能
  read1=SPI_ATT_Read(0x00);
  printf("\r\nIn 0xC6 with 0x5A: 0x00 is %x !\r\n",read1); //通过串口调试助手看,读到的值有时是5555,有时又是aaaa,为什么?
 printf("It should be 0x00AAAA !\r\n");
  read1=0x55;
  read1=SPI_ATT_Read(0x01);
  printf("\r\nModeCfg is %x !\r\n",read1); //通过串口调试助手看,读到的值有时是7c02,有时又是89aa,为什么?
 printf("It should be 0xB9FE !\r\n");
  read1=0x55;
  read1=SPI_ATT_Read(0x03);
  printf("\r\nEMUCfg is %x !\r\n",read1); //通过串口调试助手看,读到的值是f804,这个值读对了,为什么其它寄存器会读错?
 printf("It should be 0xF804 !\r\n");
  read1=0x55;
  read1=SPI_ATT_Read(0x31);
  printf("\r\nModuleCfg is %x !\r\n",read1); //通过串口调试助手看,读到的值有时是0,有时又是3527,为什么?
 printf("It should be 0x3437 !\r\n");
  read1=0x55;
  SPI_ATT_Write(0xC6, 0x000001);    //计量数据读出使能
  read1=SPI_ATT_Read(0x00);
  printf("\r\nIn 0xC6 without 0x5A: 0x00 is %x !\r\n",read1);  //通过串口调试助手看,读到的值有时是aaaa,有时又是7122a0,为什么?
 printf("We are using ATT7022EU, so it should be 0x7122A0/0x705200 !\r\n");
}

/*试验函数(为了避免main中太多代码而设)*/
void ATT_Test(void)
{
  u32 read=0x55;
  read=SPI_ATT_Read(0x00);
  printf("\r\nDevice ID is %x !\r\n",read);
 printf("ATT7022EU's device ID should be 0x7122A0 !\r\n");
  read=0x55;
  printf("\r\nReading A...\r\n");
  Read_ATT_AData();
  delay_ms(1000);
  delay_ms(1000);
  delay_ms(1000);
  printf("\r\nReading B...\r\n");
  Read_ATT_BData();
  delay_ms(1000);
  delay_ms(1000);
  delay_ms(1000);
  printf("\r\nReading C...\r\n");
  Read_ATT_CData();
  delay_ms(1000);
  delay_ms(1000);
  delay_ms(1000);
// printf("\r\nReading T...\r\n");
// Read_ATT_TData();
}


/*SPI读操作*/
u32 SPI_ATT_Read(u8 data)
{
  u8 i;
  u32 temp=0;
  Set_CS;
  Clr_SCL;
  Clr_CS;  //片选为低,开始操作
  for(i=0;i<8;i++)
  {
    Set_SCL;
    delay_us1(50);
    if(data&0x80)
      Set_DATA;
    else
      Clr_DATA;
    delay_us1(3);  //稳定数据
    Clr_SCL;
    delay_us1(50);
    data<<=1;   //左移数据
  }
  delay_us1(3);  //稳定数据
  for(i=0;i<24;i++)
  {
    temp<<=1;
    Set_SCL;
    delay_us1(50);
    if(Rd_MISO)
    temp|=0x01;
    Clr_SCL;
    delay_us1(50);
  }
  Set_CS;
  return (temp);
}

/*SPI写操作*/
void SPI_ATT_Write(u8 com_add,u32 data2)
{
  u8 i,data1;
  data1=0x80|com_add;
  Set_CS;
  Clr_SCL;
  Clr_CS;   //片选为低,开始操作
  for(i=0;i<8;i++)
  {
    Set_SCL;
    delay_us1(50);
    if(data1&0x80)
      Set_DATA;
    else
      Clr_DATA;
    delay_us1(3);
    Clr_SCL;
    delay_us1(50);
    data1<<=1;   //左移数据
  }
  for(i=0;i<24;i++)
  {
    Set_SCL;
    delay_us1(50);
    if(data2&0x00800000)
      Set_DATA;
    else
      Clr_DATA;
    delay_us1(3);
    Clr_SCL;
    delay_us1(50);
    data2<<=1;
  }
  Set_CS;
}

//以下为各相常用数据读取,暂时只需读取电压、电流、频率
void Read_ATT_AData(void)
{
// //   ADataTypeDef.P=SPI_ATT_Read(r_Pa);
// //   ADataTypeDef.Q=SPI_ATT_Read(r_Qa);
// //   ADataTypeDef.S=SPI_ATT_Read(r_Sa);
  ADataTypeDef.URms=SPI_ATT_Read(r_UaRms);
  ADataTypeDef.IRms=SPI_ATT_Read(r_IaRms);
// //   ADataTypeDef.Pf=SPI_ATT_Read(r_Pfa);
// //   ADataTypeDef.Freq=SPI_ATT_Read(r_Freq);
  ADataTypeDef.Rurms=ADataTypeDef.URms/8192.0*PhaseA_V_Amp_Factor;   //   2^10/2^23
  ADataTypeDef.Rirms=ADataTypeDef.IRms/8192.0*PhaseA_I_Amp_Factor;
// //   if(ADataTypeDef.Pf>0x800000)
// //   {
// //     ADataTypeDef.Rpf=0x1000000-ADataTypeDef.Pf;
// //     ADataTypeDef.Rpf=-((ADataTypeDef.Rpf/8388608.0)-((ADataTypeDef.Rpf/8388608.0)*PhaseA.Ph_compensation));
// //   }
// //   else
// //     ADataTypeDef.Rpf=(ADataTypeDef.Pf/8388608.0)-((ADataTypeDef.Pf/8388608.0)*PhaseA.Ph_compensation);
// //   ADataTypeDef.Rfreq=ADataTypeDef.Freq/8192.0;

//  Lcd_Clr();
//  sprintf(disp0,"A phase:");
//  Lcd_Puts(7,0,disp0);
//  Output_ATT(ADataTypeDef);
}

void Read_ATT_BData(void)
{
// //   BDataTypeDef.P=SPI_ATT_Read(r_Pb);
// //   BDataTypeDef.Q=SPI_ATT_Read(r_Qb);
// //   BDataTypeDef.S=SPI_ATT_Read(r_Sb);
  BDataTypeDef.URms=SPI_ATT_Read(r_UbRms);
  BDataTypeDef.IRms=SPI_ATT_Read(r_IbRms);
// //   BDataTypeDef.Pf=SPI_ATT_Read(r_Pfb);
// //   BDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
// //   if(BDataTypeDef.P>0x800000)
// //   {
// //     BDataTypeDef.Rp=0x1000000-BDataTypeDef.P;
// //     BDataTypeDef.Rp=-((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
// //       -((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation));  //2^15/2^23
// //   }
// //   else
// //     BDataTypeDef.Rp=(BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
// //       -((BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
// //   if(BDataTypeDef.Q>0x800000)
// //   {
// //     BDataTypeDef.Rq=0x1000000-BDataTypeDef.Q;
// //     BDataTypeDef.Rq=-((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
// //       -((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation));
// //   }
// //   else
// //     BDataTypeDef.Rq=(BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
// //       -((BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
// //   BDataTypeDef.Rs=BDataTypeDef.S/256.0;
  BDataTypeDef.Rurms=BDataTypeDef.URms/8192.0*PhaseB_V_Amp_Factor;   //   2^10/2^23
  BDataTypeDef.Rirms=BDataTypeDef.IRms/8192.0*PhaseB_I_Amp_Factor;
// //   if(BDataTypeDef.Pf>0x800000)
// //   {
// //     BDataTypeDef.Rpf=0x1000000-BDataTypeDef.Pf;
// //     BDataTypeDef.Rpf=-((BDataTypeDef.Rpf/8388608.0)-((BDataTypeDef.Rpf/8388608.0)*PhaseB.Ph_compensation));
// //   }
// //   else
// //     BDataTypeDef.Rpf=(BDataTypeDef.Pf/8388608.0)-((BDataTypeDef.Pf/8388608.0)*PhaseB.Ph_compensation);
// //   BDataTypeDef.Rfreq=BDataTypeDef.Freq/8192.0;

//  Lcd_Clr();
//  sprintf(disp0,"B phase:");
//  Lcd_Puts(7,0,disp0);
//  Output_ATT(BDataTypeDef);
}

void Read_ATT_CData(void)
{
// //   CDataTypeDef.P=SPI_ATT_Read(r_Pc);
// //   CDataTypeDef.Q=SPI_ATT_Read(r_Qc);
// //   CDataTypeDef.S=SPI_ATT_Read(r_Sc);
  CDataTypeDef.URms=SPI_ATT_Read(r_UcRms);
  CDataTypeDef.IRms=SPI_ATT_Read(r_IcRms);
// //   CDataTypeDef.Pf=SPI_ATT_Read(r_Pfc);
// //   CDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
// //   if(CDataTypeDef.P>0x800000)
// //   {
// //     CDataTypeDef.Rp=0x1000000-CDataTypeDef.P;
// //     CDataTypeDef.Rp=-((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
// //       -((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation));    //2^15/2^23
// //   }
// //   else
// //     CDataTypeDef.Rp=(CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
// //       -((CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
// //   if(CDataTypeDef.Q>0x800000)
// //   {
// //     CDataTypeDef.Rq=0x1000000-CDataTypeDef.Q;
// //     CDataTypeDef.Rq=-((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
// //       -((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation));
// //   }
// //   else
// //     CDataTypeDef.Rq=(CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
// //       -((CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
// //   CDataTypeDef.Rs=CDataTypeDef.S/256.0;
  CDataTypeDef.Rurms=CDataTypeDef.URms/8192.0*PhaseC_V_Amp_Factor;   //   2^10/2^23
  CDataTypeDef.Rirms=CDataTypeDef.IRms/8192.0*PhaseC_I_Amp_Factor;
// //   if(CDataTypeDef.Pf>0x800000)
// //   {
// //     CDataTypeDef.Rpf=0x1000000-CDataTypeDef.Pf;
// //     CDataTypeDef.Rpf=-((CDataTypeDef.Rpf/8388608.0)-((CDataTypeDef.Rpf/8388608.0)*PhaseC.Ph_compensation));
// //   }
// //   else
// //     CDataTypeDef.Rpf=(CDataTypeDef.Pf/8388608.0)-((CDataTypeDef.Pf/8388608.0)*PhaseC.Ph_compensation);
// //   CDataTypeDef.Rfreq=CDataTypeDef.Freq/8192.0;

//  Lcd_Clr();
//  sprintf(disp0,"C phase:");
//  Lcd_Puts(7,0,disp0);
//  Output_ATT(CDataTypeDef);
}

void Read_ATT_TData(void)
{
// //   TDataTypeDef.P=SPI_ATT_Read(r_Pt);
// //   TDataTypeDef.Q=SPI_ATT_Read(r_Qt);
// //   TDataTypeDef.S=SPI_ATT_Read(r_St);
  TDataTypeDef.URms=SPI_ATT_Read(r_UtRms);
  TDataTypeDef.IRms=SPI_ATT_Read(r_ItRms);
// //   TDataTypeDef.Pf=SPI_ATT_Read(r_Pft);
  TDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
// //   if(TDataTypeDef.P>0x800000)
// //   {
// //    TDataTypeDef.Rp=0x1000000-TDataTypeDef.P;
// //    TDataTypeDef.Rp=-(TDataTypeDef.Rp/64.0);    //2^17/2^23
// //   }
// //   else
// //    TDataTypeDef.Rp=TDataTypeDef.P/64.0;
// //   if(TDataTypeDef.Q>0x800000)
// //   {
// //    TDataTypeDef.Rq=0x1000000-TDataTypeDef.Q;
// //    TDataTypeDef.Rq=-(TDataTypeDef.Rq/64.0);
// //   }
// //   else
// //    TDataTypeDef.Rq=TDataTypeDef.Q/64.0;
// //   TDataTypeDef.Rs=TDataTypeDef.S/64.0;
  TDataTypeDef.Rurms=TDataTypeDef.URms/8192.0*PhaseT_V_Amp_Factor;   //2^10/2^23
  TDataTypeDef.Rirms=TDataTypeDef.IRms/8192.0*PhaseT_I_Amp_Factor;
// //   if(TDataTypeDef.Pf>0x800000)
// //   {
// //    TDataTypeDef.Rpf=0x1000000-TDataTypeDef.Pf;
// //    TDataTypeDef.Rpf=-(TDataTypeDef.Rpf/8388608.0);
// //   }
// //   else
// //    TDataTypeDef.Rpf=TDataTypeDef.Pf/8388608.0;
  TDataTypeDef.Rfreq=TDataTypeDef.Freq/8192.0;

// //   Output_ATT(TDataTypeDef);
}

未完,接下面

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2013-6-29
在线时间
24 小时
 楼主| 发表于 2014-11-9 19:37:29 | 显示全部楼层
/********************************************************************************************************** 
** Function name:      Task_Monitor
** Descriptions:       UCOS任务
** input parameters:   void *pdata
** output parameters:  无
** Returned value:     无
**********************************************************************************************************/
void Task_Monitor(void *pdata)
{
...... //无关代码省略了

char  AURms_chars[] = {0,0,0,0,0,0,0};
char  BURms_chars[] = {0,0,0,0,0,0,0};
char  CURms_chars[] = {0,0,0,0,0,0,0};
char  TURms_chars[] = {0,0,0,0,0,0,0};
char  AIRms_chars[] = {0,0,0,0,0,0};
char  BIRms_chars[] = {0,0,0,0,0,0};
char  CIRms_chars[] = {0,0,0,0,0,0};
char  TIRms_chars[] = {0,0,0,0,0,0};
char  Freq_chars[] = {0,0,0,0,0,0};

//初始化ATT7022EU
printf("\r\nInitializing ATT7022EU...\r\n");
ATT7022_Init();
delay_ms(100);
printf("\r\nATT7022EU initializing Finished!\r\n");

printf("\r\nAdjusting ATT7022EU...\r\n");
ATT_Adjust();
delay_ms(100);
printf("\r\nATT7022EU Adjusting Finished!\r\n");

//ATT_Test();

while(1) //每1秒钟读取一次ATT7022EU,更新显示一次
{
Read_ATT_AData(); //读取ATT7022EU的数据
Read_ATT_BData();
Read_ATT_CData();
Read_ATT_TData();

sprintf(AURms_chars,"%3.2f",(float)(ADataTypeDef.Rurms)); //float转char[]
sprintf(BURms_chars,"%3.2f",(float)(BDataTypeDef.Rurms));
sprintf(CURms_chars,"%3.2f",(float)(CDataTypeDef.Rurms));
sprintf(TURms_chars,"%3.2f",(float)(TDataTypeDef.Rurms));
sprintf(AIRms_chars,"%2.2f",(float)(ADataTypeDef.Rirms));
sprintf(BIRms_chars,"%2.2f",(float)(BDataTypeDef.Rirms));
sprintf(CIRms_chars,"%2.2f",(float)(CDataTypeDef.Rirms));
sprintf(TIRms_chars,"%2.2f",(float)(TDataTypeDef.Rirms));
sprintf(Freq_chars,"%2.2f",(float)(TDataTypeDef.Rfreq));

TEXT_SetText(hTextelse[10],AURms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[11],BURms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[12],CURms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[13],TURms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[17],AIRms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[18],BIRms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[19],CIRms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[20],TIRms_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)
TEXT_SetText(hTextelse[22],Freq_chars); //显示从ATT7022读取到的值,为什么读不到数值?(10次能读取到1次,显示各相电压为250多V,频率为50Hz)

//根据从ATT7022读取到的值做出判断
if(((float)(ADataTypeDef.Rurms) > 100.00) && ((float)(BDataTypeDef.Rurms) > 100.00) && ((float)(CDataTypeDef.Rurms) > 100.00) )
{
......//省略了无关代码
}

OSTimeDlyHMSM(0,0,1,0); //每1秒钟刷新一次
}
}


void Output_ATT(DataTypeDef output)
{
printf("\r\n********************\r\n");
// //  printf("\r\nP = %x !\r\n",output.P);
// //  printf("\r\n    %f !\r\n",output.Rp);
// //  printf("\r\nQ = %x !\r\n",output.Q);
// //  printf("\r\n    %f !\r\n",output.Rq);
// //  printf("\r\nS = %x !\r\n",output.S);
// //  printf("\r\n    %f !\r\n",output.Rs);
printf("\r\nURms = %x !\r\n",output.URms);
printf("\r\n       %f !\r\n",output.Rurms);
printf("\r\nIRms = %x !\r\n",output.IRms);
printf("\r\n       %f !\r\n",output.Rirms);
// //  printf("\r\nPf = %x !\r\n",output.Pf);
// //  printf("\r\n     %f !\r\n",output.Rpf);
printf("\r\nFreq = %x !\r\n",output.Freq);
printf("\r\n       %f !\r\n",output.Rfreq);
printf("\r\n********************\r\n");
}

void delay_us1(u16 time) //这个延时函数没问题吧?
{    
   u16 i=0;  
   while(time--)
   {
      i=10;  //自己定义
      while(i--);    
   }
}


串口调试助手显示如下:

第1次:

Initializing ATT7022EU...

ATT7022EU initializing Finished!

Adjusting ATT7022EU...

In 0xC6 with 0x5A: 0x00 is 5555 ! //为什么读到的值是错误的?
It should be 0x00AAAA !

ModeCfg is 7c02 ! //为什么读到的值是错误的?
It should be 0xB9FE !

EMUCfg is f804 ! //为什么这个值读取正确?
It should be 0xF804 !

ModuleCfg is 0 ! //为什么读到的值是错误的?
It should be 0x3437 !

In 0xC6 without 0x5A: 0x00 is aaaa ! //为什么读到的值是错误的?
We are using ATT7022EU, so it should be 0x7122A0/0x705200 !

ATT7022EU Adjusting Finished!

------------------------------------------------------------
第2次:

Initializing ATT7022EU...

ATT7022EU initializing Finished!

Adjusting ATT7022EU...

In 0xC6 with 0x5A: 0x00 is aaaa ! //为什么上一次读取错误,这次读到的值又是正确的?
It should be 0x00AAAA !

ModeCfg is 89aa ! //为什么读到的值是错误的?
It should be 0xB9FE !

EMUCfg is f804 ! //为什么这个值读取正确?
It should be 0xF804 !

ModuleCfg is 3527 ! //为什么读到的值是错误的?
It should be 0x3437 !

In 0xC6 without 0x5A: 0x00 is 7122a0 ! //为什么上一次读取错误,这次读到的值又是正确的?
We are using ATT7022EU, so it should be 0x7122A0/0x705200 !

ATT7022EU Adjusting Finished!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-9 21:28:02 | 显示全部楼层
帮顶....
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-9 21:54:43 | 显示全部楼层
建议楼主jtag仿真找问题
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-25 16:54:02 | 显示全部楼层
请问像这种stm32外接具有spi接口的ic,对他进行spi读写是不是像上面的操作就行,不用按照下面开发板例程那样配置吗? 
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置 SPI 全双工 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;          //设置 SPI 工作模式:设置为主 SPI 
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;         // 8 位帧结构 
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;            //选择了串行时钟的稳态:时钟悬空低 
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;            //数据捕获于第二个时钟沿 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS 信号由软件管理 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;         //数据传输从 MSB 位开始 
SPI_InitStructure.SPI_CRCPolynomial = 7;                   //CRC 值计算的多项式 
SPI_Init(SPI2, &SPI_InitStructure); //            根据指定的参数初始化外设 SPIx 寄存器 

SPI_Cmd(SPI2, ENABLE); //使能 SPI 外设
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-25 18:28:14 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------

原子哥,请问像这种stm32外接具有spi接口的ic,对ic进行spi读写是不是像上面的操作就行,上面初始化只有配置io口模式而已,不用按照下面开发板例程那样配置吗?  
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置 SPI 全双工  
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;          //设置 SPI 工作模式:设置为主 SPI  
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;         // 8 位帧结构  
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;            //选择了串行时钟的稳态:时钟悬空低  
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;            //数据捕获于第二个时钟沿  
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS 信号由软件管理  
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256  
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;         //数据传输从 MSB 位开始  
SPI_InitStructure.SPI_CRCPolynomial = 7;                   //CRC 值计算的多项式  
SPI_Init(SPI2, &SPI_InitStructure); //            根据指定的参数初始化外设 SPIx 寄存器  

SPI_Cmd(SPI2, ENABLE); //使能 SPI 外设
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-25 22:21:52 | 显示全部楼层
回复【6楼】zzj:
---------------------------------
根据ic的数据手册SPI特性来配置SPI,然后根据IC的指令说明,去初始化/读写IC。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-26 09:24:04 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
就是说楼主的spi初始化其实不完整对吧?应该像上面我说的那样需要配置stm32的spi工作模式(主从),帧格式这些吧?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-26 22:31:23 | 显示全部楼层
回复【8楼】zzj:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-29 09:02:52 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
好的,謝原子哥!
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-10-6
在线时间
0 小时
发表于 2015-10-30 18:20:26 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥您有7022e的初始化程序么,包括寄存器的配置?不甚感激。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-30 19:10:47 | 显示全部楼层
回复【11楼】masosam:
---------------------------------
没有哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-10-6
在线时间
0 小时
发表于 2015-11-2 11:57:46 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
原子哥,下面是我的初始化程序,先不考虑电压电流功率校准。除了id不是0,其他都是0.不知哪里出了问题。
void SPI1_Init(void)//spi初始化
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
    
    RCC_APB2PeriphClockCmd(SPI_CLK_CLK|SPI_MISO_CLK|SPI_MOSI_CLK|SPI_CLK,ENABLE);
      
    //CS
    Dioout_Init(OUT_SPI_CS);//CS高

    //CLK MOSI 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin=SPI_CLK_PIN|SPI_MOSI_PIN|SPI_MISO_PIN;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    GPIO_SetBits(GPIOA,SPI_CLK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin=SPI_MISO_PIN;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
    SPI_InitStructure.SPI_CRCPolynomial=7;
    SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
    SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
    SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
    
    SPI_Init(SPI_ATT,&SPI_InitStructure);
    SPI_Cmd(SPI_ATT,ENABLE);
}

uint32_t SPI_ReadReg(uint8_t reg)//读寄存器
{
    uint32_t regval=0;
    ATT_CHOOSE;       
    SPI_ReadWrite(reg); 
    vDly_Timeus(3);
    regval |= (SPI_ReadWrite(reg)<<16);
    regval |= (SPI_ReadWrite(reg)<<8);
    regval |=  SPI_ReadWrite(reg);
    ATT_RELEASE;
    
    return regval;
}

void SPI_WriteReg(uint8_t reg,uint32_t data)//写寄存器
{   
    ATT_CHOOSE;
    SPI_ReadWrite(reg);
    SPI_ReadWrite((data>>16)&0xff);
    SPI_ReadWrite((data>>8)&0xff);
    SPI_ReadWrite(data&0xff);   
    ATT_RELEASE;
}

void ATT_Init(void)
{
    uint16_t c=1000;
    SPI1_Init();
    Dioout_Init(OUT_ATT_SEL);//三相四线
    Dioout_Init(OUT_S1);
    Dioout_Init(OUT_S2);
    vDly_Timeus(100000);
    
    SPI_WriteReg(W_RESET,0x000000);//复位       
    vDly_Timeus(100000);
    
    SPI_WriteReg(W_CALWREN,0x00005A);//校表写使能
    vDly_Timeus(10000);

    SPI_WriteReg(0x81,0xB9FE);//写模式配置寄存器
    vDly_Timeus(10000);
    SPI_WriteReg(0x83,0xF804);//EMU
    vDly_Timeus(10000);
    SPI_WriteReg(0xb1,0x3d27);//模拟模块
    vDly_Timeus(10000); 
    SPI_WriteReg(0xc6,0xffffa5);//使能计量读
    
    vDly_Timeus(10000);  
    
    id=SPI_ReadReg(R_ID);//读的ID是0x1c49a8
 
   SPI_WriteReg(0xc6,0x00005A);//读校表。读刚配置的寄存器值,都是0
   vDly_Timeus(10000);
   
   id=SPI_ReadReg(0x00);//校表ID还是1c49a8
   vDly_Timeus(10000);
   
   id=SPI_ReadReg(0x01);//0
   vDly_Timeus(10000);
   
   id=SPI_ReadReg(0x02);//0
   vDly_Timeus(10000);
   
   id=SPI_ReadReg(0x03);//0
   vDly_Timeus(10000);
   
   id=SPI_ReadReg(0x31);//0
   vDly_Timeus(10000);
   
   SPI_WriteReg(0xc6,0xffffa5);//0
   vDly_Timeus(10000);
   
   SPI_WriteReg(W_CALWREN,0xFFFF00);//关校表使能
   vDly_Timeus(10000); 
}
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-8-3
在线时间
4 小时
发表于 2015-11-26 11:10:30 | 显示全部楼层
请问你的STM32的SPI与ATT7022是直连的吗?
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2015-11-30 00:14:50 | 显示全部楼层
感觉还是你的SPI设置有问题。明天我把我的程序放上来。我6月份时写过ATT7022E的程序。
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2015-11-30 00:17:25 | 显示全部楼层
[mw_shl_code=c,true]void SPI1_Init(void) { RCC->APB2ENR|=1<<12; //SPI1时钟使能 //这里只针对SPI口初始化 GPIOA->CRL&=0X000FFFFF; GPIOA->CRL|=0XB8B00000; //PA5.6.7?? GPIOC->CRL&=0XFFF0FFFF; //PC4(CS)设置成输出,上拉 GPIOC->CRL|=0X00030000; GPIOC->ODR|=0X1<<4; SPI1->CR1|=0<<10; //全双工模式 SPI1->CR1|=1<<9; //软件nss管理 SPI1->CR1|=1<<8; SPI1->CR1|=1<<2; //SPI主机 SPI1->CR1|=0<<11; //8bit数据格式 SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 SPI1->CR1|=1<<3; //Fsck=Fpclk1/4 SPI1->CR1|=0<<7; //MSBfirst SPI1->CR1|=1<<6; //SPI设备使能 SPI1_ReadWriteByte(0xff);//启动传输 } u8 SPI1_ReadWriteByte(u8 TxData) { while((SPI1->SR&1<<1)==0); //等待发送区空 SPI1->DR=TxData; //发送一个byte while((SPI1->SR&1<<0)==0); //等待接收完一个byte return SPI1->DR; //返回收到的数据 } u32 readSPI(u8 SPI_CMD) { u32 temp; u8 i,a[3]; SPI_CS = 0 ; SPI1_ReadWriteByte(SPI_CMD); delay_us(3); for(i=0;i<3;i++){ a=SPI1_ReadWriteByte(0xff); } temp=a[0]; temp=(temp<<8)+a[1]; temp=(temp<<8)+a[2]; SPI_CS = 1 ; return temp; } void WriteSPI(u8 SPI_CMD,u32 dwData) { u8 i,b[3]; SPI_CS = 0 ; b[0]=dwData>>16; b[1]=dwData>>8; b[2]=dwData; SPI1_ReadWriteByte(SPI_CMD); for(i=0;i<3;i++) b=SPI1_ReadWriteByte(b); SPI_CS = 1 ; } u8 Read7022d(u8 Cmd,u32 *CH) { u32 Temp; *CH=readSPI(Cmd); Temp=readSPI(0x2D); if(Temp==(*CH)) return 1; else return 0; } u8 Write7022d(u8 Cmd,u32 dwData) { u32 Temp; WriteSPI(Cmd,dwData); delay_us(3); Temp=readSPI(0x2D); if((Temp==dwData)) return 1; else return 0; } void ATT7022E_Init(void) { u8 a[36]; u32 temp[12]; GPIOB->CRL&=0XFFFFFF00; //PB0/PB1(REST,WP)设置成输出,默认下拉 GPIOB->CRL|=0X00000015; GPIOC->CRL&=0XFF0FFFFF; //PC5(SIG)设置成输入 GPIOC->CRL|=0X00400000; REST=0; //复位ATT7022E delay_us(25); REST=1; delay_ms(25); while(SIG); Result=readSPI(0); AT24CXX_Read(0x00,a,36); while(!Write7022d(0x81,0xB9FE)); //设置配置寄存器 while(!Write7022d(0x83,0xF804)); //设置EMU单元配置寄存器 while(!Write7022d(0xB1,0x3427)); //模拟模块使能,开通高能滤波 while(!Write7022d(0x9E,0x1B6)); //高频脉冲输出参数 while(!Write7022d(0xB0,0x0002)); //设置数据更新中断使能 while(!Write7022d(0x9d,0x418)); //设置启动功率 temp[0]=(u32)(a[2])*0x10000+(u32)(a[1])*0x100+a[0]; //A Power temp[1]=(u32)(a[5])*0x10000+(u32)(a[4])*0x100+a[3]; //B Power temp[2]=(u32)(a[8])*0x10000+(u32)(a[7])*0x100+a[6]; //C Power temp[3]=(u32)(a[11])*0x10000+(u32)(a[10])*0x100+a[9]; //A PA temp[4]=(u32)(a[14])*0x10000+(u32)(a[13])*0x100+a[12]; //B PA temp[5]=(u32)(a[17])*0x10000+(u32)(a[16])*0x100+a[15]; //C PA temp[6]=(u32)(a[20])*0x10000+(u32)(a[19])*0x100+a[18]; //A Voltage temp[7]=(u32)(a[23])*0x10000+(u32)(a[22])*0x100+a[21]; //B Voltage temp[8]=(u32)(a[26])*0x10000+(u32)(a[25])*0x100+a[24]; //C Voltage temp[9]=(u32)(a[29])*0x10000+(u32)(a[28])*0x100+a[27]; //A Current temp[10]=(u32)(a[32])*0x10000+(u32)(a[31])*0x100+a[30]; //B Current temp[11]=(u32)(a[35])*0x10000+(u32)(a[34])*0x100+a[33]; //C Current while(!Write7022d(0x84,temp[0])); //A相功率校验寄存器 while(!Write7022d(0x87,temp[0])); //B相功率校验寄存器 while(!Write7022d(0x8a,temp[0])); //C相功率校验寄存器 while(!Write7022d(0x85,temp[1])); //A相相位补偿寄存器 while(!Write7022d(0x88,temp[1])); //B相相位补偿寄存器 while(!Write7022d(0x8b,temp[1])); //C相相位补偿寄存器 while(!Write7022d(0x86,temp[2])); //A while(!Write7022d(0x89,temp[2])); while(!Write7022d(0x8c,temp[2])); while(!Write7022d(0x8d,temp[3])); while(!Write7022d(0x90,temp[3])); while(!Write7022d(0x8e,temp[4])); //B while(!Write7022d(0x91,temp[4])); while(!Write7022d(0x9f,temp[5])); //C while(!Write7022d(0x92,temp[5])); while(!Write7022d(0x97,temp[6])); //A/B/C电压 while(!Write7022d(0x98,temp[7])); while(!Write7022d(0x99,temp[8])); while(!Write7022d(0x9a,temp[9])); //A/B/C电流 while(!Write7022d(0x9b,temp[10])); while(!Write7022d(0x9c,temp[11])); while(!Write7022d(0x00C5,0x000002)); //开启同步采样数据缓冲功能 while(!Write7022d(0x00C9,0x000001)); TIM4_Int_Init(1139,35999); } void ProcessATT7022E(void) { while(!Read7022d(CurrentA_ADDR,&Data.CurrentA)); while(!Read7022d(CurrentB_ADDR,&Data.CurrentB)); while(!Read7022d(CurrentC_ADDR,&Data.CurrentC)); Data.CurrentA=Data.CurrentA*100/8192; Data.CurrentB=Data.CurrentB*100/8192; Data.CurrentC=Data.CurrentC*100/8192; while(!Read7022d(VoltageA_ADDR,&Data.VoltageA)); while(!Read7022d(VoltageB_ADDR,&Data.VoltageB)); while(!Read7022d(VoltageC_ADDR,&Data.VoltageC)); Data.VoltageA=Data.VoltageA*100/8192; Data.VoltageB=Data.VoltageB*100/8192; Data.VoltageC=Data.VoltageC*100/8192; while(!Read7022d(Power_ADDR, &Data.Energy[0])); while(!Read7022d(PowerA_ADDR,&Data.Energy[1])); while(!Read7022d(PowerB_ADDR,&Data.Energy[2])); while(!Read7022d(PowerC_ADDR,&Data.Energy[3])); if(Data.Energy[0]>0x800000){ Data.Energy[0]=~Data.Energy[0]+1; Data.Energy[0]=Data.Energy[0]&0x00ffffff; } Data.Energy[0]=Data.Energy[0]*K*2000; if(Data.Energy[1]>0x800000){ Data.Energy[1]=~Data.Energy[1]+1; Data.Energy[1]=Data.Energy[1]&0x00ffffff; } Data.Energy[1]=Data.Energy[1]*K*1000; if(Data.Energy[2]>0x800000){ Data.Energy[2]=~Data.Energy[2]+1; Data.Energy[2]=Data.Energy[2]&0x00ffffff; } Data.Energy[2]=Data.Energy[2]*K*1000; if(Data.Energy[3]>0x800000){ Data.Energy[3]=~Data.Energy[3]+1; Data.Energy[3]=Data.Energy[3]&0x00ffffff; } Data.Energy[3]=Data.Energy[3]*K*1000; while(!Read7022d(Repower_ADDR, &Data.ReEnergy[0])); while(!Read7022d(RepowerA_ADDR,&Data.ReEnergy[1])); while(!Read7022d(RepowerB_ADDR,&Data.ReEnergy[2])); while(!Read7022d(RepowerC_ADDR,&Data.ReEnergy[3])); if(Data.ReEnergy[0]>0x800000){ Data.ReEnergy[0]=~Data.ReEnergy[0]+1; Data.ReEnergy[0]=Data.ReEnergy[0]&0x00ffffff; } Data.ReEnergy[0]=Data.ReEnergy[0]*K*2000; if(Data.ReEnergy[1]>0x800000){ Data.ReEnergy[1]=~Data.ReEnergy[1]+1; Data.ReEnergy[1]=Data.ReEnergy[1]&0x00ffffff; } Data.ReEnergy[1]=Data.ReEnergy[1]*K*1000; if(Data.ReEnergy[2]>0x800000){ Data.ReEnergy[2]=~Data.ReEnergy[2]+1; Data.ReEnergy[2]=Data.ReEnergy[2]&0x00ffffff; } Data.ReEnergy[2]=Data.ReEnergy[2]*K*1000; if(Data.ReEnergy[3]>0x800000){ Data.ReEnergy[3]=~Data.ReEnergy[3]+1; Data.ReEnergy[3]=Data.ReEnergy[3]&0x00ffffff; } Data.ReEnergy[3]=Data.ReEnergy[3]*K*1000; while(!Read7022d(Frequency_C_ADDR,&Data.Frequency)); Data.Frequency=Data.Frequency*100/8192.0; while(!Read7022d(PF_ADDR, &Data.Phasy[0])); while(!Read7022d(PF_A_ADDR,&Data.Phasy[1])); while(!Read7022d(PF_B_ADDR,&Data.Phasy[2])); while(!Read7022d(PF_C_ADDR,&Data.Phasy[3])); if(Data.Phasy[0]>0x800000){ Data.Phasy[0]=~Data.Phasy[0]+1; Data.Phasy[0]=Data.Phasy[0]&0x00ffffff; } Data.Phasy[0]=(Data.Phasy[0]/8388608.0)*1000; if(Data.Phasy[1]>0x800000){ Data.Phasy[1]=~Data.Phasy[1]+1; Data.Phasy[1]=Data.Phasy[1]&0x00ffffff; } Data.Phasy[1]=(Data.Phasy[1]/8388608.0)*1000; if(Data.Phasy[2]>0x800000){ Data.Phasy[2]=~Data.Phasy[2]+1; Data.Phasy[2]=Data.Phasy[2]&0x00ffffff; } Data.Phasy[2]=(Data.Phasy[2]/8388608.0)*1000; if(Data.Phasy[3]>0x800000){ Data.Phasy[3]=~Data.Phasy[3]+1; Data.Phasy[3]=Data.Phasy[3]&0x00ffffff; } Data.Phasy[3]=(Data.Phasy[3]/8388608.0)*1000; readADC(); while(!Write7022d(0x00C5,0)); //关闭同步采样数据缓冲功能 while(!Write7022d(0x00C5,2)); //开启同步采样数据缓冲功能 } void readADC(void) { unsigned char i; for(i=0;i<64;i++){ ADC_BUF.ADC_VoltageA=readSPI(0x7f); ADC_BUF.ADC_VoltageB=readSPI(0x7f); ADC_BUF.ADC_VoltageC=readSPI(0x7f); ADC_BUF.ADC_CurrentA=readSPI(0x7f); ADC_BUF.ADC_CurrentB=readSPI(0x7f); ADC_BUF.ADC_CurrentC=readSPI(0x7f); ADC_BUF.ADC_CurrentN=readSPI(0x7f); } } [/mw_shl_code]

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-30 23:00:14 | 显示全部楼层
帮顶 。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-8-3
在线时间
4 小时
发表于 2015-12-11 15:53:24 | 显示全部楼层
回复【13楼】masosam:
---------------------------------
请问您调出来了吗?求指导
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2015-11-14
在线时间
42 小时
发表于 2016-4-25 15:03:00 | 显示全部楼层
xuyan021 发表于 2015-11-30 00:17
[mw_shl_code=c,true]void SPI1_Init(void)
{         
                        RCC-&gt;APB2ENR|=1&lt;&lt;12;           //SPI1时钟使能

首先感谢你奉献你的代码!请问你用粘贴出来的程序读出了ATT7022E中的电压、电流、功率数值吗?
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-4-26 08:17:15 | 显示全部楼层
我已经用到产品上了。
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-5-9 15:57:10 | 显示全部楼层
xuyan021 发表于 2015-11-30 00:17
[mw_shl_code=c,true]void SPI1_Init(void)
{         
                        RCC-&gt;APB2ENR|=1&lt;&lt;12;           //SPI1时钟使能

原子哥,能把您的程序借我参考吗?不甚感激
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-5-12 16:26:32 | 显示全部楼层
dudu9156 发表于 2014-11-9 19:37
/*************************************************************************************************** ...

请问楼主程序调好了吗?我现在也在弄ATT7022EU,出现了好多问题,想请教一下您,,
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
发表于 2016-5-16 11:07:55 | 显示全部楼层
最近一个项目也准备上ATT7022,我看大家的程序写校表数据有的写在0x81,0x83什么的,有的却是写在0x01,0x03什么的,这个是怎么回事啊
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-5
在线时间
2 小时
发表于 2016-6-5 11:24:44 | 显示全部楼层
xuyan021 发表于 2015-11-30 00:17
[mw_shl_code=c,true]void SPI1_Init(void)
{         
                        RCC-&gt;APB2ENR|=1&lt;&lt;12;           //SPI1时钟使能

您好,我有问题想详细请教您,能联系一下我吗?323241642万分感谢
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2015-11-14
在线时间
42 小时
发表于 2016-6-15 10:00:59 | 显示全部楼层
黄洪文 发表于 2016-5-12 16:26
请问楼主程序调好了吗?我现在也在弄ATT7022EU,出现了好多问题,想请教一下您,,

你好,请问一下你读出来的分相电流有效值如何处理得到实际的分相电流有效值。。。
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-6-15 11:57:44 | 显示全部楼层
只是那个明 发表于 2016-6-15 10:00
你好,请问一下你读出来的分相电流有效值如何处理得到实际的分相电流有效值。。。

[mw_shl_code=applescript,true]首先无信号输入的情况下进行电压电流offset校正,然后额定电压电流的时候计算增益校正写入增益寄存器里面,然后就可以直接读了,按照公式电压有效值/8192,电流有效值/8192/N[/mw_shl_code]
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-6-15 12:10:22 | 显示全部楼层
icefox225 发表于 2016-5-16 11:07
最近一个项目也准备上ATT7022,我看大家的程序写校表数据有的写在0x81,0x83什么的,有的却是写在0x01,0x03 ...

操作0x01,0x03什么的你要进行写操作就必须高位置一,0x81,0x83这样才能写操作
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2015-11-14
在线时间
42 小时
发表于 2016-6-15 20:16:19 | 显示全部楼层
黄洪文 发表于 2016-6-15 11:57
[mw_shl_code=applescript,true]首先无信号输入的情况下进行电压电流offset校正,然后额定电压电流的时候 ...

请问一下无信号输入情况下对电流电压进行offset校验后读出的值是接近于零吗?我的在offset校验后读出来的电压值与offset校验前的值变化不大,不等于零。。。。。。还有就是能不能帮我看一下我的初始化有没有问题。谢谢。。。
ATT_RESET=0;//硬件复位
delay_us(25);
ATT_RESET=1;
delay_ms(25);
SPI1_Write(0xC3,0x000000);   //清校表数据
SPI1_Write(0xC9,0x00005A);  //校表数据写使能
SPI1_Write(0x01,0xB9FE);       //模式选择
SPI1_Write(0x03,0xF804);      //EMU配置
SPI1_Write(0x31,0x3427);      //模拟模块使能
SPI1_Write(0x1E,0x00016D);  //高频脉冲输出参数
       
SPI1_Write(0x02,0x00000100);  //ADC增益

//   SPI1_Write(0xA4,0x0037);    //A相电压OFFset校正
//   SPI1_Write(0xA5,0xDF7E2D);   //B相电压OFFset校正
//   SPI1_Write(0xA6,0x0040);      //C相电压OFFset校正

//   SPI1_Write(0x97,0xC278);    //A电压增益校正
//     SPI1_Write(0x98,0x4066);  //B电压增益校正
//   SPI1_Write(0x99,0x0000F47A);  //电压增益校正

//   SPI1_Write(0xA7,0x000E);    //A相电流OFFset校正
//     SPI1_Write(0xA8,0x000E);  //B相电流OFFset校正
//   SPI1_Write(0xA9,0x0007);   //C相电流OFFset校正
                   
//   SPI1_Write(0x9A,0x85B4);   //A电流增益校正
//     SPI1_Write(0x9B,0x1ECF);  //B电流增益校正
//   SPI1_Write(0x9C,0x85B5);    //C电流增益校正
                 
SPI1_Write(0xC9,0x000001);     //关闭校验数据写
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-6-16 09:20:13 | 显示全部楼层
本帖最后由 黄洪文 于 2016-6-16 09:25 编辑
只是那个明 发表于 2016-6-15 20:16
请问一下无信号输入情况下对电流电压进行offset校验后读出的值是接近于零吗?我的在offset校验后读出来的 ...

是接近于0的,offset校正完你再读一下是接近0的,
复位之后要延时大概25ms方可写入校表数据,
除了特殊寄存器外写其他校表寄存器的时候需要将地址高位置一吧?如模式配置寄存器地址0x01要变成0x81才能写,,模式配置寄存器默认没有开启电压通道ADC,需要配置低8位,,,
高频脉冲常数需要计算,,其他的应该没什么了还有配置完延时个650ms左右吧,
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2015-11-14
在线时间
42 小时
发表于 2016-6-21 16:16:09 | 显示全部楼层
黄洪文 发表于 2016-6-16 09:20
是接近于0的,offset校正完你再读一下是接近0的,
复位之后要延时大概25ms方可写入校表数据,
除了特殊 ...

谢谢,之前的那个问题解决了。。。现在还有一点疑惑,能帮忙解答一下吗? QQ截图20160621161148.png QQ截图20160621161158.png 在功率增益补偿校正时,,这里出现了标准表上读出误差为err%。。。这个err%完全不知道在哪儿读取????
回复

使用道具 举报

12

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-5-9
在线时间
70 小时
发表于 2016-6-22 08:56:59 | 显示全部楼层
只是那个明 发表于 2016-6-21 16:16
谢谢,之前的那个问题解决了。。。现在还有一点疑惑,能帮忙解答一下吗?在功率增益补偿校正时,,这里出 ...

[mw_shl_code=applescript,true]这个应该是三相标准源给额定的功率然后对照标准表测出来的功率计算的误差吧 。我之前做这个项目公司条件有限没有标准源,我是直接拿 [寄存器计算的功率-实际的功率(我没有标准源也是估算的,呵呵)]/实际的功率  


能帮我测下告诉我你这个7022EU的频率这块吗?就是你开启电压通道ADC,然后在不加信号的情况下看看频率寄存器的值带入频率计算看看等于多少?我之前的这个频率值一直很迷惑,我是等于50的,不等于0,加了380V的信号也是50,不知道是不是说默认值就是50,,,帮我验证一下,谢谢[/mw_shl_code]
回复

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2015-11-14
在线时间
42 小时
发表于 2016-6-22 09:23:54 | 显示全部楼层
黄洪文 发表于 2016-6-22 08:56
[mw_shl_code=applescript,true]这个应该是三相标准源给额定的功率然后对照标准表测出来的功率计算的误差 ...

不加信号的情况下读取频率为50Hz,看来它默认是50Hz,我加信号后读取是49.98Hz。。
回复

使用道具 举报

5

主题

25

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-6-29
在线时间
17 小时
发表于 2016-6-29 13:43:43 | 显示全部楼层
我想问一下ATT7022CU,如果不校表的,可不可以,精度相差大不大,希望做过这个芯片驱动的回答!
回复

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2015-5-18
在线时间
25 小时
发表于 2016-8-18 20:35:53 | 显示全部楼层
xuyan021 发表于 2016-4-26 08:17
我已经用到产品上了。

您好,我现在在调试ATT7022E,可以把您之前调试过的代码给我发一份嘛,万分感谢了!!付费也是可以的哦
如果我不能,我就一定要,如果我一定要,我就一定能!
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-8-19 08:02:22 | 显示全部楼层
xcwtony2015 发表于 2016-8-18 20:35
您好,我现在在调试ATT7022E,可以把您之前调试过的代码给我发一份嘛,万分感谢了!!付费也是可以的哦

你就在论坛上搜下。
回复

使用道具 举报

11

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2015-5-18
在线时间
25 小时
发表于 2016-8-19 09:01:31 | 显示全部楼层
xuyan021 发表于 2016-8-19 08:02
你就在论坛上搜下。

恩,搜过了,但是不是完整的,有些看不明白,工程文件可以查看定义和宏之类的,谢谢您了!!可以给我份嘛,芯片手册看的是云里雾里的,QQ:1079963141@qq.com
如果我不能,我就一定要,如果我一定要,我就一定能!
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2012-12-8
在线时间
30 小时
发表于 2017-3-8 16:38:10 | 显示全部楼层
for(i=0;i<24;i++)   {     temp<<=1;     Set_SCL;     delay_us1(50);     if(Rd_MISO)     temp|=0x01;     Clr_SCL;     delay_us1(50);   }   Set_CS;   return (temp); }  我一直没明白这个for(i=0;i<24;i++) 是在干神马!!!!
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-4-19
在线时间
3 小时
发表于 2017-4-19 17:51:39 | 显示全部楼层
[mw_shl_code=c,true]
#include "ATT7022B.h"

extern void delay_us(int n);
//&#182;¨ò&#229;ATT7022Bê1ó&#195;μ&#196;SPI&#189;ó&#191;ú
#define ATT7022B_SPI SPI1

/* oê,ó&#195;óú&#182;¨ò&#229;èy&#184;&#246;ATT7022Bμ&#196;&#198;&#172;&#209;&#161;òy&#189;&#197; */
#define RCC_APB2Periph_GPIO_SPI_ATT7022B_CS1        RCC_APB2Periph_GPIOA
#define SPI_ATT7022B_CS1_PORT                        GPIOA
#define SPI_ATT7022B_CS1_PIN                        GPIO_Pin_3

#define RCC_APB2Periph_GPIO_SPI_ATT7022B_CS2        RCC_APB2Periph_GPIOC
#define SPI_ATT7022B_CS2_PORT                        GPIOC
#define SPI_ATT7022B_CS2_PIN                        GPIO_Pin_14

#define RCC_APB2Periph_GPIO_SPI_ATT7022B_CS3        RCC_APB2Periph_GPIOB
#define SPI_ATT7022B_CS3_PORT                        GPIOB
#define SPI_ATT7022B_CS3_PIN                        GPIO_Pin_8

#define SPI_ATT7022B_CS1_LOW()       GPIO_ResetBits(SPI_ATT7022B_CS1_PORT, SPI_ATT7022B_CS1_PIN)
#define SPI_ATT7022B_CS1_HIGH()      GPIO_SetBits(SPI_ATT7022B_CS1_PORT, SPI_ATT7022B_CS1_PIN)

#define SPI_ATT7022B_CS2_LOW()       GPIO_ResetBits(SPI_ATT7022B_CS2_PORT, SPI_ATT7022B_CS2_PIN)
#define SPI_ATT7022B_CS2_HIGH()      GPIO_SetBits(SPI_ATT7022B_CS2_PORT, SPI_ATT7022B_CS2_PIN)

#define SPI_ATT7022B_CS3_LOW()       GPIO_ResetBits(SPI_ATT7022B_CS3_PORT, SPI_ATT7022B_CS3_PIN)
#define SPI_ATT7022B_CS3_HIGH()      GPIO_SetBits(SPI_ATT7022B_CS3_PORT, SPI_ATT7022B_CS3_PIN)

/* oê,ó&#195;óú&#182;¨ò&#229;èy&#184;&#246;ATT7022Bμ&#196;IRQòy&#189;&#197; */               
#define RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ1        RCC_APB2Periph_GPIOA
#define ATT7022B_RESET_IRQ1_PORT                GPIOA
#define ATT7022B_RESET_IRQ1_PIN                        GPIO_Pin_4

#define RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ2        RCC_APB2Periph_GPIOC
#define ATT7022B_RESET_IRQ2_PORT                GPIOC
#define ATT7022B_RESET_IRQ2_PIN                        GPIO_Pin_15

#define RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ3        RCC_APB2Periph_GPIOB
#define ATT7022B_RESET_IRQ3_PORT                GPIOB
#define ATT7022B_RESET_IRQ3_PIN                        GPIO_Pin_9

/* oê,ó&#195;óú&#182;¨ò&#229;èy&#184;&#246;ATT7022Bμ&#196;Resetòy&#189;&#197; */               
#define RCC_APB2Periph_GPIO_ATT7022B_RESET                        RCC_APB2Periph_GPIOB
#define ATT7022B_RESET_PORT                                        GPIOB
#define ATT7022B_RESET_PIN                                        GPIO_Pin_0

/********************************************************************************
*ATT7022Bμ&#196;IO&#191;ú3&#245;ê&#188;&#187;ˉoˉêy
*ê&#228;è&#235;£o&#206;T
*·μ&#187;&#216;£o&#206;T
*******************************************************************************/
void ATT7022B_IOInit(void)
{

  GPIO_InitTypeDef GPIO_InitStructure;

        //CS1-CS3 IO init
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_SPI_ATT7022B_CS1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_SPI_ATT7022B_CS2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_SPI_ATT7022B_CS3, ENABLE);

  GPIO_InitStructure.GPIO_Pin = SPI_ATT7022B_CS1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(SPI_ATT7022B_CS1_PORT, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin =SPI_ATT7022B_CS2_PIN;
  GPIO_Init(SPI_ATT7022B_CS2_PORT, &GPIO_InitStructure);
       
  GPIO_InitStructure.GPIO_Pin = SPI_ATT7022B_CS3_PIN;
  GPIO_Init(SPI_ATT7022B_CS3_PORT, &GPIO_InitStructure);
       
  SPI_ATT7022B_CS1_HIGH();
        SPI_ATT7022B_CS2_HIGH();
        SPI_ATT7022B_CS2_HIGH();
       
        //ATT7022B IRQ IO(IRQ1-IRQ3) init
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_ATT7022B_RESET_IRQ3, ENABLE);

  GPIO_InitStructure.GPIO_Pin = ATT7022B_RESET_IRQ1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ATT7022B_RESET_IRQ1_PORT, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = ATT7022B_RESET_IRQ2_PIN;
  GPIO_Init(ATT7022B_RESET_IRQ2_PORT, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = ATT7022B_RESET_IRQ3_PIN;
  GPIO_Init(ATT7022B_RESET_IRQ3_PORT, &GPIO_InitStructure);
       
//        GPIO_SetBits(ATT7022B_RESET_IRQ1_PORT, ATT7022B_RESET_IRQ1_PIN);
//        GPIO_SetBits(ATT7022B_RESET_IRQ2_PORT, ATT7022B_RESET_IRQ2_PIN);
//        GPIO_SetBits(ATT7022B_RESET_IRQ3_PORT, ATT7022B_RESET_IRQ3_PIN);

        //ATT7022B Reset IO init
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_ATT7022B_RESET, ENABLE);
  GPIO_InitStructure.GPIO_Pin = ATT7022B_RESET_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ATT7022B_RESET_PORT, &GPIO_InitStructure);       
        GPIO_SetBits(ATT7022B_RESET_PORT, ATT7022B_RESET_PIN);
}

/********************************************************************************
*ATT7022BD&#190;&#198;&#172;μ&#196;&#197;&#228;&#214;&#195;oˉêy
*ê&#228;è&#235;£o&#206;T
*·μ&#187;&#216;£o&#206;T
*******************************************************************************/
void ATT7022B_Configuration(void)
{
        ATT7022B_IOInit();
        SPIx_Init(ATT7022B_SPI);
}

/********************************************************************************
*ATT7022Bμ&#196;&#182;áè&#161;êy&#190;Yoˉêy
*ê&#228;è&#235;£oAddr-&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;· , ê&#214;2á&#184;&#248;3&#246;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·&#191;é&#209;&#161;
*                        index-&#182;áè&#161;μ&#196;D&#190;&#198;&#172;±ào&#197; , 0- &#182;áè&#161;μú1&#184;&#246;D&#190;&#198;&#172; 1-&#182;áè&#161;μú2&#184;&#246;D&#190;&#198;&#172;  2-&#182;áè&#161;μúèy&#184;&#246;D&#190;&#198;&#172;
*·μ&#187;&#216;£o&#182;áè&#161;μ&#189;μ&#196;24&#206;&#187;&#213;&#251;D&#206;êy&#190;Y
*******************************************************************************/
int ATT7022B_ReadData(uint8_t Addr,int index)
{
        int data,i;
        uint8_t temp[3];
        Addr = Addr & 0x7F;
       
        switch(index)
        {
                case 0:
                        SPI_ATT7022B_CS1_LOW();                                                                        //CS1 à-μí &#198;&#172;&#209;&#161;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;
                        break;
                case 1:
                        SPI_ATT7022B_CS2_LOW();                                                                        //CS2 à-μí &#198;&#172;&#209;&#161;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;
                        break;
                case 2:
                        SPI_ATT7022B_CS3_LOW();                                                                        //CS3 à-μí &#198;&#172;&#209;&#161;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;
                        break;
                default:
                        return 0;
        }
       
        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);                        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        delay_us(3);
        //&#182;áè&#161;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
        for(i=0;i<3;i++)
        {
                temp=SPIx_ReadWriteByte(ATT7022B_SPI,0xFF);
        }
       
        switch(index)
        {
                case 0:
                        SPI_ATT7022B_CS1_HIGH();                                                                //CS1 à-&#184;&#223; è&#161;&#207;&#251;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
                        break;
                case 1:
                        SPI_ATT7022B_CS2_HIGH();                                                                //CS2 à-&#184;&#223; è&#161;&#207;&#251;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
                        break;
                case 2:
                        SPI_ATT7022B_CS3_HIGH();                                                                //CS3 à-&#184;&#223; è&#161;&#207;&#251;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
                        break;
                default:
                        return 0;
        }
       
        data = (temp[0]<<16) | (temp[1]<<8) | temp[2];
        return data;
}

//int ATT7022B_1_ReadData(uint8_t Addr)
//{
//        int data,i;
//        uint8_t temp[3];
//        Addr = Addr & 0x7F;
//        SPI_ATT7022B_CS1_LOW();                                                                        //CS1 à-μí &#198;&#172;&#209;&#161;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;
//        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
//        delay_us(3);
//        //&#182;áè&#161;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
//        for(i=0;i<3;i++)
//        {
//                temp[2-i]=SPIx_ReadWriteByte(ATT7022B_SPI,0x00);
//        }
//        SPI_ATT7022B_CS1_HIGH();                                                                //CS1 à-&#184;&#223; è&#161;&#207;&#251;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
//        data = (temp[0]<<16) | (temp[1]<<8) | temp[2];
//        return data;
//}

//int ATT7022B_2_ReadData(uint8_t Addr)
//{
//        int data,i;
//        uint8_t temp[3];
//        Addr = Addr & 0x7F;
//        SPI_ATT7022B_CS2_LOW();                                                                        //CS2 à-μí &#198;&#172;&#209;&#161;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;
//        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
//        delay_us(3);
//        //&#182;áè&#161;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
//        for(i=0;i<3;i++)
//        {
//                temp[2-i]=SPIx_ReadWriteByte(ATT7022B_SPI,0x00);
//        }
//        SPI_ATT7022B_CS2_HIGH();                                                                //CS2 à-&#184;&#223; è&#161;&#207;&#251;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
//        data = (temp[0]<<16) | (temp[1]<<8) | temp[2];
//        return data;
//}

//int ATT7022B_3_ReadData(uint8_t Addr)
//{
//        int data,i;
//        uint8_t temp[3];
//        Addr = Addr & 0x7F;                                                                                        //±£&#214;¤×&#238;&#184;&#223;&#206;&#187;&#206;a0,±íê&#190;&#182;áè&#161;êy&#190;Y
//        SPI_ATT7022B_CS3_LOW();                                                                        //CS3 à-μí &#198;&#172;&#209;&#161;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;
//        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
//        delay_us(3);
//        //&#182;áè&#161;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
//        for(i=0;i<3;i++)
//        {
//                temp[2-i]=SPIx_ReadWriteByte(ATT7022B_SPI,0x00);
//        }
//        SPI_ATT7022B_CS3_HIGH();                                                                //CS3 à-&#184;&#223; è&#161;&#207;&#251;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
//        data = (temp[0]<<16) | (temp[1]<<8) | temp[2];
//        return data;
//}

/********************************************************************************
*ATT7022Bμ&#196;D′êy&#190;Yoˉêy
*ê&#228;è&#235;£oAddr-&#209;§è&#231;êy&#190;Yμ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;· , ê&#214;2á&#184;&#248;3&#246;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·&#191;é&#209;&#161;
*                        data-òaD′è&#235;μ&#196;24&#206;&#187;&#213;&#251;D&#206;êy&#190;Y
*·μ&#187;&#216;£o&#182;áè&#161;μ&#189;μ&#196;24&#206;&#187;&#213;&#251;D&#206;êy&#190;Y êy×é·&#189;ê&#189;£&#172;&#195;&#191;8&#206;&#187;&#206;T·&#251;o&#197;êy′&#230;·&#197;ò&#187;&#184;&#246;êy&#190;Y&#212;a&#203;&#216;
*******************************************************************************/
void ATT7022B_WriteData(uint8_t Addr,uint8_t *data)
{
        int i;
        Addr = Addr | 0x80;                                                                                        //±£&#214;¤×&#238;&#184;&#223;&#206;&#187;&#206;a1,±íê&#190;D′è&#235;êy&#190;Y
       
        //&#207;òμúò&#187;&#184;&#246;ATT7022B&#214;DD′è&#235;
        SPI_ATT7022B_CS1_LOW();                                                                        //CS1 à-μí &#198;&#172;&#209;&#161;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;
        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        //D′è&#235;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
        for(i=0;i<3;i++)
        {
                SPIx_ReadWriteByte(ATT7022B_SPI,data[2-i]);
        }
        SPI_ATT7022B_CS1_HIGH();                                                                //CS1 à-&#184;&#223; è&#161;&#207;&#251;μú1&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
       
        //&#207;òμú&#182;t&#184;&#246;ATT7022B&#214;DD′è&#235;
        SPI_ATT7022B_CS2_LOW();                                                                        //CS2 à-μí &#198;&#172;&#209;&#161;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;
        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        //D′è&#235;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
        for(i=0;i<3;i++)
        {
                SPIx_ReadWriteByte(ATT7022B_SPI,data[2-i]);
        }
        SPI_ATT7022B_CS2_HIGH();                                                                //CS2 à-&#184;&#223; è&#161;&#207;&#251;μú2&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
       
        //&#207;òμúèy&#184;&#246;ATT7022B&#214;DD′è&#235;
        SPI_ATT7022B_CS3_LOW();                                                                        //CS3 à-μí &#198;&#172;&#209;&#161;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;
        SPIx_ReadWriteByte(ATT7022B_SPI,Addr);        //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú&#182;áè&#161;μ&#196;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        //D′è&#235;24bit&#188;′3&#184;&#246;×&#214;&#189;úêy&#190;Y
        for(i=0;i<3;i++)
        {
                SPIx_ReadWriteByte(ATT7022B_SPI,data[2-i]);
        }
        SPI_ATT7022B_CS3_HIGH();                                                                //CS3 à-&#184;&#223; è&#161;&#207;&#251;μú3&#184;&#246;ATT7022BD&#190;&#198;&#172;&#198;&#172;&#209;&#161;
}
[/mw_shl_code]
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-4-19
在线时间
3 小时
发表于 2017-4-19 17:54:07 | 显示全部楼层
join 发表于 2017-4-19 17:51
[mw_shl_code=c,true]
#include "ATT7022B.h"

上接帖子
下面是初始化部分
[mw_shl_code=c,true]
/********************************************************************************
*D£×&#188;μ&#231;±íμ&#196;oˉêy£&#172;D′è&#235;D£±í2&#206;êy
*ê&#228;è&#235;£o
*·μ&#187;&#216;£o
*′yè·&#182;¨ê2&#195;′ê±oòμ÷ó&#195;D£±íoˉêy£&#191;
*******************************************************************************/
void Calibration_ElectricMeter(void)
{
        uint8_t tmpdata[3]={0};
       
        //D′ê1&#196;üêy&#190;Y 0x00005A
        tmpdata[0] = 0x5A;
        tmpdata[1] = 0x00;
        //·¢&#203;íì&#216;êa&#195;üá&#238;,ê1&#196;üD£±íêy&#190;YD′2ù×÷
        ATT7022B_WriteData(SPECIAL_CMD_7,tmpdata);
       
        //&#197;&#228;&#214;&#195;&#196;£ê&#189;&#197;&#228;&#214;&#195;&#188;&#196;′&#230;&#198;÷ 0xB97E
        tmpdata[0] = 0x7E;
        tmpdata[1] = 0xB9;
        ATT7022B_WriteData(MODECFG_CMD,tmpdata);
        //EMU&#196;£&#191;é&#197;&#228;&#214;&#195;&#188;&#196;′&#230;&#198;÷ 0xF804
        tmpdata[0] = 0x04;
        tmpdata[1] = 0xF8;
        ATT7022B_WriteData(EMUCFG_CMD,tmpdata);
        //&#197;&#228;&#214;&#195;&#196;£ê&#189;&#197;&#228;&#214;&#195;&#188;&#196;′&#230;&#198;÷ 0x3427
        tmpdata[0] = 0x27;
        tmpdata[1] = 0x34;
        ATT7022B_WriteData(MODULECFG_CMD,tmpdata);
        //&#197;&#228;&#214;&#195;&#196;£ê&#189;&#197;&#228;&#214;&#195;&#188;&#196;′&#230;&#198;÷ 0xB97E
//        hfconst = (int)((25920000000*1.163*1.163*VI*VU)/(EC*g_SysGeneralParam.RatedCurrent*g_SysGeneralParam.RatedVoltage));
        Hfconst_Calculate();
        tmpdata[0] = hfconst & 0xFF;
        tmpdata[1] = (hfconst>>8) & 0xFF;
        ATT7022B_WriteData(HFCONST_CMD,tmpdata);
       
        //D′2ù×÷&#189;&#251;ó&#195;êy&#190;Y 0x00005B,2&#187;μèóú0x5A
        tmpdata[0] = 0x5B;
        tmpdata[1] = 0x00;
        //·¢&#203;íì&#216;êa&#195;üá&#238;,1&#216;±&#213;D£±íêy&#190;YD′2ù×÷
        ATT7022B_WriteData(SPECIAL_CMD_7,tmpdata);
}

/********************************************************************************
*D£×&#188;μ&#231;±íμ&#196;oˉêy,&#199;&#229;&#191;&#213;D£±í2&#206;êy
*ê&#228;è&#235;£o
*·μ&#187;&#216;£o
*******************************************************************************/
void Clear_Calibration_ElectricMeter(void)
{
        uint8_t tmpdata[3]={0,0,0};
        //·¢&#203;íì&#216;êa&#195;üá&#238;,&#199;&#229;&#191;&#213;D£±íêy&#190;Y
        ATT7022B_WriteData(SPECIAL_CMD_3,tmpdata);
        delay_us(3);
}
[/mw_shl_code]
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-4-19
在线时间
3 小时
发表于 2017-4-19 18:05:42 | 显示全部楼层
join 发表于 2017-4-19 17:54
上接帖子
下面是初始化部分
[mw_shl_code=c,true]

上个帖子还是不能显示中文备注,先发个图片凑合着看看吧
2.png
1.png
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-8-18
在线时间
6 小时
发表于 2020-8-18 15:48:44 | 显示全部楼层
大家好,请叫一个问题,ATT7022EU怎么开启电压通道的ADC呢?谢谢先!
回复

使用道具 举报

13

主题

272

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5390
金钱
5390
注册时间
2017-8-14
在线时间
249 小时
发表于 2021-3-15 16:29:26 | 显示全部楼层
我们有 现成的 产品,可以提供 源程序及 PCB生产文件,见这个链接的文件下载
http://www.openedv.com/forum.php ... amp;highlight=ATT70
详细资料扣扣群204408503自行下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 19:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表