minor changes

This commit is contained in:
Gunar Schorcht 2018-01-04 17:30:07 +01:00
parent ae62a26cb1
commit 8542908d53
4 changed files with 70 additions and 31 deletions

View file

@ -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 ---

View file

@ -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 (&reg1, L3GD20H_Y_ENABLED, y);
l3gd20h_set_reg_bit (&reg1, L3GD20H_Z_ENABLED, z);
if (!l3gd20h_reg_write (dev, L3GD20H_REG_LOW_ODR, &reg2, 1))
if (dev->mode == l3gd20h &&
!l3gd20h_reg_write (dev, L3GD20H_REG_LOW_ODR, &reg2, 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;

View file

@ -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);
/**

View file

@ -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;