Ace3500 发表于 2017-1-22 14:36:07

STM32F103C8T6获取ATT7053BU采集的数据有问题

本帖最后由 Ace3500 于 2017-6-8 14:30 编辑

如题,
如题,这两天用STM32F103C8T6采集ATT7053BU的数据,结果采集上来的数据始终固定不变,我传不同的寄存器地址,他的数据都不变,跪求懂得大神来围观围观,知道知道小弟,感激不尽!
这是我的代码的主要部分,最下面是main函数。
附图是我用串口发出来以后全是一样的数据,附件是我的工程。
跪求大神帮忙看看。
/**********************************************************************
//函数名称:Init_ATT7053(void)
//功能    :初始化ATT7053
**********************************************************************/
void Init_ATT7053(void)
{
      int j;
      
      SPI_configuration();
      
      GPIO_ResetBits(CS_PORT, CS_PIN);      //片选拉低
      for (j=50; j>0; j--);
      GPIO_SetBits(CS_PORT, CS_PIN);                //片选拉高
      for (j=50; j>0; j--);

      
      SPI_Write(0x33,0x0055);                //0x33:软件复位寄存器。0x55:复位
      SPI_Write(0x40,0x2000);                //0x40:EMU配置寄存器。0x2000:bit13=1,能量寄存器读后清零
      SPI_Write(0x43,0x0007);                //ADC开关寄存器,I1,I2,U全部打开
      
      SPI_Write(0x59,0x0001);                //设置电流电压增益
      SPI_Write(0x41,0x0000);                //设置电流电压增益                        -------------->0x41,page28,时钟配置寄存器
}//写函数
void      SPI_Write(u8 address, u32 write_data)
{
      char i;      
      int j;
      u32 temp_data = 1;
      
      GPIO_SetBits(CS_PORT, CS_PIN);
      for (j=50; j>0; j--);

      GPIO_ResetBits(SCLK_PORT, SCLK_PIN);      //确保CLK初始状态是0
      for (j=50; j>0; j--);

      GPIO_ResetBits(CS_PORT, CS_PIN);      //片选置0,生效
                        
      address=address|0x80;
      for(i=8; i>0; i--)
      {
                        GPIO_SetBits(SCLK_PORT, SCLK_PIN);      
                        for (j=50; j>0; j--);      
                        
                        if(((address & (0x01<<(i-1)))>>(i-1)))      //address 地址从0x00到0x7F
                        {
                              GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据
                              for (j=50; j>0; j--);      
                        }
                        else
                        {
                              GPIO_ResetBits(SDI_PORT, SDI_PIN);
                              for (j=50; j>0; j--);
                        }
                        
                        GPIO_ResetBits(SCLK_PORT, SCLK_PIN);      //从机需要在下降沿取数据
                        for (j=50; j>0; j--);      
      }
      
      for (j=50; j>0; j--);      
      
      for(i=23;i>0;i--)
      {
                        GPIO_SetBits(SCLK_PORT, SCLK_PIN);      
                        for (j=50; j>0; j--);      
                        
                        if(((write_data & (temp_data<<i))>>i))      //address 地址从0x00到0x7F
                        {
                              GPIO_SetBits(SDI_PORT, SDI_PIN);
                              for (j=50; j>0; j--);      
                        }
                        else
                        {
                              GPIO_ResetBits(SDI_PORT, SDI_PIN);
                              for (j=50; j>0; j--);      
                        }
                        
                        GPIO_ResetBits(SCLK_PORT, SCLK_PIN);      //从机需要在下降沿取数据
                        for (j=50; j>0; j--);      
}
      GPIO_SetBits(CS_PORT, CS_PIN);      
      
}//读函数
u32 SPI_Read(u8 address)
{
      char i;
      int j;
      u32 temp_data;
      u32 miso_val;
      
      temp_data = 0;                        
      
      GPIO_SetBits(CS_PORT,CS_PIN);                //片选初始状态为1
      for (j=50; j>0; j--);

      GPIO_ResetBits(SCLK_PORT, SCLK_PIN);      //确保CLK初始状态是0               
      for (j=50; j>0; j--);      

      GPIO_ResetBits(CS_PORT, CS_PIN);      //片选置0,生效
      for (j=50; j>0; j--)
      {
               
      }
      

      address=address&0x7F;                        
      for(i=8; i>0; i--)
      {
                GPIO_SetBits(SCLK_PORT, SCLK_PIN);         //CLK置高
                for (j=50; j>0; j--);      
               
                if( (address & ( 0x01<<(i-1) )) >> (i-1) )         //address 地址从0x00到0x7F
                {
                        GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据      
                }
                else
                {
                        GPIO_ResetBits(SDI_PORT, SDI_PIN);
                }
                for (j=50; j>0; j--);

                GPIO_ResetBits(SCLK_PORT, SCLK_PIN);         //CLK置低(下降沿),从机需要在下降沿取数据
                for (j=50; j>0; j--);      
      }//从机接收到命令后,开始送出数据,上升沿送数据


      for(i=24; i>0; i--)
      {
                GPIO_SetBits(SCLK_PORT, SCLK_PIN); //
      
                if(GPIO_ReadInputDataBit(SDO_PORT, SDO_PIN))
                        miso_val=0x01;
                else
                        miso_val=0x00;
               
                temp_data = temp_data|(miso_val<<(i-1));
                for (j=50; j>0; j--);      
                GPIO_ResetBits(SCLK_PORT, SCLK_PIN);      //从机需要在下降沿取数据
                for (j=50; j>0; j--);      
      }


      GPIO_SetBits(CS_PORT, CS_PIN);      
      
      return temp_data;
}

