_ao_bmm150_wait_manual();
}
+#if BMX160_TEST
static uint8_t
_ao_bmm150_reg_read(uint8_t addr)
{
_ao_bmm150_wait_manual();
return _ao_bmx160_reg_read(BMX160_DATA_0);
}
+#endif
static void
_ao_bmx160_sample(struct ao_bmx160_sample *sample)
static void
_ao_bmx160_setup(void)
{
+ int r;
+
if (ao_bmx160_configured)
return;
/* Make sure the chip is responding */
_ao_bmx160_wait_alive();
- /* Reboot */
- _ao_bmx160_cmd(BMX160_CMD_SOFTRESET);
-
/* Force SPI mode */
_ao_bmx160_reg_write(BMX160_NV_CONF, 1 << BMX160_NV_CONF_SPI_EN);
+ /* Enable acc and gyr
+ */
+
+ _ao_bmx160_cmd(BMX160_CMD_ACC_SET_PMU_MODE(BMX160_PMU_STATUS_ACC_PMU_STATUS_NORMAL));
+
+ for (r = 0; r < 20; r++) {
+ ao_delay(AO_MS_TO_TICKS(100));
+ if (((_ao_bmx160_reg_read(BMX160_PMU_STATUS)
+ >> BMX160_PMU_STATUS_ACC_PMU_STATUS)
+ & BMX160_PMU_STATUS_ACC_PMU_STATUS_MASK)
+ == BMX160_PMU_STATUS_ACC_PMU_STATUS_NORMAL)
+ {
+ r = 0;
+ break;
+ }
+ }
+ if (r != 0)
+ AO_SENSOR_ERROR(AO_DATA_BMX160);
+
+ _ao_bmx160_cmd(BMX160_CMD_GYR_SET_PMU_MODE(BMX160_PMU_STATUS_GYR_PMU_STATUS_NORMAL));
+
+ for (r = 0; r < 20; r++) {
+ ao_delay(AO_MS_TO_TICKS(100));
+ if (((_ao_bmx160_reg_read(BMX160_PMU_STATUS)
+ >> BMX160_PMU_STATUS_GYR_PMU_STATUS)
+ & BMX160_PMU_STATUS_GYR_PMU_STATUS_MASK)
+ == BMX160_PMU_STATUS_GYR_PMU_STATUS_NORMAL)
+ {
+ r = 0;
+ break;
+ }
+ }
+ if (r != 0)
+ AO_SENSOR_ERROR(AO_DATA_BMX160);
+
/* Configure accelerometer:
*
* undersampling disabled
_ao_bmx160_reg_write(BMX160_ACC_RANGE,
BMX160_ACC_RANGE_16G);
+ for (r = 0x3; r <= 0x1b; r++)
+ (void) _ao_bmx160_reg_read(r);
+
/* Configure gyro:
*
* 200Hz sampling rate
(0 << BMX160_MAG_IF_0_MAG_OFFSET) |
(0 << BMX160_MAG_IF_0_MAG_RD_BURST));
- /* Enable acc and gyr
- */
-
- _ao_bmx160_cmd(BMX160_CMD_ACC_SET_PMU_MODE(BMX160_PMU_STATUS_ACC_PMU_STATUS_NORMAL));
- _ao_bmx160_cmd(BMX160_CMD_GYR_SET_PMU_MODE(BMX160_PMU_STATUS_GYR_PMU_STATUS_NORMAL));
ao_bmx160_configured = 1;
}