社区导航

 
查看: 3778|回复: 4

[讨论] 关于ADXL345传感器的中断采集数据问题,请进

[复制链接]

98

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-19 16:13:41 | 显示全部楼层 |阅读模式
我想用ADXL345的中断采集数据。我现在用的是模拟的I2C协议采集,但是我觉得这么采集,感觉上,是主动的采,要是我的通信速率太快,会不会回复我无应答信号。等等。然后我对数据又进行了处理,错误地当成采集到的数。那就错了~~~~
所以,我不放心。希望能通过中断方式,实时地去采集然后得到正确的数据再进行保存处理。。。希望大神教下


回复

使用道具 举报

5141

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 18:03:28 来自手机 | 显示全部楼层
读取数据时判断一下寄存器的数据准备标志就不怕独到无用的数据了  中断方式可以节省MCU的资源 可以降低功耗

点评

他对应答位没判断,就好像是觉得一定有应答一样,每次多字节读取  详情 回复 发表于 2017-1-19 18:26
还要read那个里面的的状态标志位?那如果不读的话,我是不是应该对有无应答位做个判断,无的话就重新不停发设备地址,而不是发设备地址+1去读。这有没有影响。你有没有用过这传感器?而且现在我也没搞到那个数据该怎  详情 回复 发表于 2017-1-19 18:25


回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-19 18:25:08 | 显示全部楼层
littleshrimp 发表于 2017-1-19 18:03
读取数据时判断一下寄存器的数据准备标志就不怕独到无用的数据了  中断方式可以节省MCU的资源 可以降低功耗

还要read那个里面的的状态标志位?那如果不读的话,我是不是应该对有无应答位做个判断,无的话就重新不停发设备地址,而不是发设备地址+1去读。这有没有影响。你有没有用过这传感器?而且现在我也没搞到那个数据该怎么保存,然后什么生产消费的阶段,我现在就是收到个数显示个数而已。你看源程序这么写的
void Multiple_read_ADXL345(void)
{   uchar i;
    IIC_Start();                            //起始信号
    IIC_Send_Byte(SlaveAddress)  ;             //发送设备地址+写信号
   IIC_Send_Byte(0x32) ;                   //发送存储单元地址,从0x32开始       
     IIC_Start()   ;                         //起始信号
    IIC_Send_Byte(SlaveAddress+1)  ;        //发送设备地址+读信号
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF =  IIC_Read_Byte();          //BUF[0]存储0x32地址中的数据
        if (i == 5)
        {
         IIC_NAck();              //最后一个数据需要回NOACK
        }
        else
        {
         IIC_Ack();                    //回应ACK
       }
                               
   }
        IIC_Stop() ;   
}
u8 IIC_Wait_Ack(void)
{
        u8 a=0;
        SDA_IN();      //SDA设置为输入
  GPIO_SetBits(GPIOA,SDA);
  GPIO_SetBits(GPIOA,SCL);
        delay_us(2);         
        a = GPIO_ReadInputDataBit( GPIOA, SDA);
        //while(a==1);
        GPIO_ResetBits(GPIOA, SCL) ;//时钟输出0        
    delay_us(2);       
        return a;  
}
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
     
    for(t=0;t<8;t++)
    {              
        if((txd&0x80)>>7)  GPIO_SetBits(GPIOA,SDA);
                else  GPIO_ResetBits(GPIOA,  SDA);
        txd<<=1;           
                GPIO_SetBits(GPIOA,SCL);
                delay_us(1);
                GPIO_ResetBits(GPIOA,  SCL);       
                delay_us(1);
    }         
        IIC_Wait_Ack();
       
}             

点评

数据准备和I2C总线应该达没有直接关系ADXL345的I2C速率最大是400K 理论上你只要低于这个速率,他就会给你应答 你也可以读到数据  详情 回复 发表于 2017-1-19 18:51


回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-1-19 18:26:18 | 显示全部楼层
littleshrimp 发表于 2017-1-19 18:03
读取数据时判断一下寄存器的数据准备标志就不怕独到无用的数据了  中断方式可以节省MCU的资源 可以降低功耗

他对应答位没判断,就好像是觉得一定有应答一样,每次多字节读取


回复

使用道具 举报

5141

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-19 18:51:56 | 显示全部楼层
大家都是好朋友 发表于 2017-1-19 18:25
还要read那个里面的的状态标志位?那如果不读的话,我是不是应该对有无应答位做个判断,无的话就重新不停 ...

数据准备和I2C总线应该达没有直接关系ADXL345的I2C速率最大是400K
理论上你只要低于这个速率,他就会给你应答
你也可以读到数据

QQ图片20170119184339.png


但是如果你的输出速率比较低,这时输出寄存器的数据没有更新,你读到的数据就有可能是无用数据 QQ图片20170119184534.png


刚才简单看了一下,没发现数据准备寄存器
不过可以使用中断或者试试FIFO模式

建议你仔细读一下数据手册
官方提供了中文手册,看起来还是挺方便的
ADXL345_cn.pdf (1004.5 KB, 下载次数: 18)
虾扯蛋


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-17 13:12 , Processed in 0.147587 second(s), 18 queries , Gzip On, Redis On.

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