7293|23

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求大神指点如何用stm32获取AD7746数据 [复制链接]

 
AD7746 芯片是测微小电容的,接口为I2C。
求做过该方面类似问题的大神指点一二,例如寄存器
此帖出自stm32/stm8论坛

最新回复

楼主 还在吗 我也遇到同样的问题了  请教楼主!!!  详情 回复 发表于 2018-11-19 15:32
点赞 关注
 

回复
举报

9850

帖子

24

TA的资源

版主

沙发
 
先去官网下载AD7746的驱动代码
此帖出自stm32/stm8论坛
 
 

回复

9850

帖子

24

TA的资源

版主

板凳
 
http://www.analog.com/static/imported-files/zh/code_examples/ADC/ExampleCode_ADC_AD7746.zip
此帖出自stm32/stm8论坛
 
 

回复

9850

帖子

24

TA的资源

版主

4
 
然后把代码一直到你的STM32上 前期如果对STM32不了解 建议使用I/O模拟I2C
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

28

TA的资源

裸片初长成(高级)

5
 
器件手册是要看的。官网的代码是最好的参考,
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
对的,参考3楼虾哥给出的官网的例子,然后用IO模拟iic的这种方式来,写成32的就可以了。
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 
littleshrimp 发表于 2016-8-9 16:39
然后把代码一直到你的STM32上 前期如果对STM32不了解 建议使用I/O模拟I2C

谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

8
 
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

9
 
huaiqiao 发表于 2016-8-9 23:35
对的,参考3楼虾哥给出的官网的例子,然后用IO模拟iic的这种方式来,写成32的就可以了。

我现在用的模拟I2C 但是JLINK调试的时候,查看result  一直是4 (也就是超了量程),怎么办
此帖出自stm32/stm8论坛

点评

我不知道你的result指的是你设置的变量还是?回答帖子麻烦你能说清楚一些。 但是既然模拟iic,那么首先用最简单的办法来操作不就行了,用来验证iic读写是否OK么。对吧。我就用最简单的办法来实现,不知道你是怎么来  详情 回复 发表于 2016-8-13 21:01
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

10
 
nevergodie 发表于 2016-8-13 16:07
我现在用的模拟I2C 但是JLINK调试的时候,查看result  一直是4 (也就是超了量程),怎么办

我不知道你的result指的是你设置的变量还是?回答帖子麻烦你能说清楚一些。
但是既然模拟iic,那么首先用最简单的办法来操作不就行了,用来验证iic读写是否OK么。对吧。我就用最简单的办法来实现,不知道你是怎么来验证的。
另外说个题外话,如果模拟iic建议你看看原子的例程,如果用硬件iic建议你看看野火例程。
我举个我验证iic是否读写OK的例子你来看,当然可能您会有更好的方法。
  1.     I2C_EEPROM_BufferRead(read_table,0x0000,1024);//先读一次数据,read_table[1024] eeprom的大小设置为1024

  2.     memset(write_table,0,1024);//清空write_talbe这个数组,write_table[1024] eeprom的大小设置为1024
  3.    
  4.     I2C_EEPROM_BufferWrite(write_table,0x0000,1024);
  5.     I2C_EEPROM_BufferRead(read_table,0x0000,1024);

  6.     for(i2c_cnt =0;i2c_cnt<10;i2c_cnt++)

  7.        {            write_table[i2c_cnt] = (u8) i2c_cnt;
  8.        }
  9.    
  10.     I2C_EEPROM_BufferWrite(write_table,0x0000,10);
  11.     I2C_EEPROM_BufferRead(read_table,0x0000,10);

  12.     if(memcmp(read_table,write_table,10)==0 )
  13.         {
  14.             LED1_ON;
  15.                         //可以利用memset来清空write_table
  16.         }
  17.     else
  18.         {
  19.             LED1_OFF;
  20.             delay_ms(300);
  21.         }
复制代码


此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

11
 
huaiqiao 发表于 2016-8-13 21:01
我不知道你的result指的是你设置的变量还是?回答帖子麻烦你能说清楚一些。
但是既然模拟iic,那么首先 ...

是用I2C方式,然后RESULT是过去电容的值。现在单步调试就是发送了地址之后没有ACK应答。
此帖出自stm32/stm8论坛

点评

所以啊,证明的你模拟的iic是有问题的哦,所以你把注意力还是集中在模拟iic的代码上哦。  详情 回复 发表于 2016-8-15 19:02
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

12
 
huaiqiao 发表于 2016-8-13 21:01
我不知道你的result指的是你设置的变量还是?回答帖子麻烦你能说清楚一些。
但是既然模拟iic,那么首先 ...

现在检查出错误之后,可以通过I2C通信,但是读出来的值一直是FFFFFF
此帖出自stm32/stm8论坛

点评

那我就不知道了,你这个片子我也没有用过,前面只是大概的跟你探讨下思路。。。。  详情 回复 发表于 2016-8-15 19:02
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

13
 
nevergodie 发表于 2016-8-15 13:23
是用I2C方式,然后RESULT是过去电容的值。现在单步调试就是发送了地址之后没有ACK应答。

所以啊,证明的你模拟的iic是有问题的哦,所以你把注意力还是集中在模拟iic的代码上哦。
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

14
 
nevergodie 发表于 2016-8-15 16:56
现在检查出错误之后,可以通过I2C通信,但是读出来的值一直是FFFFFF

那我就不知道了,你这个片子我也没有用过,前面只是大概的跟你探讨下思路。。。。
此帖出自stm32/stm8论坛

点评

好吧,最后发现还是以前的问题,没有ACK返回。但是在这之前的CLK,SDA都是按照说明写的,现在很茫然  详情 回复 发表于 2016-8-17 11:36
好的,谢谢指教。  详情 回复 发表于 2016-8-16 09:06
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

