From 67356ae163487e57e6d9c83cb2b7f71a69f8aa27 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 20 Feb 2020 16:51:15 -0800 Subject: [PATCH] altos: Get BMX160 initialized correctly 1. Don't reboot at startup. This probably takes a lot longer than 100ms. 2. Power up acc and gyr before attempting to configure 3. Clear data registers after setting acc range Signed-off-by: Keith Packard --- src/drivers/ao_bmx160.c | 18 ++++++++++-------- src/drivers/ao_bmx160.h | 2 -- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/drivers/ao_bmx160.c b/src/drivers/ao_bmx160.c index e1af23a1..e4397fc4 100644 --- a/src/drivers/ao_bmx160.c +++ b/src/drivers/ao_bmx160.c @@ -183,18 +183,23 @@ _ao_bmx160_wait_alive(void) 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)); + _ao_bmx160_cmd(BMX160_CMD_GYR_SET_PMU_MODE(BMX160_PMU_STATUS_GYR_PMU_STATUS_NORMAL)); + /* Configure accelerometer: * * undersampling disabled @@ -210,6 +215,8 @@ _ao_bmx160_setup(void) (BMX160_ACC_CONF_ACC_ODR_200 << BMX160_ACC_CONF_ACC_ODR)); _ao_bmx160_reg_write(BMX160_ACC_RANGE, BMX160_ACC_RANGE_16G); + for (r = 0x4; r <= 0x17; r++) + (void) _ao_bmx160_reg_read(r); /* Configure gyro: * @@ -276,11 +283,6 @@ _ao_bmx160_setup(void) (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; } diff --git a/src/drivers/ao_bmx160.h b/src/drivers/ao_bmx160.h index 2b7e7bd7..e62f172d 100644 --- a/src/drivers/ao_bmx160.h +++ b/src/drivers/ao_bmx160.h @@ -130,8 +130,6 @@ ao_bmx160_init(void); #define BMX160_ACC_RANGE_4G 0x5 #define BMX160_ACC_RANGE_8G 0x8 #define BMX160_ACC_RANGE_16G 0xc -#define BMX160_ACC_RANGE_ -#define BMX160_ACC_RANGE_ #define BMX160_GYR_CONF 0x42 #define BMX160_GYR_CONF_GYR_ODR 0 #define BMX160_GYR_CONF_GYR_ODR_25 0x6 -- 2.30.2