zhongjiequan 发表于 2015-6-8 00:18:42

【求助】MPU9150读磁力计数据问题

本帖最后由 zhongjiequan 于 2015-6-8 00:19 编辑

我对mpu9150开了I2C pass-by模式,能读出AK8976的ID,但写测量命令后,还是无法读出磁力计数据
写自检命令,却能读到磁力的自检。。。

以下我mpu9150的代码
        mpu6050_reset(mpu9150_device.i2c_bus);
        mpu9150_delay_ms(100);

        mpu6050_set_sleep_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Activate MPU6050
        mpu6050_set_temp_sensor_enabled(mpu9150_device.i2c_bus,RT_TRUE);// Enable temp sensor
        mpu6050_set_int_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Disable interrupts
       

        mpu6050_set_rate(mpu9150_device.i2c_bus,1);
        mpu6050_set_DLFP_mode(mpu9150_device.i2c_bus,MPU6050_DLPF_BW_188);// Set digital low-pass bandwidth
        mpu6050_set_clock_source(mpu9150_device.i2c_bus,MPU6050_CLOCK_PLL_XGYRO);// Set x-axis gyro as clock source
        mpu6050_set_full_scale_gyro_range(mpu9150_device.i2c_bus,MPU6050_GYRO_FS_2000);// Set gyro full scale range
        mpu6050_set_full_scale_accel_range(mpu9150_device.i2c_bus,MPU6050_ACCEL_FS_16);// Set accelerometer full scale range
       
        mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_TRUE);
       
        rt_kprintf("ak8975_get_device_ID = 0x%2x\n",ak8975_get_device_ID(mpu9150_device.i2c_bus));
        ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
        rt_int16_t gx,gy,gz,ax,ay,az,mx,my,mz;
        rt_uint8_t flag;
        while(1)
        {
                flag = ak8975_get_data_ready(mpu9150_device.i2c_bus);
                rt_kprintf("ak8975_get_data_ready = 0x%2x\n",flag);
                mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_FALSE);
                if(flag == 0x01)
                {
                        ak8975_get_magnetometer(mpu9150_device.i2c_bus,&mx,&my,&mz);
                        rt_kprintf("mx=%d,my=%d,mz=%d\n",mx,my,mz);
                        ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
               
                }
                rt_thread_delay(100);
        }

zhongjiequan 发表于 2015-6-10 16:54:35

自己顶一下,就没人懂???

Timingtime 发表于 2015-6-13 12:07:27

http://bbs.21ic.com/icview-605405-1-1.html你可以看看这贴怎样

TheBest 发表于 2015-6-15 13:55:36

楼主你好,这几天我也在弄mpu915的磁力计部分,差不多也遇到跟你相似的问题。我9150里关于6050的数据是能读出来的,但是按照网上说的去读取磁力计,就只有2个值,要么是0要么是-256.这是我的代码,希望能有大神来给我们这种菜鸟指点一二,在这里万分感谢void MPU6050_Init()
{
        IIC_Init();
       
        //device init
        IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);       
        IIC_DelayMs(20);

        IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x03);       
        IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x02);
        IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x00);
        IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
        IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
       
        //IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);
        //IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x07);
        //IIC_Write_Data(MPU6050_Addr,CONFIG, 0x06);

        IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x02);
        IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
        IIC_Write_Data(MAGADD,CNTL, 0x00);
        IIC_DelayMs(2);
        IIC_Write_Data(MAGADD,CNTL, 0x01);
       
        //IIC_Read_Data_N(MAGADD,0X10,3,mag_sens_adj);
       
}
uint16_t MPU6050_Read(unsigned char REG_Address)
{
        uint8_t H,L;
        uint16_t temp;
        H=IIC_Read_Data(MPU6050_Addr,REG_Address);
        L=IIC_Read_Data(MPU6050_Addr,REG_Address+1);
        temp= (H<<8)|L ;   
        return temp;
}

uint16_t COMPASS_Read(unsigned char REG_Address)
{
        uint8_t H,L;
        uint16_t temp;
       

        H=IIC_Read_Data(MAGADD,REG_Address);       
        IIC_Write_Data(MAGADD,CNTL, 0x01);       
        L=IIC_Read_Data(MAGADD,REG_Address-1);       
        IIC_Write_Data(MAGADD,CNTL, 0x01);
       
       
        temp= (H<<8)|L ;   
       
        return temp;
}


