你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
Ace3500 提问时间:2017-1-22 14:36 /
本帖最后由 Ace3500 于 2017-6-8 14:30 编辑

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

  15.         
  16.         SPI_Write(0x33,0x0055);                //0x33:软件复位寄存器。0x55:复位
  17.         SPI_Write(0x40,0x2000);                //0x40:EMU配置寄存器。0x2000:bit13=1,能量寄存器读后清零
  18.         SPI_Write(0x43,0x0007);                //ADC开关寄存器,I1,I2,U全部打开
  19.         
  20.         SPI_Write(0x59,0x0001);                //设置电流  电压增益
  21.         SPI_Write(0x41,0x0000);                //设置电流  电压增益                        -------------->0x41,page28,时钟配置寄存器
  22. }
复制代码
  1. //写函数
  2. void        SPI_Write(u8 address, u32 write_data)
  3. {
  4.         char i;        
  5.         int j;
  6.         u32 temp_data = 1;
  7.         
  8.         GPIO_SetBits(CS_PORT, CS_PIN);
  9.         for (j=50; j>0; j--);

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

  12.         GPIO_ResetBits(CS_PORT, CS_PIN);        //片选置0,生效
  13.                         
  14.         address=address|0x80;
  15.         for(i=8; i>0; i--)
  16.         {
  17.                         GPIO_SetBits(SCLK_PORT, SCLK_PIN);        
  18.                         for (j=50; j>0; j--);        
  19.                         
  20.                         if(((address & (0x01<<(i-1)))>>(i-1)))        //address 地址从0x00到0x7F
  21.                         {
  22.                                 GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据
  23.                                 for (j=50; j>0; j--);        
  24.                         }
  25.                         else
  26.                         {
  27.                                 GPIO_ResetBits(SDI_PORT, SDI_PIN);
  28.                                 for (j=50; j>0; j--);
  29.                         }
  30.                         
  31.                         GPIO_ResetBits(SCLK_PORT, SCLK_PIN);        //从机需要在下降沿取数据
  32.                         for (j=50; j>0; j--);        
  33.         }
  34.         
  35.         for (j=50; j>0; j--);        
  36.         
  37.         for(i=23;i>0;i--)
  38.         {
  39.                         GPIO_SetBits(SCLK_PORT, SCLK_PIN);        
  40.                         for (j=50; j>0; j--);        
  41.                         
  42.                         if(((write_data & (temp_data<<i))>>i))        //address 地址从0x00到0x7F
  43.                         {
  44.                                 GPIO_SetBits(SDI_PORT, SDI_PIN);
  45.                                 for (j=50; j>0; j--);        
  46.                         }
  47.                         else
  48.                         {
  49.                                 GPIO_ResetBits(SDI_PORT, SDI_PIN);
  50.                                 for (j=50; j>0; j--);        
  51.                         }
  52.                         
  53.                         GPIO_ResetBits(SCLK_PORT, SCLK_PIN);        //从机需要在下降沿取数据
  54.                         for (j=50; j>0; j--);        
  55.   }
  56.         GPIO_SetBits(CS_PORT, CS_PIN);        
  57.         
  58. }
复制代码
  1. //读函数
  2. u32 SPI_Read(u8 address)
  3. {
  4.         char i;
  5.         int j;
  6.         u32 temp_data;
  7.         u32 miso_val;
  8.         
  9.         temp_data = 0;                        
  10.         
  11.         GPIO_SetBits(CS_PORT,CS_PIN);                //片选初始状态为1
  12.         for (j=50; j>0; j--);

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

  15.         GPIO_ResetBits(CS_PORT, CS_PIN);        //片选置0,生效
  16.         for (j=50; j>0; j--)
  17.         {
  18.                
  19.         }
  20.         

  21.         address=address&0x7F;                        
  22.         for(i=8; i>0; i--)
  23.         {
  24.                 GPIO_SetBits(SCLK_PORT, SCLK_PIN);         //CLK置高
  25.                 for (j=50; j>0; j--);        
  26.                
  27.                 if( (address & ( 0x01<<(i-1) )) >> (i-1) )         //address 地址从0x00到0x7F
  28.                 {
  29.                         GPIO_SetBits(SDI_PORT, SDI_PIN); //1表示主机向从机写数据        
  30.                 }
  31.                 else
  32.                 {
  33.                         GPIO_ResetBits(SDI_PORT, SDI_PIN);
  34.                 }
  35.                 for (j=50; j>0; j--);

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


  39.         for(i=24; i>0; i--)
  40.         {
  41.                 GPIO_SetBits(SCLK_PORT, SCLK_PIN); //
  42.         
  43.                 if(GPIO_ReadInputDataBit(SDO_PORT, SDO_PIN))
  44.                         miso_val=0x01;
  45.                 else
  46.                         miso_val=0x00;
  47.                
  48.                 temp_data = temp_data|(miso_val<<(i-1));
  49.                 for (j=50; j>0; j--);        
  50.                 GPIO_ResetBits(SCLK_PORT, SCLK_PIN);        //从机需要在下降沿取数据
  51.                 for (j=50; j>0; j--);        
  52.         }


  53.         GPIO_SetBits(CS_PORT, CS_PIN);        
  54.         
  55.         return temp_data;
  56. }
复制代码
收藏 2 评论12 发布时间:2017-1-22 14:36

举报

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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函数里就这句:               
  1. temp_data = SPI_Read(0x08);
  2. printf("%x\n", temp_data);
复制代码

传的寄存器地址是0x08,也就是0000 1000,所以SDI口接收寄存器地址的时候确实是只有一个高电平,其余的全部都是低。

我把传入的寄存器地址随便改了个0x53,也就是0101 0011,然后再观察SDI的波形,就变成了这样:
  1. temp_data = SPI_Read(0x53);
  2. 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寄存器,然读到的值与你写的是否一致。

1.jpg

2.jpg

举个栗子,初始化可以只配置这些。
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();
}





评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

傲娇小公举 回答时间: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
我也在做这个楼主可以发一份代码给我吗,感谢开源!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版