llq_ARM 发表于 2014-9-17 11:52:40

STM32读MPU6050的DMP数据,自检不过

int mpu_run_self_test(long *gyro, long *accel)
{
#ifdef MPU6050
    const unsigned char tries = 2;
    long gyro_st, accel_st;
    unsigned char accel_result, gyro_result;
#ifdef AK89xx_SECONDARY
    unsigned char compass_result;
#endif
    int ii;
#endif
    int result;
    unsigned char accel_fsr, fifo_sensors, sensors_on;
    unsigned short gyro_fsr, sample_rate, lpf;
    unsigned char dmp_was_on;

    if (st.chip_cfg.dmp_on) {
      mpu_set_dmp_state(0);
      dmp_was_on = 1;
    } else
      dmp_was_on = 0;

    /* Get initial settings. */
    mpu_get_gyro_fsr(&gyro_fsr);
    mpu_get_accel_fsr(&accel_fsr);
    mpu_get_lpf(&lpf);
    mpu_get_sample_rate(&sample_rate);
    sensors_on = st.chip_cfg.sensors;
    mpu_get_fifo_config(&fifo_sensors);

    /* For older chips, the self-test will be different. */
#if defined MPU6050
    for (ii = 0; ii < tries; ii++)
      if (!get_st_biases(gyro, accel, 0))
            break;
    if (ii == tries) {
      /* If we reach this point, we most likely encountered an I2C error.
         * We'll just report an error for all three sensors.
         */
      result = 0;
      goto restore;
    }
    for (ii = 0; ii < tries; ii++)
      if (!get_st_biases(gyro_st, accel_st, 1))
            break;
    if (ii == tries) {
      /* Again, probably an I2C error. */
      result = 0;
      goto restore;
    }
    accel_result = accel_self_test(accel, accel_st);
    gyro_result = gyro_self_test(gyro, gyro_st);

    result = 0;
    if (!gyro_result)
      result |= 0x01;
    if (!accel_result)
      result |= 0x02;

#ifdef AK89xx_SECONDARY
    compass_result = compass_self_test();
    if (!compass_result)
      result |= 0x04;
#endif
restore:
#elif defined MPU6500
    /* For now, this function will return a "pass" result for all three sensors
   * for compatibility with current test applications.
   */
    get_st_biases(gyro, accel, 0);
    result = 0x7;
#endif
    /* Set to invalid values to ensure no I2C writes are skipped. */
    st.chip_cfg.gyro_fsr = 0xFF;
    st.chip_cfg.accel_fsr = 0xFF;
    st.chip_cfg.lpf = 0xFF;
    st.chip_cfg.sample_rate = 0xFFFF;
    st.chip_cfg.sensors = 0xFF;
    st.chip_cfg.fifo_enable = 0xFF;
    st.chip_cfg.clk_src = INV_CLK_PLL;
    mpu_set_gyro_fsr(gyro_fsr);
    mpu_set_accel_fsr(accel_fsr);
    mpu_set_lpf(lpf);
    mpu_set_sample_rate(sample_rate);
    mpu_set_sensors(sensors_on);
    mpu_configure_fifo(fifo_sensors);

    if (dmp_was_on)
      mpu_set_dmp_state(1);

    return result;
}

上面这个函数是自检函数在    accel_result = accel_self_test(accel, accel_st);
    gyro_result = gyro_self_test(gyro, gyro_st);

    result = 0;
    if (!gyro_result)
      result |= 0x01;
    if (!accel_result)
      result |= 0x02;这里accel_result 和gyro_result 都是0x07所以自检不过,有遇到过类似情况的吗,怎么解决?

and001 发表于 2014-9-17 20:38:38

搞个沙发坐一下先

and001 发表于 2014-9-17 20:39:57

我也在弄这个!是不是RESET后MPU6050延时不够

llq_ARM 发表于 2014-9-18 09:25:50

and001 发表于 2014-9-17 20:39
我也在弄这个!是不是RESET后MPU6050延时不够

这样啊,可以试试,你的现在什么情况了

and001 发表于 2014-9-18 10:05:01

我也在调试,但苦于没上位机的波形显示(三轴的)

v灰尘 发表于 2014-11-12 23:18:39

遇到和楼主一样的问题,返回值是ox03 和0x7,读不了数据,不知道哪里出问题了,不知道楼主的问题解决了没有。

ZENO_Embed 发表于 2015-1-27 21:39:47

v灰尘 发表于 2014-11-12 23:18
遇到和楼主一样的问题,返回值是ox03 和0x7,读不了数据,不知道哪里出问题了,不知道楼主的问题解决了没 ...

各位好,我在移植mpu6050 dmp到nrf51822遇到同样的问题,请问解决了吗,能否分享下经验!是IIC有问题吗。读原始数据都可以啊!

v灰尘 发表于 2015-1-28 11:31:35

ZENO_Embed 发表于 2015-1-27 21:39
各位好,我在移植mpu6050 dmp到nrf51822遇到同样的问题,请问解决了吗,能否分享下经验!是IIC有问题吗。 ...

我是这样做的,初始化的时候给一个无限循环,一直读数据,等到读到正确的数据后,跳出。

ZENO_Embed 发表于 2015-1-28 11:50:57

v灰尘 发表于 2015-1-28 11:31
我是这样做的,初始化的时候给一个无限循环,一直读数据,等到读到正确的数据后,跳出。 ...

好的,谢谢您的回复!
页: [1]
查看完整版本: STM32读MPU6050的DMP数据,自检不过