初始化,读出的ID都是正确的,X和Y轴都是正确的,不同方向寄存器值范围:0到320左右;
但Z轴不对,不同方向寄存器值范围:700到1220左右;
水平放置时Z轴寄存器值是1220, 反方向放置是700; (正确应该是: 255 ,0)
u8 ADXL345_Init(void)
{
IIC_Init();
if(ADXL345_RD_Reg(DEVICE_ID)==0XE5) //读取器件ID
{
ADXL345_WR_Reg(DATA_FORMAT,0X2B); //13位全分辨率,输出数据右对齐,16g量程
ADXL345_WR_Reg(BW_RATE,0x0A); //数据输出速度为100Hz
ADXL345_WR_Reg(POWER_CTL,0x28); //链接使能,测量模式
ADXL345_WR_Reg(INT_ENABLE,0x00); //不使用中断
ADXL345_WR_Reg(OFSX,0x00);
ADXL345_WR_Reg(OFSY,0x00);
ADXL345_WR_Reg(OFSZ,0x00);
return 0;
}
return 1;
}
//x,y,z:读取到的数据
void ADXL345_RD_XYZ(short *x,short *y,short *z)
{
u8 buf[6];
u8 i;
IIC_Start();
IIC_Send_Byte(ADXL_WRITE); //发送写器件指令
IIC_Wait_Ack();
IIC_Send_Byte(0x32); //发送寄存器地址(数据缓存的起始地址为0X32)
IIC_Wait_Ack();
IIC_Start(); //重新启动
IIC_Send_Byte(ADXL_READ); //发送读器件指令
IIC_Wait_Ack();
for(i=0;i<6;i++)
{
if(i==5) buf[i]=IIC_Read_Byte(0); //读取一个字节,不继续再读,发送NACK
else buf[i]=IIC_Read_Byte(1); //读取一个字节,继续读,发送ACK
}
IIC_Stop(); //产生一个停止条件
*x=(short)((((u16)buf[1]<<8)+buf[0]));
*y=(short)((((u16)buf[3]<<8)+buf[2]));
*z=(short)((((u16)buf[5]<<8)+buf[4]));
}
|