OpenEdv-开源电子网

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

快要跳楼!关于计量芯片ATT7022E的初始化问题

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-8-14
在线时间
17 小时
发表于 2017-9-15 10:05:19 | 显示全部楼层 |阅读模式
非常感谢大神能点开这个帖子,小白求解救,真的。

是这样的,拿到片子后熟读了手册,用了厂家保证绝对OK的程序,可是自己的单片机怎么都和7022通讯不上,读到Device id一直是0XFFFFFF程序用的串口模拟SPI。在读ID前面就一个端口初始化和SPI读写。对着手册看了很多遍,程序怎么也找不到问题。
PS 用示波器分别观察了CLK CS DIN的数据,都没问题,和手册里给的一毛一样,但是DO口一直都是高电平,通讯不上,而且IRQ脚也一直是低电平(数据手册里说当芯片处于复位状态IRQ为高,复位完成后IRQ信号为低,当写入校表参

数后即校表参数不为初始值,IRQ信号立即拉高,当校表参数被清除即校表参数为初始值IRQ信号立即拉低。此位必选,无法被清除)求解救,给点调试思路也行
下面是初始化部分程序。
#define SPI_CS_HIGH()   GPIO_SetBits(GPIOF, GPIO_Pin_12)
#define SPI_DI_HIGH()    GPIO_SetBits(GPIOF, GPIO_Pin_14)
#define SPI_DO_HIGH()    GPIO_SetBits(GPIOF, GPIO_Pin_13)
#define SPI_CLK_HIGH()   GPIO_SetBits(GPIOF, GPIO_Pin_15)
#define SPI_CS_LOW()  GPIO_ResetBits(GPIOF, GPIO_Pin_12)
#define SPI_DI_LOW()    GPIO_ResetBits(GPIOF, GPIO_Pin_14)
#define SPI_DO_LOW()    GPIO_ResetBits(GPIOF, GPIO_Pin_13)
#define SPI_CLK_LOW()   GPIO_ResetBits(GPIOF, GPIO_Pin_15)   //
#define RDSPIData   GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_13)//

int main(void)
{
System_Init();  
}


void System_Init(void)
{
delay_init();                                            //
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //
Timer_Init();                                            //
  InitAmmeter();             //
}


void InitAmmeter(void)
{
// data0 = ((2.592 * ATT_G * ATT_G*10000*INATTV*INATTI)/(EC*UI*VI));
// data1 = 25920000000 /(HFCONST *EC *8388608);//0.0025745//

SPI_GPIO_Config();
EMU_init();     
Device_ID = READ_Att7022(0x00);   // Device ID
while(1)
{
printf("ID=%d\r\n\r\n",Device_ID);
delay_us(100);
}
delay_us(100);
}


void SPI_GPIO_Config(void)
{  

  GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14;

  GPIO_Init(GPIOF, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOF, GPIO_Pin_15);    //
                    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
  GPIO_Init(GPIOF, &GPIO_InitStructure);
}


u32 READ_Att7022(u8 Address)
{
        u8 i, bTemp;
        u32 dwData;
        SPI_CS_HIGH();

        SPI_CLK_LOW();

        SPI_CS_LOW();

        bTemp = 0x80;
        for(i=0; i<8; i++)   //Write the Address
        {
                SPI_CLK_HIGH();
   
                if(Address & bTemp)
    {
                   SPI_DI_HIGH();
    }
                else
                     SPI_DI_LOW();
                bTemp >>= 1;
    delay_us(1) ;
                SPI_CLK_LOW();
    delay_us(1) ;
        }
        delay_us(3);
        dwData = 0x00000000;//Read 24bit
        for(i=0; i<24; i++)
        {
                dwData <<= 1;
                SPI_CLK_HIGH();
               // Delay_us(3);
                if (RDSPIData)
                {
                      dwData |= 1;
         
        }
                else
                        ;
   
                SPI_CLK_LOW();
    delay_us(1);
        }
        SPI_CS_HIGH();   //&sup1;&Oslash;±&Otilde;SPI&acute;&laquo;&Ecirc;&auml;
        delay_us(2);
        return dwData;
}
/**************************Wr_Dat******************************/
void Write_Att7022(u8 Address, u32 dwData)
{
        u8 i, bTemp;
        u32 dwTemp;
        SPI_CS_HIGH();

        SPI_CLK_LOW();

        SPI_CS_LOW();  //&iquest;&ordf;&AElig;&ocirc;SPI&acute;&laquo;&Ecirc;&auml;

        Address |= 0x80;//write
        bTemp = 0x80;
        for(i=0; i<8; i++)         //Write the Address
        {
               SPI_CLK_HIGH();
                if(Address & bTemp)
    {
     SPI_DI_HIGH();
    }
                else
                     SPI_DI_LOW();
                bTemp >>= 1;
    delay_us(1) ;
                SPI_CLK_LOW();
    delay_us(1) ;
        }
        delay_us(3);
        dwTemp = 0x00800000;
        for(i=0; i<24; i++)  //Write Data
        {
                if(dwData & dwTemp)
                {
                    SPI_DI_HIGH();
                }
                else
                     SPI_DI_LOW();
                SPI_CLK_HIGH();
                delay_us(1);
                SPI_CLK_LOW();
        
    delay_us(1);
                dwTemp >>= 1;
        }
        
        SPI_CS_HIGH();     //
        delay_us(2);
}