void MPU6050_CONVENT()
{
        ACC.X=MPU6050_Read(ACCEL_XOUT_H)-ACC_OFFSET.X;
        ACC.Y=MPU6050_Read(ACCEL_YOUT_H)-ACC_OFFSET.Y;
        ACC.Z=MPU6050_Read(ACCEL_ZOUT_H)-ACC_OFFSET.Z;
       
        GYR_RATE.X=MPU6050_Read(GYRO_XOUT_H);
        GYR_RATE.Y= MPU6050_Read(GYRO_YOUT_H);
        GYR_RATE.Z=MPU6050_Read(GYRO_ZOUT_H);
       
        COMPASS.X=COMPASS_Read(HXH);
        COMPASS.Y=COMPASS_Read(HYH);
        COMPASS.Z=COMPASS_Read(HZH);
       
        //COMPASS.X=((long)COMPASS.X * mag_sens_adj) >> 8;
        //COMPASS.Y=((long)COMPASS.X * mag_sens_adj) >> 8;
        //COMPASS.Z=((long)COMPASS.X * mag_sens_adj) >> 8;
       
        GYR.X= GYR_RATE.X-GYR_OFFSET.X;
        GYR.Y= GYR_RATE.Y-GYR_OFFSET.Y;
        GYR.Z= GYR_RATE.Z-GYR_OFFSET.Z;
       
       
       
}

TheBest 发表于 2015-6-15 13:59:06

#define        SMPLRT_DIV                0x19        //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz)
#define        CONFIG_MPU6050                          0x1A        //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz)
#define        GYRO_CONFIG                0x1B        //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s)
#define        ACCEL_CONFIG        0x1C        //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz)

#define        ACCEL_XOUT_H        0x3B
#define        ACCEL_XOUT_L        0x3C

#define        ACCEL_YOUT_H        0x3D
#define        ACCEL_YOUT_L        0x3E

#define        ACCEL_ZOUT_H        0x3F
#define        ACCEL_ZOUT_L        0x40

#define        TEMP_OUT_H                0x41
#define        TEMP_OUT_L                0x42

#define        GYRO_XOUT_H                0x43
#define        GYRO_XOUT_L                0x44       

#define        GYRO_YOUT_H                0x45
#define        GYRO_YOUT_L                0x46

#define        GYRO_ZOUT_H                0x47
#define        GYRO_ZOUT_L                0x48

#define        PWR_MGMT_1                0x6B        //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ)
#define        WHO_AM_I                0x75        //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á)

//#define        SMPLRT_DIV                0x19        //??????,???:0x07(125Hz)
#define        CONFIG                        0x1A        //??????,???:0x06(5Hz)
#define HXL             0X03
#define HXH             0X04
#define HYL             0X05
#define HYH             0X06
#define HZL             0X07
#define HZH             0X08
#define CNTL            0X0A
#define INT_PIN_CFG                0X37
#define USER_CTRL       0X6A
#define MPU9150SLAADD   0XD0

#define MAGADD                        0X18
//#define        PWR_MGMT_1                0x6B        //????,???:0x00(????)

#define        WHO_AM_I                        0x75        //IIC?????(????0x68,??)
//****************************

#define        MPU6050_Addr   0xD0          //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALTADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä

zhongjiequan 发表于 2015-6-15 16:02:52

TheBest 发表于 2015-6-15 13:59


啥意思?

zhongjiequan 发表于 2015-6-15 16:03:35

Timingtime 发表于 2015-6-13 12:07
http://bbs.21ic.com/icview-605405-1-1.html你可以看看这贴怎样

看过,不能解决我的问题

TheBest 发表于 2015-6-15 16:25:52

zhongjiequan 发表于 2015-6-15 16:03
看过,不能解决我的问题

看过,没啥用,找了几个程序安照他们的配置,compass.x输出的值要么是0要么是-256,没啥用。严重怀疑我芯片是不是出问题了,或者接线不对(只接了SCL   SDAVCC GND)。真心感觉没啥问题        IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x01);       
        IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x03);
        IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
        IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
        IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x32);
        IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
        IIC_DelayMs(10);
       
        IIC_Write_Data(MAGADD,CNTL, 0x01);
        IIC_DelayMs(10);

恋芜 发表于 2015-6-15 20:32:19

每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没?

恋芜 发表于 2015-6-15 20:39:45

还有,地磁传感器的数据读取周期不能小于7ms。亲测8毫秒是可以的

zhongjiequan 发表于 2015-6-16 17:50:40

恋芜 发表于 2015-6-15 20:32
每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没?

有写,也等了10ms。可是。。。哎

恋芜 发表于 2015-6-17 19:50:47

我发了一个开源帖子,看能解决你的问题不【开源】模拟IIC读取MPU9250九轴+温度数据

maskblue 发表于 2015-8-5 17:25:08

CC2541软件模拟i2c读取没问题,但是硬件i2c读取加速计和陀螺仪没有问题,磁力计数据有问题,
要么不对要么读不出来!

maskblue 发表于 2015-8-6 15:30:41

问题已经解决,噢耶!

zhongjiequan 发表于 2015-8-7 16:07:36

maskblue 发表于 2015-8-6 15:30
问题已经解决,噢耶!

敢问是怎么解决的

kxwzj 发表于 2015-8-8 01:17:47

解决了不分享下<(-︿-)>
页: [1]
查看完整版本: 【求助】MPU9150读磁力计数据问题