altos: Get BMX160 initialized correctly
authorKeith Packard <keithp@keithp.com>
Fri, 21 Feb 2020 00:51:15 +0000 (16:51 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 21 Feb 2020 06:17:25 +0000 (22:17 -0800)
 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 <keithp@keithp.com>
src/drivers/ao_bmx160.c
src/drivers/ao_bmx160.h

index e1af23a1a7c471e4c41238af1832188059b3b392..e4397fc4a42f55351b2f05451c0a9249165121ea 100644 (file)
@@ -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;
 }
 
index 2b7e7bd768c27caaf51e88af3372a3688024d4ea..e62f172da9bfe8711f23a32b26a96b20c8c91b0a 100644 (file)
@@ -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