]> git.gag.com Git - fw/altos/blobdiff - src/drivers/ao_adxl375.c
doc: Add 1.9.22 release notes
[fw/altos] / src / drivers / ao_adxl375.c
index f53fb59d7ad2147aa04eb2872bd779e706d7ad1a..4366e302fa0e9802cf2519623fb17e1beaec3128 100644 (file)
@@ -18,7 +18,7 @@
 #define DEBUG_LOW      1
 #define DEBUG_HIGH     2
 
-#define DEBUG          3
+#define DEBUG          0
 
 #if DEBUG
 #define PRINTD(l, ...) do { if (DEBUG & (l)) { printf ("\r%5lu %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } } while(0)
@@ -26,7 +26,7 @@
 #define PRINTD(l,...)
 #endif
 
-#define AO_ADXL375_SPI_SPEED   ao_spi_speed(5000000)
+#define AO_ADXL375_SPI_SPEED   ao_spi_speed(AO_ADXL375_SPI_INDEX, 5000000)
 
 struct ao_adxl375_sample       ao_adxl375_current;
 
@@ -48,17 +48,16 @@ ao_adxl375_stop(void) {
 static uint8_t
 ao_adxl375_reg_read(uint8_t addr)
 {
-       uint8_t d[1];
+       uint8_t d[2];
 
        d[0] = addr | AO_ADXL375_READ;
        ao_adxl375_start();
-       ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX);
-       ao_spi_recv(d, 1, AO_ADXL375_SPI_INDEX);
+       ao_spi_duplex(d, d, 2, AO_ADXL375_SPI_INDEX);
        ao_adxl375_stop();
 
-       PRINTD(DEBUG_LOW, "read %x = %x\n", addr, d[0]);
+       PRINTD(DEBUG_LOW, "read %x = %x\n", addr, d[1]);
 
-       return d[0];
+       return d[1];
 }
 
 static void
@@ -75,11 +74,11 @@ ao_adxl375_reg_write(uint8_t addr, uint8_t value)
 
 #if DEBUG & DEBUG_LOW
        d[0] = addr | AO_ADXL375_READ;
+       d[1] = 0;
        ao_adxl375_start();
-       ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX);
-       ao_spi_recv(d, 1, AO_ADXL375_SPI_INDEX);
+       ao_spi_duplex(d, d, 2, AO_ADXL375_SPI_INDEX);
        ao_adxl375_stop();
-       PRINTD(DEBUG_LOW, "readback %x\n", d[0]);
+       PRINTD(DEBUG_LOW, "readback %x %x\n", d[0], d[1]);
 #endif
 }
 
@@ -90,9 +89,9 @@ ao_adxl375_value(struct ao_adxl375_sample *value)
 
        d[0] = AO_ADXL375_DATAX0 | AO_ADXL375_READ | AO_ADXL375_MULTI_BYTE;
        ao_adxl375_start();
-       ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX);
-       ao_spi_recv(value, 6, AO_ADXL375_SPI_INDEX);
+       ao_spi_duplex(d, d, 7, AO_ADXL375_SPI_INDEX);
        ao_adxl375_stop();
+       memcpy(value, &d[1], 6);
 }
 
 struct ao_adxl375_total {
@@ -103,11 +102,14 @@ struct ao_adxl375_total {
 
 #define AO_ADXL375_SELF_TEST_SAMPLES   10
 #define AO_ADXL375_SELF_TEST_SETTLE    4
+#define AO_ADXL375_SELF_TEST_DELAY     AO_MS_TO_TICKS(10)
 
 #define MIN_LSB_G      18.4
 #define MAX_LSB_G      22.6
-#define SELF_TEST_MIN_G        5.0
-#define SELF_TEST_MAX_G        6.8
+
+/* The self test value can vary within a rather wide range */
+#define SELF_TEST_MIN_G        4.0
+#define SELF_TEST_MAX_G        12.0
 
 #define MIN_SELF_TEST  ((int32_t) (MIN_LSB_G * SELF_TEST_MIN_G * AO_ADXL375_SELF_TEST_SAMPLES + 0.5))
 #define MAX_SELF_TEST  ((int32_t) (MAX_LSB_G * SELF_TEST_MAX_G * AO_ADXL375_SELF_TEST_SAMPLES + 0.5))
@@ -123,14 +125,14 @@ ao_adxl375_total_value(struct ao_adxl375_total *total, int samples)
                total->x += value.x;
                total->y += value.y;
                total->z += value.z;
-               ao_delay(AO_MS_TO_TICKS(10));
+               ao_delay(AO_ADXL375_SELF_TEST_DELAY);
        }
 }
 
 #define AO_ADXL375_DATA_FORMAT_SETTINGS(self_test) (                   \
                AO_ADXL375_DATA_FORMAT_FIXED |                          \
                (self_test << AO_ADXL375_DATA_FORMAT_SELF_TEST) |       \
-               (AO_ADXL375_DATA_FORMAT_SPI_4_WIRE << AO_ADXL375_DATA_FORMAT_SPI_4_WIRE) | \
+               (AO_ADXL375_DATA_FORMAT_SPI_4_WIRE << AO_ADXL375_DATA_FORMAT_SPI) | \
                (0 << AO_ADXL375_DATA_FORMAT_INT_INVERT) |              \
                (0 << AO_ADXL375_DATA_FORMAT_JUSTIFY))
 
@@ -175,6 +177,11 @@ ao_adxl375_setup(void)
                             (0 << AO_ADXL375_POWER_CTL_SLEEP) |
                             (AO_ADXL375_POWER_CTL_WAKEUP_8 << AO_ADXL375_POWER_CTL_WAKEUP));
 
+       /* Set to normal mode */
+
+       ao_adxl375_reg_write(AO_ADXL375_DATA_FORMAT,
+                            AO_ADXL375_DATA_FORMAT_SETTINGS(0));
+
        /* Perform self-test */
 
        struct ao_adxl375_total self_test_off, self_test_on;
@@ -209,13 +216,9 @@ ao_adxl375_setup(void)
        if (z_change < MIN_SELF_TEST)
                AO_SENSOR_ERROR(AO_DATA_ADXL375);
 
-       /* This check is commented out as maximum self test is unreliable
-
-          if (z_change > MAX_SELF_TEST)
+       if (z_change > MAX_SELF_TEST)
                AO_SENSOR_ERROR(AO_DATA_ADXL375);
 
-       */
-
        /* Discard some samples to let it settle down */
        ao_adxl375_total_value(&self_test_off, AO_ADXL375_SELF_TEST_SETTLE);
 }