关于ADXL345传感器的中断采集数据问题,请进
我想用ADXL345的中断采集数据。我现在用的是模拟的I2C协议采集,但是我觉得这么采集,感觉上,是主动的采,要是我的通信速率太快,会不会回复我无应答信号。等等。然后我对数据又进行了处理,错误地当成采集到的数。那就错了~~~~所以,我不放心。希望能通过中断方式,实时地去采集然后得到正确的数据再进行保存处理。。。希望大神教下
读取数据时判断一下寄存器的数据准备标志就不怕独到无用的数据了中断方式可以节省MCU的资源 可以降低功耗 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存储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);
elseGPIO_ResetBits(GPIOA,SDA);
txd<<=1;
GPIO_SetBits(GPIOA,SCL);
delay_us(1);
GPIO_ResetBits(GPIOA,SCL);
delay_us(1);
}
IIC_Wait_Ack();
} littleshrimp 发表于 2017-1-19 18:03
读取数据时判断一下寄存器的数据准备标志就不怕独到无用的数据了中断方式可以节省MCU的资源 可以降低功耗
他对应答位没判断,就好像是觉得一定有应答一样,每次多字节读取 大家都是好朋友 发表于 2017-1-19 18:25
还要read那个里面的的状态标志位?那如果不读的话,我是不是应该对有无应答位做个判断,无的话就重新不停 ...
数据准备和I2C总线应该达没有直接关系ADXL345的I2C速率最大是400K
理论上你只要低于这个速率,他就会给你应答
你也可以读到数据
但是如果你的输出速率比较低,这时输出寄存器的数据没有更新,你读到的数据就有可能是无用数据
刚才简单看了一下,没发现数据准备寄存器
不过可以使用中断或者试试FIFO模式
建议你仔细读一下数据手册
官方提供了中文手册,看起来还是挺方便的
页:
[1]