z

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

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-8-14
在线时间
17 小时
 楼主| 发表于 2017-9-15 10:06:27 | 显示全部楼层
对了开发板用的是正点战舰的STM32F103ZET6

@正点原子 原子哥救救我
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-8-14
在线时间
17 小时
 楼主| 发表于 2017-9-15 10:08:46 | 显示全部楼层
校表部分:
void EMU_init(void)
{
        u32 a;       
        Write_Att7022(0xD3,0x0000);//rest
        delay_ms(100);//&Ntilde;&Oacute;&Ecirc;±1m,&micro;&Egrave;&acute;&yacute;AT7022&Otilde;&yacute;&sup3;&pound;&sup1;¤×÷
a=READ_Att7022(0x00);
         uart_init(115200);         //&acute;&reg;&iquest;&Uacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Icirc;&ordf;115200

                printf("ID=%d\r\n\r\n",a);


                Write_Att7022(0xC3,0x000000);  //&Ccedil;&aring;&sup3;&yacute;&ETH;&pound;±í&Ecirc;&yacute;&frac34;&Yacute;
                Write_Att7022(0xc9,0x00005A);  //&Ecirc;&sup1;&Auml;&Uuml;&ETH;&pound;±í

                //Wr_Dat(0xC5,0x000000); //&sup1;&Oslash;±&Otilde;&Iacute;&not;&sup2;&frac12;
                Write_Att7022(0x01,0xB97E);  //&Aring;&auml;&Ouml;&Atilde;&Auml;&pound;&Ecirc;&frac12;&frac14;&Auml;&acute;&aelig;&AElig;÷
                Write_Att7022(0x03,0xF884); //EMUcfg   &para;&Aacute;&ordm;ó&Ccedil;&aring;&Aacute;&atilde;                 0xF884   &ordm;&Iacute;&sup1;&brvbar;&Acirc;&Ecirc;&Oacute;&ETH;&sup1;&Oslash;
                Write_Att7022(0x02,0x0200);           //&micro;&ccedil;&Aacute;÷&Ocirc;&ouml;&Ograve;&aelig;1  &micro;&ccedil;&Ntilde;&sup1;8

                //   Write_Att7022(0x30,0x0000); // &sup1;&Oslash;±&Otilde;&Euml;ù&Oacute;&ETH;&Ouml;&ETH;&para;&Iuml;
                Write_Att7022(0x31,0x3437); //&Auml;&pound;&Auml;&acirc;&Auml;&pound;&iquest;é&frac14;&Auml;&acute;&aelig;&AElig;÷
                Write_Att7022(0x6D, 0xFF00);                //Vrefgain &micro;&Auml;&sup2;&sup1;&sup3;&yen;&Ccedil;ú&Iuml;&szlig;&Iuml;&micro;&Ecirc;&yacute;TCcoffA &pound;&not;TCcoffB &pound;&not;TCcoffC(0x6D~0x6F)
                Write_Att7022(0x6E, 0x0DB8);                //Vrefgain &micro;&Auml;&sup2;&sup1;&sup3;&yen;&Ccedil;ú&Iuml;&szlig;&Iuml;&micro;&Ecirc;&yacute;TCcoffA &pound;&not;TCcoffB &pound;&not;TCcoffC(0x6D~0x6F)
                Write_Att7022(0x6F, 0xD1DA);                //Vrefgain &micro;&Auml;&sup2;&sup1;&sup3;&yen;&Ccedil;ú&Iuml;&szlig;&Iuml;&micro;&Ecirc;&yacute;TCcoffA &pound;&not;TCcoffB &pound;&not;TCcoffC(0x6D~0x6F)
                Write_Att7022(0x1E,HFCONST); // HFconst 3200  109       
       
                Write_Att7022(0x17,(int)(0.99*32768));         //A&Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Ocirc;&ouml;&Ograve;&aelig;&ETH;&pound;×&frac14;
                Write_Att7022(0x18,(int)(0.99*32768));  //B &Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Ocirc;&ouml;&Ograve;&aelig;&ETH;&pound;×&frac14;
                Write_Att7022(0x19,(int)(0.99*32768));  //C &Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Ocirc;&ouml;&Ograve;&aelig;&ETH;&pound;×&frac14;
       
                Write_Att7022(0x1A,1.918*32768); //A&Iuml;à&micro;&ccedil;&Aacute;÷&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;               
                Write_Att7022(0x1B,1.918*32768); //B&Iuml;à&micro;&ccedil;&Aacute;÷&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;       
                Write_Att7022(0x1C,1.908*32768); //C&Iuml;à&micro;&ccedil;&Aacute;÷&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;
                                               
                Write_Att7022(0x04,1.442*32768); //A&Oacute;&ETH;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;   
                Write_Att7022(0x07,1.442*32768); //A&Icirc;&THORN;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;
                Write_Att7022(0x0A,1.442*32768);        //A&Ecirc;&Oacute;&Ocirc;&Uacute;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;

                Write_Att7022(0x05,1.437*32768); //B&Oacute;&ETH;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;       
                Write_Att7022(0x08,1.437*32768); //B&Icirc;&THORN;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;
                Write_Att7022(0x0B,1.437*32768);        //B&Ecirc;&Oacute;&Ocirc;&Uacute;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;
               
                Write_Att7022(0x06,1.437*32768); //C&Oacute;&ETH;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;
                Write_Att7022(0x09,1.437*32768); //C&Icirc;&THORN;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;1.378*(pow(2,15))
                Write_Att7022(0x0C,1.437*32768);//C&Ecirc;&Oacute;&Ocirc;&Uacute;&sup1;&brvbar;&Acirc;&Ecirc;&Ocirc;&ouml;&Ograve;&aelig; &ETH;&pound;×&frac14;   1.378*(pow(2,15)

                //A &Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Ocirc;&ouml;&Ograve;&aelig;&ETH;&pound;×&frac14; (int)(1.9827*
        /*        Write_Att7022(0x24,0x036C); //  A&Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Oacute;&ETH;&ETH;§&Ouml;&micro;&micro;&Auml;&ETH;&pound;×&frac14;0x036C

                Write_Att7022(0x25,0x0301); //  B&Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Oacute;&ETH;&ETH;§&Ouml;&micro;&micro;&Auml;&ETH;&pound;×&frac14;0x0301

                Write_Att7022(0x26,0x02E2); //  C&Iuml;à&micro;&ccedil;&Ntilde;&sup1;&Oacute;&ETH;&ETH;§&Ouml;&micro;&micro;&Auml;&ETH;&pound;×&frac14;0x02E2
*/

                Write_Att7022(0x35,0x080F);           //   I/O
                Write_Att7022(0xC5,0x0002);                        ///&acute;ò&iquest;&ordf;&Iacute;&not;&sup2;&frac12;
                Write_Att7022(0xc9,0x000000);         //Close the write protection
                Write_Att7022(0xC6,0x0000) ;           //&acute;ò&iquest;&ordf;&frac14;&AElig;&Aacute;&iquest;&frac14;&Auml;&acute;&aelig;&AElig;÷&Ecirc;&yacute;&frac34;&Yacute;
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-8-14
在线时间
17 小时
 楼主| 发表于 2017-9-15 11:27:35 | 显示全部楼层
已解决,经检查是买的计量模块接线端口与资料原理图不一致。气的我怀疑人生
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2017-9-16
在线时间
21 小时
发表于 2017-9-18 09:33:01 | 显示全部楼层
我现在也要用这个芯片,能不能有偿提供一下资料qq1428496123
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-2
在线时间
9 小时
发表于 2018-5-2 16:25:00 | 显示全部楼层
楼主,请问这个校表怎么校的?最后测量精度是多少?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 16:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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