From: Keith Packard Date: Fri, 21 Feb 2020 00:51:15 +0000 (-0800) Subject: altos: Get BMX160 initialized correctly X-Git-Tag: 1.9.2~2^2~20 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=67356ae163487e57e6d9c83cb2b7f71a69f8aa27 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 --- 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