我的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和其他可读可写寄存器都是正确的
是什么问题呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>