1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/mma7660.h
2021-08-13 19:50:38 +02:00

261 lines
8.1 KiB
C

/*
* Copyright (C) 2016 University of California, Berkeley
*
* 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_mma7660 MMA7660 Accelerometer
* @ingroup drivers_sensors
* @brief Driver for the Freescale MMA7660 3-Axis accelerometer.
* This driver only implements basic functionality.
*
* @{
*
* @file
* @brief Interface definition for the MMA7660 accelerometer driver.
*
* @author Michael Andersen <m.andersen@cs.berkeley.edu>
*/
#ifndef MMA7660_H
#define MMA7660_H
#include <stdint.h>
#include <stdbool.h>
#include "periph/i2c.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* @brief Return codes
*/
enum {
MMA7660_OK, /**< all ok */
MMA7660_I2C_ERR, /**< i2c bus initialization error */
MMA7660_I2C_READ_ERR, /**< i2c bus cannot be read */
MMA7660_I2C_WRITE_ERR, /**< i2c bus cannot be written */
MMA7660_READ_ERR, /**< error when reading counts */
};
/**
* @brief Parameters for an MMA7660 device
*/
typedef struct
{
i2c_t i2c; /**< the I2C handle */
uint8_t addr; /**< the device I2C address */
uint8_t amsr; /**< active mode sample rate */
uint8_t awsr; /**< auto wake sample rate */
uint8_t filt; /**< filter samples */
} mma7660_params_t;
/**
* @brief Device descriptor for an MMA7660 device
*/
typedef struct
{
mma7660_params_t params; /**< initialization parameters */
} mma7660_t;
/**
* @brief Data type for the result data
*/
typedef struct {
int16_t x; /**< acceleration in X direction */
int16_t y; /**< acceleration in Y direction */
int16_t z; /**< acceleration in Z direction */
} mma7660_data_t;
/**
* @name MMA7660 constants
* @{
*/
#define MODE_ACTIVE_SHIFT (0U)
#define MODE_AUTOWAKE_SHIFT (3U)
#define MODE_AUTOSLEEP_SHIFT (4U)
#define MODE_PRESCALE_SHIFT (5U)
#define MODE_INTERRUPT_DEFAULT (0x40) /* Active low, push-pull */
#define MMA7660_INTSOURCE_NONE (0x00)
#define MMA7660_INTSOURCE_FB (0x01)
#define MMA7660_INTSOURCE_UDLR (0x02)
#define MMA7660_INTSOURCE_TAP (0x04)
#define MMA7660_INTSOURCE_AUTOSLEEP (0x08)
#define MMA7660_INTSOURCE_MEASURE (0x10)
#define MMA7660_INTSOURCE_SHX (0x20)
#define MMA7660_INTSOURCE_SHY (0x40)
#define MMA7660_INTSOURCE_SHZ (0x80)
#define MMA7660_SR_AMPD (0x00)
#define MMA7660_SR_AM64 (0x01)
#define MMA7660_SR_AM32 (0x02)
#define MMA7660_SR_AM16 (0x03)
#define MMA7660_SR_AM8 (0x04)
#define MMA7660_SR_AM4 (0x05)
#define MMA7660_SR_AM2 (0x06)
#define MMA7660_SR_AM1 (0x07)
#define MMA7660_SR_AW32 (0x00)
#define MMA7660_SR_AW16 (0x08)
#define MMA7660_SR_AW8 (0x10)
#define MMA7660_SR_AW1 (0x18)
#define MMA7660_PDET_X (0x20)
#define MMA7660_PDET_Y (0x40)
#define MMA7660_PDET_Z (0x80)
#define MMA7660_ADDR (0x4C)
/* This is actually 46.9 but the sensor is not accurate enough
* for that to matter
*/
#define MMA7660_MG_PER_COUNT (47U)
/** @} */
/**
* @brief Initialize an MMA7660 device
*
* @param[out] dev device descriptor
* @param[in] params device configuration parameters
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_ERR on i2c bus initialization error
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_init(mma7660_t *dev, const mma7660_params_t *params);
/**
* @brief Set the mode register
*
* @param[in] dev device descriptor
* @param[in] active 0=sleep 1=active
* @param[in] autowake see datasheet
* @param[in] autosleep see datasheet
* @param[in] prescale main clock prescalar
*
* See page 17 of http://www.nxp.com/files/sensors/doc/data_sheet/MMA7660FC.pdf
* for information about the parameters
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_set_mode(const mma7660_t *dev, uint8_t active,
uint8_t autowake, uint8_t autosleep, uint8_t prescale);
/**
* @brief Read the tilt register
*
* @param[in] dev device descriptor
* @param[out] res tilt register contents
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_READ_ERR on i2c bus read error
*/
int mma7660_read_tilt(const mma7660_t *dev, uint8_t *res);
/**
* @brief Write the sleep count register
*
* @param[in] dev device descriptor
* @param[in] sleep sleep count
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_write_sleep_count(const mma7660_t *dev, uint8_t sleep);
/**
* @brief Configure the interrupt sources
*
* @param[in] dev device descriptor
* @param[in] isource_flags interrupt source flags
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_config_interrupts(const mma7660_t *dev, uint8_t isource_flags);
/**
* @brief Configure the sample rate
*
* @param[in] dev device descriptor
* @param[in] amsr active mode sample rate (pg 18 of DS)
* @param[in] awsr auto wake sample rate (pg 19 of DS)
* @param[in] filt filter samples (pg 19 of DS)
*
* See datasheet http://www.nxp.com/files/sensors/doc/data_sheet/MMA7660FC.pdf
* for details about the parameters
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_config_samplerate(const mma7660_t *dev, uint8_t amsr, uint8_t awsr, uint8_t filt);
/**
* @brief Configure the tap detection
*
* @param[in] dev device descriptor
* @param[in] pdth pulse detection
* @param[in] enabled_axes enabled axes
*
* See page 21 of http://www.nxp.com/files/sensors/doc/data_sheet/MMA7660FC.pdf
* for details about the parameters
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_config_pdet(const mma7660_t *dev, uint8_t pdth, uint8_t enabled_axes);
/**
* @brief Configure the tap detection debounce count
*
* @param[in] dev device descriptor
* @param[in] pd pulse debounce
*
* See page 21 of http://www.nxp.com/files/sensors/doc/data_sheet/MMA7660FC.pdf
* for details about the debouncer
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_WRITE_ERR on i2c bus write error
*/
int mma7660_config_pd(const mma7660_t *dev, uint8_t pd) ;
/**
* @brief Read the acceleration counts converted to mG
*
* @param[in] dev device descriptor
* @param[out] data the acceleration data
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_READ_ERR on i2c bus read error
*/
int mma7660_read(const mma7660_t *dev, mma7660_data_t *data);
/**
* @brief Read the acceleration counts (unconverted)
*
* @param[in] dev device descriptor
* @param[out] x the X axis value
* @param[out] y the Y axis value
* @param[out] z the Z axis value
*
* See page 28 of http://www.nxp.com/files/sensors/doc/data_sheet/MMA7660FC.pdf
* for conversion of acceleration counts to angles or G forces.
*
* @return MMA7660_OK on success
* @return -MMA7660_I2C_READ_ERR on i2c bus read error
* @return -MMA7660_READ_ERR on general read error
*/
int mma7660_read_counts(const mma7660_t *dev, int8_t *x, int8_t *y, int8_t *z);
#ifdef __cplusplus
}
#endif
#endif /* MMA7660_H */
/** @} */