From 8542908d5313c97d0e8998c8f0e0b5cda2179435 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Thu, 4 Jan 2018 17:30:07 +0100 Subject: [PATCH] minor changes --- extras/l3gd20h/README.md | 14 ++++---- extras/l3gd20h/l3gd20h.c | 59 ++++++++++++++++++++++++---------- extras/l3gd20h/l3gd20h.h | 9 +++--- extras/l3gd20h/l3gd20h_types.h | 19 +++++++++-- 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/extras/l3gd20h/README.md b/extras/l3gd20h/README.md index 78b21a2..5d4591a 100644 --- a/extras/l3gd20h/README.md +++ b/extras/l3gd20h/README.md @@ -87,14 +87,14 @@ Raw **output data** (**raw data**) are given as 16-bit signed integer values in Full Scale | Resolution | Driver symbol -----------:|-----------:|:--------------- -±245 dps | 2 mdps | ```l3gd20h_scale_245dps``` -±500 dps | 4 mdps | ```l3gd20h_scale_500dps``` -±2000 dps | 16 mdps | ```l3gd20h_scale_2000dps``` +±245 dps | 2 mdps | ```l3gd20h_scale_245_dps``` +±500 dps | 4 mdps | ```l3gd20h_scale_500_dps``` +±2000 dps | 16 mdps | ```l3gd20h_scale_2000_dps``` By default, a full scale of ±245 dps is used. Function ```l3gd20h_set_scale``` can be used to change it. ``` -l3gd20h_set_scale(sensor, l3gd20h_scale_500dps); +l3gd20h_set_scale(sensor, l3gd20h_scale_500_dps); ``` ### Fetching output data @@ -938,8 +938,8 @@ void user_init(void) // Interrupt configuration has to be done before the sensor is set // into measurement mode - // set polarity of INT signals if necessary - // l3gd20h_config_int_signals (dev, l3gd20h_high_active, l3gd20h_push_pull); + // set type and polarity of INT signals if necessary + // l3gd20h_config_int_signals (dev, l3gd20h_push_pull, l3gd20h_high_active); #ifdef INT_EVENT // enable event interrupts (axis movement and wake up) @@ -990,7 +990,7 @@ void user_init(void) l3gd20h_get_hpf_ref (sensor); // LAST STEP: Finally set scale and sensor mode to start measurements - l3gd20h_set_scale(sensor, l3gd20h_scale_245dps); + l3gd20h_set_scale(sensor, l3gd20h_scale_245_dps); l3gd20h_set_mode (sensor, l3gd20h_normal_odr_12_5, 3, true, true, true); // -- SENSOR CONFIGURATION PART --- diff --git a/extras/l3gd20h/l3gd20h.c b/extras/l3gd20h/l3gd20h.c index 30bfa72..bb1b45f 100644 --- a/extras/l3gd20h/l3gd20h.c +++ b/extras/l3gd20h/l3gd20h.c @@ -53,6 +53,16 @@ #include "l3gd20h.h" +#ifdef debug +#undef debug +#undef debug_dev +#endif + +#ifdef error +#undef error +#undef error_dev +#endif + #if defined(L3GD20H_DEBUG_LEVEL_2) #define debug(s, f, ...) printf("%s %s: " s "\n", "L3GD20H", f, ## __VA_ARGS__) #define debug_dev(s, f, d, ...) printf("%s %s: bus %d, addr %02x - " s "\n", "L3GD20H", f, d->bus, d->addr, ## __VA_ARGS__) @@ -108,7 +118,7 @@ #define L3GD20H_YDA 0x02 // L3GD20H_REG_STATUS<1> #define L3GD20H_XDA 0x01 // L3GD20H_REG_STATUS<0> -#define L3GD20H_ANY_DATA_READY 0x0f // L3GD20H_REG_STATUS<3:0> +#define L3GD20H_ANY_DATA_READY 0x07 // L3GD20H_REG_STATUS<2:0> #define L3GD20H_ODR 0xc0 // L3GD20H_REG_CTRL1<7:6> #define L3GD20H_BW 0x30 // L3GD20H_REG_CTRL1<5:4> @@ -198,7 +208,7 @@ l3gd20h_sensor_t* l3gd20h_init_sensor (uint8_t bus, uint8_t addr, uint8_t cs) dev->cs = cs; dev->error_code = L3GD20H_OK; - dev->scale = l3gd20h_scale_245dps; + dev->scale = l3gd20h_scale_245_dps; dev->fifo_mode = l3gd20h_bypass; // if addr==0 then SPI is used and has to be initialized @@ -225,7 +235,7 @@ l3gd20h_sensor_t* l3gd20h_init_sensor (uint8_t bus, uint8_t addr, uint8_t cs) return NULL; } - l3gd20h_update_reg (dev, L3GD20H_REG_CTRL4, L3GD20H_FULL_SCALE, l3gd20h_scale_245dps); + l3gd20h_update_reg (dev, L3GD20H_REG_CTRL4, L3GD20H_FULL_SCALE, l3gd20h_scale_245_dps); l3gd20h_update_reg (dev, L3GD20H_REG_CTRL4, L3GD20H_BLOCK_DATA_UPDATE, 1); return dev; @@ -244,6 +254,13 @@ bool l3gd20h_set_mode (l3gd20h_sensor_t* dev, l3gd20h_mode_t mode, uint8_t bw, return false; } + if (dev->mode != l3gd20h && mode != l3gd20h_power_down && mode < l3gd20h_normal_odr_100) + { + error_dev ("Low ODRs are not available for this sensor", __FUNCTION__, dev); + dev->error_code = L3GD20H_ODR_NOT_AVAILABLE; + return false; + } + dev->error_code = L3GD20H_OK; uint8_t reg1 = 0; @@ -279,7 +296,8 @@ bool l3gd20h_set_mode (l3gd20h_sensor_t* dev, l3gd20h_mode_t mode, uint8_t bw, l3gd20h_set_reg_bit (®1, L3GD20H_Y_ENABLED, y); l3gd20h_set_reg_bit (®1, L3GD20H_Z_ENABLED, z); - if (!l3gd20h_reg_write (dev, L3GD20H_REG_LOW_ODR, ®2, 1)) + if (dev->mode == l3gd20h && + !l3gd20h_reg_write (dev, L3GD20H_REG_LOW_ODR, ®2, 1)) return false; } else @@ -309,6 +327,13 @@ bool l3gd20h_set_fifo_mode (l3gd20h_sensor_t* dev, l3gd20h_fifo_mode_t mode, { if (!dev) return false; + if (dev->mode != l3gd20h && mode > l3gd20h_bypass_to_stream) + { + error_dev ("FIFO mode is not available for this sensor", __FUNCTION__, dev); + dev->error_code = L3GD20H_FIFO_MODE_NOT_AVAILABLE; + return false; + } + dev->error_code = L3GD20H_OK; dev->fifo_mode = mode; @@ -362,7 +387,7 @@ bool l3gd20h_new_data (l3gd20h_sensor_t* dev) error_dev ("Could not get sensor status", __FUNCTION__, dev); return false; } - return l3gd20h_get_reg_bit (reg, L3GD20H_ZYXDA); + return l3gd20h_get_reg_bit (reg, L3GD20H_ANY_DATA_READY); } else { @@ -404,7 +429,7 @@ uint8_t l3gd20h_get_float_data_fifo (l3gd20h_sensor_t* dev, l3gd20h_float_data_f l3gd20h_raw_data_fifo_t raw; uint8_t num = l3gd20h_get_raw_data_fifo (dev, raw); - + for (int i = 0; i < num; i++) { data[i].x = raw[i].x * L3GD20H_SCALES[dev->scale]; @@ -481,10 +506,9 @@ uint8_t l3gd20h_get_raw_data_fifo (l3gd20h_sensor_t* dev, l3gd20h_raw_data_fifo_ if (reg & L3GD20H_FIFO_FFS) { - dev->error_code = LG3GD20H_ODR_TOO_HIGH; + dev->error_code = L3GD20H_ODR_TOO_HIGH; error_dev ("New samples stored in FIFO while reading, " "output data rate (ODR) too high", __FUNCTION__, dev); - return 0; } if (dev->fifo_mode == l3gd20h_fifo && samples == 32) @@ -702,8 +726,8 @@ bool l3gd20h_get_int_data_source (l3gd20h_sensor_t* dev, l3gd20h_int_data_source bool l3gd20h_config_int_signals (l3gd20h_sensor_t* dev, - l3gd20h_signal_level_t level, - l3gd20h_signal_type_t type) + l3gd20h_signal_type_t type, + l3gd20h_signal_level_t level) { if (!dev) return false; @@ -810,14 +834,15 @@ static bool l3gd20h_is_available (l3gd20h_sensor_t* dev) if (!l3gd20h_reg_read (dev, L3GD20H_REG_WHO_AM_I, &chip_id, 1)) return false; - if (chip_id != L3GD20H_CHIP_ID && - chip_id != L3GD20_CHIP_ID && - chip_id != L3G4200D_CHIP_ID) + switch (chip_id) { - error_dev ("Chip id %02x is wrong, should be %02x.", - __FUNCTION__, dev, chip_id, L3GD20H_CHIP_ID); - dev->error_code = L3GD20H_WRONG_CHIP_ID; - return false; + case L3GD20H_CHIP_ID: dev->mode = l3gd20h ; break; + case L3GD20_CHIP_ID: dev->mode = l3gd20 ; break; + case L3G4200D_CHIP_ID: dev->mode = l3g4200d; break; + default: error_dev ("Chip id %02x is wrong, should be %02x.", + __FUNCTION__, dev, chip_id, L3GD20H_CHIP_ID); + dev->error_code = L3GD20H_WRONG_CHIP_ID; + return false; } return true; diff --git a/extras/l3gd20h/l3gd20h.h b/extras/l3gd20h/l3gd20h.h index 1b4073c..d9cd216 100644 --- a/extras/l3gd20h/l3gd20h.h +++ b/extras/l3gd20h/l3gd20h.h @@ -101,7 +101,9 @@ #define L3GD20H_ENABLE_HPF_FAILED (13 << 8) #define L3GD20H_SENSOR_IN_BYPASS_MODE (14 << 8) #define L3GD20H_SENSOR_IN_FIFO_MODE (15 << 8) -#define LG3GD20H_ODR_TOO_HIGH (16 << 8) +#define L3GD20H_ODR_TOO_HIGH (16 << 8) +#define L3GD20H_ODR_NOT_AVAILABLE (17 << 8) +#define L3GD20H_FIFO_MODE_NOT_AVAILABLE (18 << 8) #include "l3gd20h_platform.h" #include "l3gd20h_types.h" @@ -309,13 +311,12 @@ bool l3gd20h_get_int_data_source (l3gd20h_sensor_t* dev, * @brief Set signal configuration for INT1 and INT2 signals * * @param dev pointer to the sensor device data structure - * @param level define interrupt signal as low or high active * @param type define interrupt signal as pushed/pulled or open drain * @return true on success, false on error */ bool l3gd20h_config_int_signals (l3gd20h_sensor_t* dev, - l3gd20h_signal_level_t level, - l3gd20h_signal_type_t type); + l3gd20h_signal_type_t type, + l3gd20h_signal_level_t level); /** diff --git a/extras/l3gd20h/l3gd20h_types.h b/extras/l3gd20h/l3gd20h_types.h index aa5e355..cadb740 100644 --- a/extras/l3gd20h/l3gd20h_types.h +++ b/extras/l3gd20h/l3gd20h_types.h @@ -69,18 +69,25 @@ typedef enum } l3gd20h_mode_t; +#define l3gd20_normal_odr_95 l3gd20h_normal_odr_100 +#define l3gd20_normal_odr_190 l3gd20h_normal_odr_200 +#define l3gd20_normal_odr_380 l3gd20h_normal_odr_400 +#define l3gd20_normal_odr_760 l3gd20h_normal_odr_800 /** * @brief Sensitivity level */ typedef enum { - l3gd20h_scale_245dps = 0, // default - l3gd20h_scale_500dps, - l3gd20h_scale_2000dps + l3gd20h_scale_245_dps = 0, // default + l3gd20h_scale_500_dps, + l3gd20h_scale_2000_dps } l3gd20h_scale_t; +#define l3gd20_scale_250_dps l3gd20h_scale_245_dps +#define l3gd20_scale_500_dps l3gd20h_scale_500_dps +#define l3gd20_scale_2000_dps l3gd20h_scale_2000_dps /** * @brief FIFO mode @@ -286,6 +293,12 @@ typedef struct { l3gd20h_scale_t scale; // fill range scale (default 245 dps) l3gd20h_fifo_mode_t fifo_mode; // FIFO operation mode (default bypass) + + enum { + l3gd20h, + l3gd20, + l3g4200d + } mode; } l3gd20h_sensor_t;