ADXL345三轴XYZ输出数据不对,Z明显超过手册值

2019-07-21 01:52发布

我的ADXL345读取ID和向寄存器读写数值都正确,但是读取XYZ的数值明显不对
下面是初始化函数
void ADXL345_HW_SPI_Init(void)
{
    SPI_InitTypeDef  SPI_InitStructure;

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式

        SPI_Init(ADXL345_SPI_x, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  SPI_Cmd(ADXL345_SPI_x, ENABLE); //使能SPI外设
}  
寄存器的配置如下
        write_byte(0X31,0X0A);        //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
                //ADXL345_WR_Reg(0X2C,0x0A);                //数据输出速度为100Hz
        write_byte(0X2C,0x0A);
                //ADXL345_WR_Reg(0X2D,0x28);                   //链接使能,测量模式
        write_byte(0X2D,0x08);//0x08
                write_byte(0X2E,0x00);        //不使用中断                 
//                 write_byte(0X1E,0xF3);
//                write_byte(0X1F,0xE8);
//                write_byte(0X20,0xBA);
                 write_byte(0X1E,0x00);
                write_byte(0X1F,0x00);
                write_byte(0X20,0x00);
读写函数如下
u8 read_byte(u8 add)
{
    // GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_L;
     SPI_I2S_SendData(SPI1,(add|0x80)<<8|0x00);
  
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
   
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
   
    //GPIO_SetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_H;
   
    return SPI_I2S_ReceiveData(SPI1)&0xff;
  
}

void write_byte(u8 add,u8 val)
{
     //GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_L;

     SPI_I2S_SendData(SPI1,add<<8|val);
  
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
   
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
   
    //GPIO_SetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_H;
     SPI_I2S_ReceiveData(SPI1)&0xff;
  
}
读取XYZ
        for(i=0;i<6;i++)
        {
                buf[i]=read_byte(0x32+i);  
        }       

        BUF[0]=(buf[1]<<8)+buf[0];
        BUF[1]=(buf[3]<<8)+buf[2];
        BUF[2]=(buf[5]<<8)+buf[4];

读出来的数据是这样的:
BUF[0]:0X003A   
BUF[1]:0X0062
BUF[2]:0X04A6
显然0x4A6(十进制后为1190),13位±16g,那么1190*3.9mg=4641mg,显然大于1g
读取ID和其他可读可写寄存器都是正确的
是什么问题呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
Chen_YH
1楼-- · 2019-07-21 07:31
楼主问题解决了吗?我得也是Z轴数据过大,求解决方法
姜波
2楼-- · 2019-07-21 08:30
楼主解决问题了吗
月下良缘
3楼-- · 2019-07-21 12:04
楼主估计都不在这里了吧!

一周热门 更多>