/* * 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/driver_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. * * @author Joakim Nohlgård */ #ifndef ADT7310_H_ #define ADT7310_H_ #include #include #include "periph/spi.h" #include "periph/gpio.h" #ifdef __cplusplus extern "C" { #endif /** * @brief Device descriptor for ADT7310 sensors. */ typedef struct { spi_t spi; /**< SPI bus the sensor is connected to */ 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; /** @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) /** @brief Continuous operation mode */ #define ADT7310_MODE_CONTINUOUS (ADT7310_CONF_OPERATION_MODE(0)) /** @brief One shot */ #define ADT7310_MODE_ONE_SHOT (ADT7310_CONF_OPERATION_MODE(1)) /** @brief 1 sample per second */ #define ADT7310_MODE_1SPS (ADT7310_CONF_OPERATION_MODE(2)) /** @brief Shut down (powersave) */ #define ADT7310_MODE_SHUTDOWN (ADT7310_CONF_OPERATION_MODE(3)) /** @} */ /** * @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); /** * @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 * @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, gpio_t cs); /** * @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 */ int16_t adt7310_read_raw(adt7310_t *dev); /** * @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 */ int32_t adt7310_read(adt7310_t *dev); /** * @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 */ float adt7310_read_float(adt7310_t *dev); #ifdef __cplusplus } #endif #endif /* ADT7310_H_ */ /** @} */