15
 
huaiqiao 发表于 2016-8-15 19:02
那我就不知道了,你这个片子我也没有用过,前面只是大概的跟你探讨下思路。。。。

好的,谢谢指教。
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

16
 
huaiqiao 发表于 2016-8-15 19:02
那我就不知道了,你这个片子我也没有用过,前面只是大概的跟你探讨下思路。。。。

好吧,最后发现还是以前的问题,没有ACK返回。但是在这之前的CLK,SDA都是按照说明写的,现在很茫然
此帖出自stm32/stm8论坛

点评

从官网的例程中,没有启发?还是没有下载官网的例程?  详情 回复 发表于 2016-8-17 22:36
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

17
 
nevergodie 发表于 2016-8-16 09:06
好的,谢谢指教。
  1. #define SDA_IN  {RCC->APB2ENR|=(unsigned int)1<<3;GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(unsigned int)8<<28;GPIOB->ODR|=(unsigned int)1<<7;}
  2. #define SDA_OUT {RCC->APB2ENR|=(unsigned int)1<<3;GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(unsigned int)3<<28;GPIOB->ODR|=(unsigned int)1<<7;}


  3. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                               
  4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
  5. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 
  6. GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
  7. GPIO_SetBits(GPIOB,GPIO_Pin_6);                                                 
  8.        

  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  12.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  13.         GPIO_SetBits(GPIOB,GPIO_Pin_7);


  14. void IIC_SendByte(char ch)       
  15. {
  16.         char i;
  17.         SDA_OUT;                        //to enable SDATA pin as an output
  18.         AD7746_SCLK = 0;                        //make sure that the clock line is low
  19.         //delay(20);
  20.         for(i=0;i<8;i++)
  21.         {
  22.                 AD7746_SDAout=0;
  23.                 if(ch&0x80)
  24.                         AD7746_SDAout=1;
  25.                 else
  26.                         AD7746_SDAout=0;
  27.                 ch = ch<<1;       
  28.                 delay(5);
  29.                 AD7746_SCLK = 1;                //clock to send bit
  30.                 delay(5);
  31.                 AD7746_SCLK = 0;                //clear clock
  32.                 delay(5);
  33.                         //move ch's bit
  34.         }
  35.         SDA_IN;                        //release data line for acknowledge     
  36.        
  37.         AD7746_SCLK = 1;                //send clock for acknowledge
  38.         delay(2);
  39.         //AD7746_SDAout=1;
  40.         //delay(2);
  41.         if(!AD7746_SDAin)                                //no acknowledge, set flag
  42.         {
  43.                
  44.                         IIC_Flag |= 1<<NOACK;
  45.         }

  46.        
  47.         delay(20);
  48.         AD7746_SCLK = 0;                        //clear clock
  49. }




  50. void CDC_RDCAP(void)
  51. {
  52.         IIC_StartBit();
  53.         IIC_SendByte(SLAVEADD);
  54.         if(!(IIC_Flag&(1<<NOACK)))
  55.                 IIC_SendByte(CDC_CAPDATA_ADDR);
  56.         if(!(IIC_Flag&(1<<NOACK)))
  57.         {
  58.                 IIC_StartBit();                                //re-start
  59.                 IIC_SendByte(SLAVEADD+1);        //read function
  60.         }
  61.         if(!(IIC_Flag&(1<<NOACK)))
  62.                 CapResult_H = IIC_RcvByte(0);        //read cap data reg
  63.         if(!(IIC_Flag&(1<<NOACK)))
  64.                 CapResult_M = IIC_RcvByte(0);
  65.         if(!(IIC_Flag&(1<<NOACK)))
  66.                 CapResult_L = IIC_RcvByte(1);               
  67.         IIC_StopBit();
  68.         if(IIC_Flag&(1<<NOACK))
  69.                 IIC_Flag |= 1<<ERR;
  70. }
复制代码
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

18
 
nevergodie 发表于 2016-8-17 11:36
好吧,最后发现还是以前的问题,没有ACK返回。但是在这之前的CLK,SDA都是按照说明写的,现在很茫然

从官网的例程中,没有启发?还是没有下载官网的例程?
此帖出自stm32/stm8论坛

点评

已经能通过i2c,但是获取的数据感觉有问题。  详情 回复 发表于 2016-8-18 09:34
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

19
 
huaiqiao 发表于 2016-8-17 22:36
从官网的例程中,没有启发?还是没有下载官网的例程?

已经能通过i2c,但是获取的数据感觉有问题。
此帖出自stm32/stm8论坛

点评

楼主啊,这个不能靠感觉啊。你计算一定要有肯定的数据的。你这个不是计算电容的吗,那你就拿几个小电容(规格一定的)来用这个芯片来计算。这样更有理由说明你的算法等等的是否正确呢。 以上,我只是举个例子,实际  详情 回复 发表于 2016-8-18 09:39
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

20
 
nevergodie 发表于 2016-8-18 09:34
已经能通过i2c,但是获取的数据感觉有问题。

楼主啊,这个不能靠感觉啊。你计算一定要有肯定的数据的。你这个不是计算电容的吗,那你就拿几个小电容(规格一定的)来用这个芯片来计算。这样更有理由说明你的算法等等的是否正确呢。
以上,我只是举个例子,实际是不是这样做,还是要看你的电路跟程序适用的环境等等的呢。
此帖出自stm32/stm8论坛

点评

因为之前我用的评估板,ADI公司有软件,上位机,采用cypress的芯片什么的。然后我接入可变电容之后,差不多在0上下浮动,但是我这次是自己用ADI的芯片,接入同样的传感器,连接stm32.读出来的数接近于-4pf(AD7746量  详情 回复 发表于 2016-8-18 10:45
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表