X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_adxl375.c;h=f53fb59d7ad2147aa04eb2872bd779e706d7ad1a;hb=3fb95b34a85fb79713c258937a9005faf6f89a03;hp=e0d094f214b3a42a8f48a9f5cced8f0685f5debb;hpb=0686a7b8aec524d81bda4c572549a3a068ce0eed;p=fw%2Faltos diff --git a/src/drivers/ao_adxl375.c b/src/drivers/ao_adxl375.c index e0d094f2..f53fb59d 100644 --- a/src/drivers/ao_adxl375.c +++ b/src/drivers/ao_adxl375.c @@ -18,14 +18,16 @@ #define DEBUG_LOW 1 #define DEBUG_HIGH 2 -#define DEBUG 0 +#define DEBUG 3 #if DEBUG -#define PRINTD(l, ...) do { if (DEBUG & (l)) { printf ("\r%5u %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } } while(0) +#define PRINTD(l, ...) do { if (DEBUG & (l)) { printf ("\r%5lu %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } } while(0) #else #define PRINTD(l,...) #endif +#define AO_ADXL375_SPI_SPEED ao_spi_speed(5000000) + struct ao_adxl375_sample ao_adxl375_current; static void @@ -46,16 +48,17 @@ ao_adxl375_stop(void) { static uint8_t ao_adxl375_reg_read(uint8_t addr) { - uint8_t d[2]; + uint8_t d[1]; d[0] = addr | AO_ADXL375_READ; ao_adxl375_start(); - ao_spi_duplex(d, d, 2, AO_ADXL375_SPI_INDEX); + ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX); + ao_spi_recv(d, 1, AO_ADXL375_SPI_INDEX); ao_adxl375_stop(); - PRINTD(DEBUG_LOW, "read %x = %x\n", addr, d); + PRINTD(DEBUG_LOW, "read %x = %x\n", addr, d[0]); - return d[1]; + return d[0]; } static void @@ -71,12 +74,12 @@ ao_adxl375_reg_write(uint8_t addr, uint8_t value) ao_adxl375_stop(); #if DEBUG & DEBUG_LOW - d[0] = addr | AO_ADXL375_READ - d[1] = 0; + d[0] = addr | AO_ADXL375_READ; ao_adxl375_start(); - ao_spi_duplex(d, d, 2, AO_ADXL375_SPI_INDEX); + ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX); + ao_spi_recv(d, 1, AO_ADXL375_SPI_INDEX); ao_adxl375_stop(); - PRINTD(DEBUG_LOW, "readback %x %x\n", d[0], d[1]); + PRINTD(DEBUG_LOW, "readback %x\n", d[0]); #endif } @@ -87,9 +90,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_duplex(d, d, 7, AO_ADXL375_SPI_INDEX); + ao_spi_send(d, 1, AO_ADXL375_SPI_INDEX); + ao_spi_recv(value, 6, AO_ADXL375_SPI_INDEX); ao_adxl375_stop(); - memcpy(value, &d[1], 6); } struct ao_adxl375_total { @@ -98,20 +101,17 @@ struct ao_adxl375_total { int32_t z; }; -#define AO_ADXL375_SELF_TEST_SAMPLES 16 -#define AO_ADXL375_SELF_TEST_SETTLE 6 +#define AO_ADXL375_SELF_TEST_SAMPLES 10 +#define AO_ADXL375_SELF_TEST_SETTLE 4 #define MIN_LSB_G 18.4 #define MAX_LSB_G 22.6 -#define SELF_TEST_MIN_G 6.0 +#define SELF_TEST_MIN_G 5.0 #define SELF_TEST_MAX_G 6.8 #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)) -static const int32_t min_self_test = MIN_SELF_TEST; -static const int32_t max_self_test = MAX_SELF_TEST; - static void ao_adxl375_total_value(struct ao_adxl375_total *total, int samples) { @@ -146,7 +146,7 @@ ao_adxl375_setup(void) uint8_t devid = ao_adxl375_reg_read(AO_ADXL375_DEVID); if (devid != AO_ADXL375_DEVID_ID) - ao_sensor_errors = 1; + AO_SENSOR_ERROR(AO_DATA_ADXL375); /* Set the data rate */ ao_adxl375_reg_write(AO_ADXL375_BW_RATE, @@ -175,12 +175,8 @@ ao_adxl375_setup(void) (0 << AO_ADXL375_POWER_CTL_SLEEP) | (AO_ADXL375_POWER_CTL_WAKEUP_8 << AO_ADXL375_POWER_CTL_WAKEUP)); - (void) ao_adxl375_total_value; /* Perform self-test */ -#define AO_ADXL375_SELF_TEST_SAMPLES 16 -#define AO_ADXL375_SELF_TEST_SETTLE 6 - struct ao_adxl375_total self_test_off, self_test_on; /* Discard some samples to let it settle down */ @@ -210,22 +206,26 @@ ao_adxl375_setup(void) self_test_value = z_change; - if (z_change < min_self_test || max_self_test < z_change) - ao_sensor_errors = 1; + 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) + 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); } -static int adxl375_count; - static void ao_adxl375(void) { ao_adxl375_setup(); for (;;) { ao_adxl375_value(&ao_adxl375_current); - ++adxl375_count; ao_arch_critical( AO_DATA_PRESENT(AO_DATA_ADXL375); AO_DATA_WAIT(); @@ -238,14 +238,13 @@ static struct ao_task ao_adxl375_task; static void ao_adxl375_dump(void) { - printf ("ADXL375 value %d %d %d count %d self test %d min %d max %d\n", + printf ("ADXL375 value %d %d %d self test %ld min %ld max %ld\n", ao_adxl375_current.x, ao_adxl375_current.y, ao_adxl375_current.z, - adxl375_count, - self_test_value, - MIN_SELF_TEST, - MAX_SELF_TEST); + (long) self_test_value, + (long) MIN_SELF_TEST, + (long) MAX_SELF_TEST); } const struct ao_cmds ao_adxl375_cmds[] = {