mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
224 lines
5.0 KiB
C
224 lines
5.0 KiB
C
/*
|
|
* Copyright (C) 2017 OTA keys S.A.
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @defgroup drivers_lsm6dsl LSM6DSL 3D accelerometer/gyroscope
|
|
* @ingroup drivers_sensors
|
|
* @ingroup drivers_saul
|
|
* @brief Device driver for the LSM6DSL 3D accelerometer/gyroscope
|
|
*
|
|
* This driver provides @ref drivers_saul capabilities.
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief Device driver interface for the LSM6DSL 3D accelerometer/gyroscope.
|
|
*
|
|
* @author Vincent Dupont <vincent@otakeys.com>
|
|
* @author Sebastian Meiling <s@mlng.net>
|
|
*
|
|
*/
|
|
|
|
#ifndef LSM6DSL_H
|
|
#define LSM6DSL_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "periph/i2c.h"
|
|
|
|
/**
|
|
* @brief Data rate settings
|
|
*/
|
|
enum {
|
|
LSM6DSL_DATA_RATE_POWER_DOWN = 0x0,
|
|
LSM6DSL_DATA_RATE_1_6HZ = 0xB,
|
|
LSM6DSL_DATA_RATE_12_5HZ = 0x1,
|
|
LSM6DSL_DATA_RATE_26HZ = 0x2,
|
|
LSM6DSL_DATA_RATE_52HZ = 0x3,
|
|
LSM6DSL_DATA_RATE_104HZ = 0x4,
|
|
LSM6DSL_DATA_RATE_208HZ = 0x5,
|
|
LSM6DSL_DATA_RATE_416HZ = 0x6,
|
|
LSM6DSL_DATA_RATE_833HZ = 0x7,
|
|
LSM6DSL_DATA_RATE_1_66KHZ = 0x8,
|
|
LSM6DSL_DATA_RATE_3_33KHZ = 0x9,
|
|
LSM6DSL_DATA_RATE_6_66KHZ = 0xa,
|
|
};
|
|
|
|
/**
|
|
* @brief Decimation settings
|
|
*/
|
|
enum {
|
|
LSM6DSL_DECIMATION_NOT_IN_FIFO = 0,
|
|
LSM6DSL_DECIMATION_NO,
|
|
LSM6DSL_DECIMATION_2,
|
|
LSM6DSL_DECIMATION_3,
|
|
LSM6DSL_DECIMATION_4,
|
|
LSM6DSL_DECIMATION_8,
|
|
LSM6DSL_DECIMATION_16,
|
|
LSM6DSL_DECIMATION_32,
|
|
};
|
|
|
|
/**
|
|
* @brief Accelerometer full scale
|
|
*/
|
|
enum {
|
|
LSM6DSL_ACC_FS_2G = 0,
|
|
LSM6DSL_ACC_FS_16G,
|
|
LSM6DSL_ACC_FS_4G,
|
|
LSM6DSL_ACC_FS_8G,
|
|
LSM6DSL_ACC_FS_MAX,
|
|
};
|
|
|
|
/**
|
|
* @brief Gyroscope full scale
|
|
*/
|
|
enum {
|
|
LSM6DSL_GYRO_FS_245DPS = 0,
|
|
LSM6DSL_GYRO_FS_500DPS,
|
|
LSM6DSL_GYRO_FS_1000DPS,
|
|
LSM6DSL_GYRO_FS_2000DPS,
|
|
LSM6DSL_GYRO_FS_MAX,
|
|
};
|
|
|
|
/**
|
|
* @brief LSM6DSL driver parameters
|
|
*/
|
|
typedef struct {
|
|
i2c_t i2c; /**< i2c bus */
|
|
uint8_t addr; /**< i2c address */
|
|
uint8_t acc_odr; /**< accelerometer output data rate */
|
|
uint8_t gyro_odr; /**< gyroscope output data rate */
|
|
uint8_t acc_fs; /**< accelerometer full scale */
|
|
uint8_t gyro_fs; /**< gyroscope full scale */
|
|
uint8_t acc_decimation; /**< accelerometer decimation */
|
|
uint8_t gyro_decimation; /**< gyroscope decimation */
|
|
} lsm6dsl_params_t;
|
|
|
|
/**
|
|
* @brief LSM6DSL device descriptor
|
|
*/
|
|
typedef struct {
|
|
lsm6dsl_params_t params; /**< driver parameters */
|
|
} lsm6dsl_t;
|
|
|
|
/**
|
|
* @brief 3D output data
|
|
*/
|
|
typedef struct {
|
|
int16_t x; /**< X axis */
|
|
int16_t y; /**< Y axis */
|
|
int16_t z; /**< Z axis */
|
|
} lsm6dsl_3d_data_t;
|
|
|
|
/**
|
|
* @brief Named return values
|
|
*/
|
|
enum {
|
|
LSM6DSL_OK = 0, /**< all good */
|
|
LSM6DSL_ERROR_BUS, /**< I2C bus error */
|
|
LSM6DSL_ERROR_CNF, /**< Config error */
|
|
LSM6DSL_ERROR_DEV, /**< device error */
|
|
};
|
|
|
|
/**
|
|
* @brief Initialize a LSM6DSL device
|
|
*
|
|
* @param[out] dev device to initialize
|
|
* @param[in] params driver parameters
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_init(lsm6dsl_t *dev, const lsm6dsl_params_t *params);
|
|
|
|
/**
|
|
* @brief Read accelerometer data
|
|
*
|
|
* @param[in] dev device to read
|
|
* @param[out] data accelerometer values
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_read_acc(const lsm6dsl_t *dev, lsm6dsl_3d_data_t *data);
|
|
|
|
/**
|
|
* @brief Read gyroscope data
|
|
*
|
|
* @param[in] dev device to read
|
|
* @param[out] data gyroscope values
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_read_gyro(const lsm6dsl_t *dev, lsm6dsl_3d_data_t *data);
|
|
|
|
/**
|
|
* @brief Read temperature data
|
|
*
|
|
* @note To avoid floating point data types but still provide high resolution
|
|
* for temperature readings, resulting values are scale by factor 100.
|
|
*
|
|
*
|
|
* @param[in] dev device to read
|
|
* @param[out] data temperature value, in °C x 100
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_read_temp(const lsm6dsl_t *dev, int16_t *data);
|
|
|
|
/**
|
|
* @brief Power down accelerometer
|
|
*
|
|
* @param[in] dev device to power down
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_acc_power_down(const lsm6dsl_t *dev);
|
|
|
|
/**
|
|
* @brief Power down gyroscope
|
|
*
|
|
* @param[in] dev device to power down
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_gyro_power_down(const lsm6dsl_t *dev);
|
|
|
|
/**
|
|
* @brief Power up accelerometer
|
|
*
|
|
* @param[in] dev device to power up
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_acc_power_up(const lsm6dsl_t *dev);
|
|
|
|
/**
|
|
* @brief Power up gyroscope
|
|
*
|
|
* @param[in] dev device to power up
|
|
*
|
|
* @return LSM6DSL_OK on success
|
|
* @return < 0 on error
|
|
*/
|
|
int lsm6dsl_gyro_power_up(const lsm6dsl_t *dev);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* LSM6DSL_H */
|
|
/** @} */
|