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

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 评论11 发布时间:2017-1-22 14:36

举报

11个回答
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,不知道怎么用,楼主能讲解一下吗?
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版