1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/adt7310.h

182 lines
6.0 KiB
C
Raw Normal View History

/*
* Copyright (C) 2015 Eistec AB
*
* 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_adt7310 ADT7310 SPI temperature sensor
* @ingroup drivers_sensors
* @brief Driver for the Analog Devices ADT7310 temperature sensor.
*
* ## Description
*
* The ADT7310 is a high accuracy digital temperature sensor
* in a narrow SOIC package. It contains a band gap temperature
* reference and a 13-bit ADC to monitor and digitize the
* temperature to a 0.0625°C resolution. The ADC resolution,
* by default, is set to 13 bits (0.0625 °C). This can be changed
* to 16 bits (0.0078 °C) by setting Bit 7 in the configuration
* register (Register Address 0x01).
* The ADT7310 is guaranteed to operate over supply voltages from
* 2.7 V to 5.5 V. Operating at 3.3 V, the average supply current is
* typically 210 μA. The ADT7310 has a shutdown mode that
* powers down the device and offers a shutdown current of
* typically 2 μA. The ADT7310 is rated for operation over the
* 55°C to +150°C temperature range.
*
* ## Usage
*
* See `tests/drivers/adt7310` for an example application using this driver.
*
* ## Caveats
*
* This driver is currently missing support for a number of hardware features:
*
* - Interrupt and compare pins are not handled
* - There is no public API for setting the temperature alarm levels
* - Device SPI reset is not implemented (drive MISO high from the master while clocking SCK)
*
* @{
*
* @file
* @brief Interface definition for the ADT7310 sensor driver.
*
2015-09-20 13:47:39 +02:00
* @author Joakim Nohlgård <joakim.nohlgard@eistec.se>
*/
#ifndef ADT7310_H
#define ADT7310_H
#include <stdint.h>
#include <stdbool.h>
#include "periph/spi.h"
#include "periph/gpio.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
2017-08-29 18:00:46 +02:00
* @brief Device descriptor for ADT7310 sensors.
*/
typedef struct {
spi_t spi; /**< SPI bus the sensor is connected to */
spi_clk_t clk; /**< SPI bus clock speed */
gpio_t cs; /**< CS pin GPIO handle */
bool initialized; /**< sensor status, true if sensor is initialized */
bool high_res; /**< Sensor resolution, true if configured to 16 bit resolution */
} adt7310_t;
2017-08-29 18:00:46 +02:00
/**
* @name ADT7310 configuration bits
* @{
*/
#define ADT7310_CONF_FAULT_QUEUE_MASK (0x03)
#define ADT7310_CONF_FAULT_QUEUE_SHIFT (0)
#define ADT7310_CONF_FAULT_QUEUE(x) (((x) << ADT7310_CONF_FAULT_QUEUE_SHIFT) & ADT7310_CONF_FAULT_QUEUE_MASK)
#define ADT7310_CONF_CT_POL_MASK (0x04)
#define ADT7310_CONF_CT_POL_SHIFT (2)
#define ADT7310_CONF_CT_POL(x) (((x) << ADT7310_CONF_CT_POL_SHIFT) & ADT7310_CONF_CT_POL_MASK)
#define ADT7310_CONF_INT_POL_MASK (0x08)
#define ADT7310_CONF_INT_POL_SHIFT (3)
#define ADT7310_CONF_INT_POL(x) (((x) << ADT7310_CONF_INT_POL_SHIFT) & ADT7310_CONF_INT_POL_MASK)
#define ADT7310_CONF_INTCT_MODE_MASK (0x10)
#define ADT7310_CONF_INTCT_MODE_SHIFT (4)
#define ADT7310_CONF_INTCT_MODE(x) (((x) << ADT7310_CONF_INTCT_MODE_SHIFT) & ADT7310_CONF_INTCT_MODE_MASK)
#define ADT7310_CONF_OPERATION_MODE_MASK (0x60)
#define ADT7310_CONF_OPERATION_MODE_SHIFT (5)
#define ADT7310_CONF_OPERATION_MODE(x) (((x) << ADT7310_CONF_OPERATION_MODE_SHIFT) & ADT7310_CONF_OPERATION_MODE_MASK)
#define ADT7310_CONF_RESOLUTION_MASK (0x80)
#define ADT7310_CONF_RESOLUTION_SHIFT (7)
#define ADT7310_CONF_RESOLUTION(x) (((x) << ADT7310_CONF_RESOLUTION_SHIFT) & ADT7310_CONF_RESOLUTION_MASK)
2017-08-29 18:00:46 +02:00
/**
* @brief Continuous operation mode
*/
#define ADT7310_MODE_CONTINUOUS (ADT7310_CONF_OPERATION_MODE(0))
2017-08-29 18:00:46 +02:00
/**
* @brief One shot
*/
#define ADT7310_MODE_ONE_SHOT (ADT7310_CONF_OPERATION_MODE(1))
2017-08-29 18:00:46 +02:00
/**
* @brief 1 sample per second
*/
#define ADT7310_MODE_1SPS (ADT7310_CONF_OPERATION_MODE(2))
2017-08-29 18:00:46 +02:00
/**
* @brief Shut down (powersave)
*/
#define ADT7310_MODE_SHUTDOWN (ADT7310_CONF_OPERATION_MODE(3))
/** @} */
/**
2017-08-29 18:00:46 +02:00
* @brief Set configuration register of an ADT7310 sensor
*
* @param[in] dev pointer to sensor device descriptor
* @param[in] config configuration byte, see macros in adt7310.h
*
* @return 0 on success
* @return -1 on error
*/
int adt7310_set_config(adt7310_t *dev, uint8_t config);
/**
2017-08-29 18:00:46 +02:00
* @brief Initialize the ADT7310 sensor driver.
*
* @note The SPI bus is expected to have been initialized when adt7310_init is called.
*
* @param[in] dev pointer to sensor device descriptor
* @param[in] spi SPI bus the sensor is connected to
2017-01-25 14:18:21 +01:00
* @param[in] clk SPI bus speed
* @param[in] cs GPIO pin the chip select signal is connected to
*
* @return 0 on success
* @return <0 on error
*/
int adt7310_init(adt7310_t *dev, spi_t spi, spi_clk_t clk, gpio_t cs);
/**
2017-08-29 18:00:46 +02:00
* @brief Read raw temperature register value
*
* @note The three least-significant bits of the value register are used for
* flags if the sensor is configured for 13 bit mode.
*
* @param[in] dev pointer to sensor device descriptor
*
* @return raw sensor value on success
* @return INT16_MIN on error
*/
2017-06-20 17:32:45 +02:00
int16_t adt7310_read_raw(const adt7310_t *dev);
/**
2017-08-29 18:00:46 +02:00
* @brief Read temperature value from sensor and convert to milli-degrees Celsius.
*
* Divide the returned value by 1000 to get integer degrees.
*
* @param[in] dev pointer to sensor device descriptor
*
* @return temperature in milli-degrees Celsius
* @return INT32_MIN on errors
*/
2017-06-20 17:32:45 +02:00
int32_t adt7310_read(const adt7310_t *dev);
/**
2017-08-29 18:00:46 +02:00
* @brief Read temperature value from sensor and convert to degrees Celsius.
*
* @param[in] dev pointer to sensor device descriptor
*
* @return floating point representation of temperature in degrees Celsius
* @return NaN on errors
*/
2017-06-20 17:32:45 +02:00
float adt7310_read_float(const adt7310_t *dev);
#ifdef __cplusplus
}
#endif
#endif /* ADT7310_H */
/** @} */