小学生
最后登录1970-1-1
在线时间 小时
注册时间2023-9-15
|
通讯完后读取数据只有x轴有数据,y和z数据不变,一直都是-1。有没有大佬知道这是什么情况。
//iic连续读
uint8_t QMC5883p_Read_Len(uint8_t reg,uint8_t len,uint8_t *buf)
{
iic_start();
iic_send_byte(QMC5883P_WRITE_ADDR);//发送器件地址+写命令
if(iic_wait_ack())
{
iic_stop();
printf("无从设备应答信号写3");
}
iic_send_byte(reg); //发送存储单元地址,从0x01开始
if(iic_wait_ack())
{
iic_stop();
printf("无从设备应答信号写3");
}
iic_start();
iic_send_byte(QMC5883P_READ_ADDR); //发送设备地址+读
if(iic_wait_ack())
{
iic_stop();
printf("无从设备应答信号写3");
}
while(len)
{
if(len==1)*buf=iic_read_byte(1);//读数据,发送nACK
else *buf=iic_read_byte(0); //读数据,发送ACK
len--;
buf++;
}
iic_stop(); //产生IIC停止信号
return 0;
}
//qmc5883p初始化
//用来衡量磁感应强度大小的单位是Tesla或者Gauss(1Tesla=10000Gauss)
void qmc5883p_init()
{
Single_Write_QMC5883(0x29,0x06); //定义XYZ方向
Single_Write_QMC5883(0x0B,0x0C); //2Guass:0x0C 8Guass:0x08 12Guass:0x04 30Guass:0x00
Single_Write_QMC5883(0x0A,0xCD); //标准模式,200HZ
}
//真实数据获取
void QMC5883p_get_data(double *actual_x,double *actual_y,double *actual_z)
{
uint8_t buf[6],res;
int16_t x,y,z;
res=QMC5883p_Read_Len(QMC5883P_DATA_OUT_X_LSB_REG,6,buf);
if(res==0)
{
x=((int16_t)buf[1]<<8)|buf[0];
y=((int16_t)buf[3]<<8)|buf[2];
z=((int16_t)buf[5]<<8)|buf[4];
printf("寄存器X:%d;寄存器Y:%d寄存器z:%d\r\n",x,y,z);
}
*actual_x = (double)(((double)x / 32768) * 2000);
*actual_y = (double)(((double)y / 32768) * 2000);
*actual_z = (double)(((double)z / 32768) * 2000);
}
|
|