any012 发表于 2017-1-22 19:20:07

有示波器的话,可以观察下输出输入波形,是否和发送接收的一致。
STM32的硬件SPI也挺好用的。

Ace3500 发表于 2017-1-23 09:51:08

本帖最后由 Ace3500 于 2017-6-8 14:27 编辑

any012 发表于 2017-1-22 19:20
有示波器的话,可以观察下输出输入波形,是否和发送接收的一致。
STM32的硬件SPI也挺好用的。 ...
谢谢你,我测了一下,如图:      CS和CLK正常,
      DOUT和DIN感觉不太正常。

现在的话我该检查哪里有问题呢?感觉现在没有方向了。:'(

any012 发表于 2017-1-23 18:45:02

本帖最后由 any012 于 2017-1-23 18:54 编辑

DIN是SDI吗?怎么输出基本上是低电平啊。
先想办法把SDI调正确吧。是不是外围设备接的不对把SDI拉低了?
我也是个菜鸟,不过STM32的SPI的话,还是试过的。
你可以先试试用SPI发送简单的重复的数据,判断下SDI波形异常的原因。
先分析下可能是硬件的问题还是软件的问题?
硬件问题的话,会不会是ATT7053BU接的有问题将SDI拉低了?可以不焊ATT7053BU看下SDI波形是否正确,还不行的话,可外接个上拉电阻再试下。
以上是我想到的,不一定对,供参考。

Ace3500 发表于 2017-1-24 08:58:52

any012 发表于 2017-1-22 19:20
有示波器的话,可以观察下输出输入波形,是否和发送接收的一致。
STM32的硬件SPI也挺好用的。 ...

单步调试DOUT输出的全是F,示波器测出来的也全都是高,一致。看来可能还是软件有问题,我再看看。

Ace3500 发表于 2017-1-24 09:00:54

any012 发表于 2017-1-23 18:45
DIN是SDI吗?怎么输出基本上是低电平啊。
先想办法把SDI调正确吧。是不是外围设备接的不对把SDI拉低了?
我 ...

恩恩,DIN是SDI,我也奇怪为什么只是高电平了一下,就全部低了,我试试你说的方法。谢谢哈。

Ace3500 发表于 2017-1-24 09:20:24

本帖最后由 Ace3500 于 2017-6-8 14:30 编辑

any012 发表于 2017-1-23 18:45
DIN是SDI吗?怎么输出基本上是低电平啊。
先想办法把SDI调正确吧。是不是外围设备接的不对把SDI拉低了?
我 ...
刚分析代码,又感觉好像没问题,因为我的main函数里就这句:               
temp_data = SPI_Read(0x08);
printf("%x\n", temp_data);
传的寄存器地址是0x08,也就是0000 1000,所以SDI口接收寄存器地址的时候确实是只有一个高电平,其余的全部都是低。

我把传入的寄存器地址随便改了个0x53,也就是0101 0011,然后再观察SDI的波形,就变成了这样:temp_data = SPI_Read(0x53);
printf("%x\n", temp_data);
所以说DIN口应该没问题吧?

还有一个问题:就是我不管传什么地址,SDO接收到的数据永远是全F,全高电平。这个我不知道为什么会这样。


Dylan疾风闪电 发表于 2017-1-24 13:55:23

Ace3500 发表于 2017-1-24 09:20
刚分析代码,又感觉好像没问题,因为我的main函数里就这句:               

传的寄存器地址是0x08,也 ...
方向:验证读写数据是否正常。
数据读取的验证:直接读chipID,看返回值是否正确,来验证读取的时序。
数据写的验证:写-读ANAE寄存器,然读到的值与你写的是否一致。





举个栗子,初始化可以只配置这些。
void ATT7053_Init()
{
ATT7053_Reset();

ATT7053_wEnable40H45H();

//EMU配置寄存器(EMUCFG)EnergyClr 设置是否能量寄存器读后清0(0:读后不清0; 1:读后清0)
u32 readValue= ATT7053_Read(ATT7053_RW_EMUCFG);
while ((readValue & 0x2000) == 0)
{
    ATT7053_Write(ATT7053_RW_EMUCFG, readValue | 0x2000);

    readValue= ATT7053_Read(ATT7053_RW_EMUCFG);
}

ATT7053_SelectChannel(1);

ATT7053_wDisable();
}





傲娇小公举 发表于 2017-8-9 23:17:06

我也在做这个楼主可以发一份代码给我吗,感激不尽

mochen32 发表于 2018-11-15 21:39:15

初次接触AT7053,不知道怎么用,楼主能讲解一下吗?

yyvca48fb 发表于 2019-3-15 17:37:20

新手在搞AT7503,遇见和楼主一样问题,求指教

Art-J 发表于 2019-3-28 19:18:02

我也读取全为FFFFFFFF,有哪位前辈解决了的,探讨下

lifesteve 发表于 2021-11-5 15:13:27

| 我也在做这个楼主可以发一份代码给我吗,感谢开源! |
| -------------------------------------------------- |
页: [1]
查看完整版本: STM32F103C8T6获取ATT7053BU采集的数据有问题