diff --git a/drivers/adxl345/adxl345.c b/drivers/adxl345/adxl345.c index dfad7bbc9e1b46a9b094c8fe375c5c70110215ad..095c4ff95a647ec558a949102e52e55716bbc17a 100644 --- a/drivers/adxl345/adxl345.c +++ b/drivers/adxl345/adxl345.c @@ -31,17 +31,20 @@ #define I2C_SPEED I2C_SPEED_NORMAL -#define BUS (dev->params.i2c) -#define ADDR (dev->params.addr) +#define BUS (dev->i2c) +#define ADDR (dev->addr) -int adxl345_init(adxl345_t *dev, const adxl345_params_t* params) +int adxl345_init(adxl345_t *dev, adxl345_params_t* params) { uint8_t reg; assert(dev && params); /* get device descriptor */ - dev->params= *params; + dev->params = (adxl345_params_t*)params; + + /* get scale_factor from full_res and range parameters */ + dev->scale_factor = (dev->params->full_res ? 3.9 : (dev->params->range * 3.9)); /* Acquire exclusive access */ i2c_acquire(BUS); @@ -61,11 +64,11 @@ int adxl345_init(adxl345_t *dev, const adxl345_params_t* params) return ADXL345_NODEV; } /* configure the user offset */ - i2c_write_regs(BUS, ADDR, ACCEL_ADXL345_OFFSET_X, dev->params.offset, 3); + i2c_write_regs(BUS, ADDR, ACCEL_ADXL345_OFFSET_X, dev->params->offset, 3); /* Basic device setup */ - reg = (dev->params.full_res | dev->params.range); + reg = (dev->params->full_res | dev->params->range); i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_DATA_FORMAT, reg); - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_BW_RATE, dev->params.rate); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_BW_RATE, dev->params->rate); /* Put device in measure mode */ i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_POWER_CTL, MEASURE_BIT); @@ -79,7 +82,7 @@ int adxl345_init(adxl345_t *dev, const adxl345_params_t* params) void adxl345_read(adxl345_t *dev, adxl345_data_t *data) { - uint8_t result[6]; + int8_t result[6]; assert(dev && data); @@ -87,9 +90,9 @@ void adxl345_read(adxl345_t *dev, adxl345_data_t *data) i2c_read_regs(BUS, ADDR, ACCEL_ADXL345_DATA_X0, result, 6); i2c_release(BUS); - data->x = (((result[1] << 8)+result[0]) * dev->params.scale_factor); - data->y = (((result[3] << 8)+result[2]) * dev->params.scale_factor); - data->z = (((result[5] << 8)+result[4]) * dev->params.scale_factor); + data->x = (((result[1] << 8)+result[0]) * dev->scale_factor); + data->y = (((result[3] << 8)+result[2]) * dev->scale_factor); + data->z = (((result[5] << 8)+result[4]) * dev->scale_factor); } void adxl345_set_interrupt(adxl345_t *dev) @@ -100,33 +103,33 @@ void adxl345_set_interrupt(adxl345_t *dev) i2c_acquire(BUS); /* Set threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_TAP, dev->params.interrupt.thres_tap); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_TAP, dev->interrupt.thres_tap); /* Set Map */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_MAP, dev->params.interrupt.map); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_MAP, dev->interrupt.map); /* Set Duration */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_DUR, dev->params.interrupt.thres_dur); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_DUR, dev->interrupt.thres_dur); /* Enable axes */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_AXES, dev->params.interrupt.tap_axes); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_AXES, dev->interrupt.tap_axes); /* Set source */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_SOURCE, dev->params.interrupt.source); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_SOURCE, dev->interrupt.source); /* Set latent threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_LAT, dev->params.interrupt.thres_latent); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_LAT, dev->interrupt.thres_latent); /* Set window threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_WIN, dev->params.interrupt.thres_window); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TAP_WIN, dev->interrupt.thres_window); /* Set activity threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_ACT, dev->params.interrupt.thres_act); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_ACT, dev->interrupt.thres_act); /* Set inactivity threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_INACT, dev->params.interrupt.thres_inact); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_INACT, dev->interrupt.thres_inact); /* Set inactivity time */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TIME_INACT, dev->params.interrupt.time_inact); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TIME_INACT, dev->interrupt.time_inact); /* Set free-fall threshold */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_FF, dev->params.interrupt.thres_ff); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_THRESH_FF, dev->interrupt.thres_ff); /* Set free-fall time */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TIME_FF, dev->params.interrupt.time_ff); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_TIME_FF, dev->interrupt.time_ff); /* Set axis control */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_ACT_INACT_CTL, dev->params.interrupt.act_inact); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_ACT_INACT_CTL, dev->interrupt.act_inact); /* Enable interrupt */ - i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_ENABLE, dev->params.interrupt.enable); + i2c_write_reg(BUS, ADDR, ACCEL_ADXL345_INT_ENABLE, dev->interrupt.enable); /* Release the bus */ i2c_release(BUS); diff --git a/drivers/adxl345/include/adxl345_params.h b/drivers/adxl345/include/adxl345_params.h index af6b010ed3224e12498e26a12f2699738426b4fe..3252716a01a7501f2816fd89625f395f363eee7d 100644 --- a/drivers/adxl345/include/adxl345_params.h +++ b/drivers/adxl345/include/adxl345_params.h @@ -32,39 +32,35 @@ extern "C" { * @{ */ #ifndef ADXL345_PARAM_I2C -#define ADXL345_PARAM_I2C (I2C_DEV(0)) +#define ADXL345_PARAM_I2C (I2C_DEV(0)) #endif #ifndef ADXL345_PARAM_ADDR -#define ADXL345_PARAM_ADDR (ADXL345_ADDR_53) +#define ADXL345_PARAM_ADDR (ADXL345_ADDR_53) #endif #ifndef ADXL345_PARAM_RATE -#define ADXL345_PARAM_RATE (ADXL345_RATE_200HZ) +#define ADXL345_PARAM_RATE (ADXL345_RATE_200HZ) #endif #ifndef ADXL345_PARAM_RANGE -#define ADXL345_PARAM_RANGE (ADXL345_RANGE_16G) -#endif -#ifndef ADXL345_PARAM_OFFSET -#define ADXL345_PARAM_OFFSET { 0, 0, 0 } +#define ADXL345_PARAM_RANGE (ADXL345_RANGE_16G) #endif #ifndef ADXL345_PARAM_INTERRUPT -#define ADXL345_PARAM_INTERRUPT {0x0F, 0xBF, 0x40, 0xF0, 0xFF, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F} +#define ADXL345_PARAM_INTERRUPT {0x0F, 0xBF, 0x40, 0xF0, 0xFF, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F} #endif #ifndef ADXL345_PARAM_FULL_RES -#define ADXL345_PARAM_FULL_RES (1) +#define ADXL345_PARAM_FULL_RES (1) +#endif +#ifndef ADXL345_PARAM_OFFSET +#define ADXL345_PARAM_OFFSET { 0, 0, 0 } #endif #ifndef ADXL345_PARAM_SCALE_FACTOR -#define ADXL345_PARAM_SCALE_FACTOR (3.9) +#define ADXL345_PARAM_SCALE_FACTOR (3.9) #endif #ifndef ADXL345_PARAMS -#define ADXL345_PARAMS { .i2c = ADXL345_PARAM_I2C, \ - .addr = ADXL345_PARAM_ADDR, \ - .rate = ADXL345_PARAM_RATE, \ - .range = ADXL345_PARAM_RANGE, \ - .offset = ADXL345_PARAM_OFFSET, \ - .interrupt = ADXL345_PARAM_INTERRUPT, \ - .full_res = ADXL345_PARAM_FULL_RES, \ - .scale_factor = ADXL345_PARAM_SCALE_FACTOR} +#define ADXL345_PARAMS { .offset = ADXL345_PARAM_OFFSET, \ + .range = ADXL345_PARAM_RANGE, \ + .rate = ADXL345_PARAM_RATE, \ + .full_res = ADXL345_PARAM_FULL_RES } #endif /**@}*/ diff --git a/drivers/include/adxl345.h b/drivers/include/adxl345.h index 9b78e0878c10708e0edd5849c1319f4049df0012..1268df005ecb40912cf731aae9d6a3fcf9cf4d3c 100644 --- a/drivers/include/adxl345.h +++ b/drivers/include/adxl345.h @@ -26,45 +26,56 @@ extern "C" { #endif #include "periph/i2c.h" +#include "periph/gpio.h" /** * @brief Possible ADXL345 hardware addresses (wiring specific) */ enum { - ADXL345_ADDR_1D = 0x1D, /**< I2C device address if SDO / Alt address pin is high */ - ADXL345_ADDR_53 = 0x53, /**< I2C device address if SDO / Alt address pin is low */ + ADXL345_ADDR_1D = 0x1D, /**< I2C device address if Alt addr pin is high */ + ADXL345_ADDR_53 = 0x53, /**< I2C device address if Alt addr pin is low */ +}; + +/** + * @brief List ADXL345 power mode + */ +enum { + ADXL345_MEASURE_MODE, + ADXL345_STANDBY_MODE, + ADXL345_SLEEP_MODE, + ADXL345_AUTOSLEEP_MODE, }; /** * @brief Define ADXL345 sensitivity */ enum { - ADXL345_RANGE_2G, /**< +/- 2 g Full Scale Rang */ - ADXL345_RANGE_4G, /**< +/- 4 g Full Scale Rang */ - ADXL345_RANGE_8G, /**< +/- 8 g Full Scale Rang */ - ADXL345_RANGE_16G /**< +/- 16 g Full Scale Rang */ + ADXL345_RANGE_2G = 1, /**< +/- 2 g Full Scale Rang */ + ADXL345_RANGE_4G = 2, /**< +/- 4 g Full Scale Rang */ + ADXL345_RANGE_8G = 4, /**< +/- 8 g Full Scale Rang */ + ADXL345_RANGE_16G = 8 /**< +/- 16 g Full Scale Rang */ }; /** * @brief List bandwidth rate */ enum { - ADXL345_RATE_0HZ1 = 0, /**< 0.1 Hz Output Data Rate */ - ADXL345_RATE_0HZ2 = 1, /**< 0.2 Hz Output Data Rate */ - ADXL345_RATE_0HZ39 = 2, /**< 0.39 Hz Output Data Rate */ - ADXL345_RATE_0HZ78 = 3, /**< 0.78 Hz Output Data Rate */ - ADXL345_RATE_1HZ56 = 4, /**< 1.56 Hz Output Data Rate */ - ADXL345_RATE_3HZ13 = 5, /**< 3.13 Hz Output Data Rate */ - ADXL345_RATE_6HZ25 = 6, /**< 6.25 Hz Output Data Rate */ - ADXL345_RATE_12HZ50 = 7, /**< 12.5 Hz Output Data Rate */ - ADXL345_RATE_25HZ = 8, /**< 25 Hz Output Data Rate */ - ADXL345_RATE_50HZ = 9, /**< 50 Hz Output Data Rate */ - ADXL345_RATE_100HZ = 10, /**< 100 Hz Output Data Rate */ - ADXL345_RATE_200HZ = 11, /**< 200 Hz Output Data Rate */ - ADXL345_RATE_400HZ = 12, /**< 400 Hz Output Data Rate */ - ADXL345_RATE_800HZ = 13, /**< 800 Hz Output Data Rate */ - ADXL345_RATE_1600HZ = 14, /**< 1600 Hz Output Data Rate */ - ADXL345_RATE_3200HZ = 15 /**< 3200 Hz Output Data Rate */ + ADXL345_RATE_0HZ1 = 0, /**< 0.1 Hz Output Data Rate */ + ADXL345_RATE_0HZ2 = 1, /**< 0.2 Hz Output Data Rate */ + ADXL345_RATE_0HZ39 = 2, /**< 0.39 Hz Output Data Rate */ + ADXL345_RATE_0HZ78 = 3, /**< 0.78 Hz Output Data Rate */ + ADXL345_RATE_1HZ56 = 4, /**< 1.56 Hz Output Data Rate */ + ADXL345_RATE_3HZ13 = 5, /**< 3.13 Hz Output Data Rate */ + ADXL345_RATE_6HZ25 = 6, /**< 6.25 Hz Output Data Rate */ + ADXL345_RATE_12HZ50 = 7, /**< 12.5 Hz Output Data Rate */ + ADXL345_RATE_25HZ = 8, /**< 25 Hz Output Data Rate */ + ADXL345_RATE_50HZ = 9, /**< 50 Hz Output Data Rate */ + ADXL345_RATE_100HZ = 10, /**< 100 Hz Output Data Rate */ + ADXL345_RATE_200HZ = 11, /**< 200 Hz Output Data Rate */ + ADXL345_RATE_400HZ = 12, /**< 400 Hz Output Data Rate */ + ADXL345_RATE_800HZ = 13, /**< 800 Hz Output Data Rate */ + ADXL345_RATE_1600HZ = 14, /**< 1600 Hz Output Data Rate */ + ADXL345_RATE_3200HZ = 15 /**< 3200 Hz Output Data Rate */ }; /** @@ -120,7 +131,7 @@ typedef struct { uint8_t time_inact; /**< Inactivity time */ uint8_t thres_ff; /**< Free-fall threshold */ uint8_t time_ff; /**< Time threshold */ - uint8_t act_inact; /**< Axis enable control for activity and inactivity detection */ + uint8_t act_inact; /**< Enable ctrl for activity/inactivity detection */ uint8_t tap_axes; /**< Axis control for single tap/double tap */ } adxl345_interrupt_t; @@ -128,21 +139,23 @@ typedef struct { * @brief Configuration struct for the ADXL345 sensor */ typedef struct { - i2c_t i2c; /**< I2C device which is used */ - uint8_t addr; /**< I2C address */ - adxl345_interrupt_t interrupt; /**< Interrupts configuration */ - uint8_t offset[3]; /**< offset axis */ - uint8_t range; /**< Sensitivity configuration */ - uint8_t rate; /**< Configured sample rate for accel */ - uint8_t full_res; /**< Resolution bit */ - uint8_t scale_factor; /**< Scale factor for converting value to mg */ + gpio_t int1; /**< accelerometer int1 pin */ + gpio_t int2; /**< accelerometer int2 pin */ + uint8_t offset[3]; /**< offset axis */ + uint8_t range; /**< Sensitivity configuration */ + uint8_t rate; /**< Configured sample rate for accel */ + uint8_t full_res; /**< Resolution bit */ } adxl345_params_t; /** * @brief Device descriptor for the ADXL345 sensor */ typedef struct { - adxl345_params_t params; /**< Device configuration */ + i2c_t i2c; /**< I2C device which is used */ + uint8_t addr; /**< I2C address */ + adxl345_params_t *params; /**< Device configuration */ + adxl345_interrupt_t interrupt; /**< Interrupts configuration */ + float scale_factor; /**< Scale factor for converting value to mg */ } adxl345_t; /** @@ -155,8 +168,7 @@ typedef struct { * @return ADXL345_NOI2C if initialization of I2C bus failed * @return ADXL345_NODEV if accelerometer test failed */ -int adxl345_init(adxl345_t *dev, const adxl345_params_t* params); - +int adxl345_init(adxl345_t *dev, adxl345_params_t* params); /** * @brief Read accelerometer's data * diff --git a/tests/driver_adxl345/main.c b/tests/driver_adxl345/main.c index 73fa53ddffe118f55f70c8a84472671e3dc29ded..9bb20193d2deb9afb42b166bb74bf406e773162b 100644 --- a/tests/driver_adxl345/main.c +++ b/tests/driver_adxl345/main.c @@ -31,11 +31,14 @@ int main(void) adxl345_t dev; adxl345_data_t data; + dev.i2c = ADXL345_PARAM_I2C; + dev.addr = ADXL345_PARAM_ADDR; + puts("ADXL345 test application"); printf("Initializing ADXL345 accelerometer at I2C_DEV(%i)... ", - adxl345_params->i2c); + dev.i2c); - if (adxl345_init(&dev, adxl345_params) == ADXL345_OK) { + if (adxl345_init(&dev, (adxl345_params_t*)adxl345_params) == ADXL345_OK) { puts("[OK]\n"); } else { @@ -46,7 +49,7 @@ int main(void) while(1) { adxl345_read(&dev, &data); printf("Acceleration [in mg]: X axis:%d Y axis:%d Z axis:%d\n", - data.x, data.y, data.z); + (int)data.x, (int)data.y, (int)data.z); xtimer_usleep(SLEEP_DELAY); } return 0;