this is testing

Committer:
pmallick
Date:
Thu Jan 14 19:12:57 2021 +0530
Revision:
0:e8a1ba50c46b
this is testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmallick 0:e8a1ba50c46b 1 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 2 * @file adt7420.c
pmallick 0:e8a1ba50c46b 3 * @brief Implementation of ADT7420 Driver.
pmallick 0:e8a1ba50c46b 4 * @author DBogdan (dragos.bogdan@analog.com)
pmallick 0:e8a1ba50c46b 5 ********************************************************************************
pmallick 0:e8a1ba50c46b 6 * Copyright 2012(c) Analog Devices, Inc.
pmallick 0:e8a1ba50c46b 7 *
pmallick 0:e8a1ba50c46b 8 * All rights reserved.
pmallick 0:e8a1ba50c46b 9 *
pmallick 0:e8a1ba50c46b 10 * Redistribution and use in source and binary forms, with or without
pmallick 0:e8a1ba50c46b 11 * modification, are permitted provided that the following conditions are met:
pmallick 0:e8a1ba50c46b 12 * - Redistributions of source code must retain the above copyright
pmallick 0:e8a1ba50c46b 13 * notice, this list of conditions and the following disclaimer.
pmallick 0:e8a1ba50c46b 14 * - Redistributions in binary form must reproduce the above copyright
pmallick 0:e8a1ba50c46b 15 * notice, this list of conditions and the following disclaimer in
pmallick 0:e8a1ba50c46b 16 * the documentation and/or other materials provided with the
pmallick 0:e8a1ba50c46b 17 * distribution.
pmallick 0:e8a1ba50c46b 18 * - Neither the name of Analog Devices, Inc. nor the names of its
pmallick 0:e8a1ba50c46b 19 * contributors may be used to endorse or promote products derived
pmallick 0:e8a1ba50c46b 20 * from this software without specific prior written permission.
pmallick 0:e8a1ba50c46b 21 * - The use of this software may or may not infringe the patent rights
pmallick 0:e8a1ba50c46b 22 * of one or more patent holders. This license does not release you
pmallick 0:e8a1ba50c46b 23 * from the requirement that you obtain separate licenses from these
pmallick 0:e8a1ba50c46b 24 * patent holders to use this software.
pmallick 0:e8a1ba50c46b 25 * - Use of the software either in source or binary form, must be run
pmallick 0:e8a1ba50c46b 26 * on or directly connected to an Analog Devices Inc. component.
pmallick 0:e8a1ba50c46b 27 *
pmallick 0:e8a1ba50c46b 28 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
pmallick 0:e8a1ba50c46b 29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
pmallick 0:e8a1ba50c46b 30 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
pmallick 0:e8a1ba50c46b 31 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
pmallick 0:e8a1ba50c46b 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
pmallick 0:e8a1ba50c46b 33 * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
pmallick 0:e8a1ba50c46b 34 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
pmallick 0:e8a1ba50c46b 35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
pmallick 0:e8a1ba50c46b 36 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
pmallick 0:e8a1ba50c46b 37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
pmallick 0:e8a1ba50c46b 38 *******************************************************************************/
pmallick 0:e8a1ba50c46b 39
pmallick 0:e8a1ba50c46b 40 /******************************************************************************/
pmallick 0:e8a1ba50c46b 41 /***************************** Include Files **********************************/
pmallick 0:e8a1ba50c46b 42 /******************************************************************************/
pmallick 0:e8a1ba50c46b 43 #include <stdlib.h>
pmallick 0:e8a1ba50c46b 44 #include "adt7420.h"
pmallick 0:e8a1ba50c46b 45
pmallick 0:e8a1ba50c46b 46 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 47 * @brief Reads the value of a register.
pmallick 0:e8a1ba50c46b 48 *
pmallick 0:e8a1ba50c46b 49 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 50 * @param register_address - Address of the register.
pmallick 0:e8a1ba50c46b 51 *
pmallick 0:e8a1ba50c46b 52 * @return register_value - Value of the register.
pmallick 0:e8a1ba50c46b 53 *******************************************************************************/
pmallick 0:e8a1ba50c46b 54 uint8_t adt7420_get_register_value(struct adt7420_dev *dev,
pmallick 0:e8a1ba50c46b 55 uint8_t register_address)
pmallick 0:e8a1ba50c46b 56 {
pmallick 0:e8a1ba50c46b 57 uint8_t register_value = 0;
pmallick 0:e8a1ba50c46b 58
pmallick 0:e8a1ba50c46b 59 i2c_write(dev->i2c_desc,
pmallick 0:e8a1ba50c46b 60 &register_address,
pmallick 0:e8a1ba50c46b 61 1,
pmallick 0:e8a1ba50c46b 62 0);
pmallick 0:e8a1ba50c46b 63 i2c_read(dev->i2c_desc,
pmallick 0:e8a1ba50c46b 64 &register_value,
pmallick 0:e8a1ba50c46b 65 1,
pmallick 0:e8a1ba50c46b 66 1);
pmallick 0:e8a1ba50c46b 67
pmallick 0:e8a1ba50c46b 68 return register_value;
pmallick 0:e8a1ba50c46b 69 }
pmallick 0:e8a1ba50c46b 70
pmallick 0:e8a1ba50c46b 71 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 72 * @brief Sets the value of a register.
pmallick 0:e8a1ba50c46b 73 *
pmallick 0:e8a1ba50c46b 74 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 75 * @param register_address - Address of the register.
pmallick 0:e8a1ba50c46b 76 * @param register_value - Value of the register.
pmallick 0:e8a1ba50c46b 77 *
pmallick 0:e8a1ba50c46b 78 * @return None.
pmallick 0:e8a1ba50c46b 79 *******************************************************************************/
pmallick 0:e8a1ba50c46b 80 void adt7420_set_register_value(struct adt7420_dev *dev,
pmallick 0:e8a1ba50c46b 81 uint8_t register_address,
pmallick 0:e8a1ba50c46b 82 uint8_t register_value)
pmallick 0:e8a1ba50c46b 83 {
pmallick 0:e8a1ba50c46b 84 uint8_t data_buffer[2] = {0, 0};
pmallick 0:e8a1ba50c46b 85
pmallick 0:e8a1ba50c46b 86 data_buffer[0] = register_address;
pmallick 0:e8a1ba50c46b 87 data_buffer[1] = register_value;
pmallick 0:e8a1ba50c46b 88 i2c_write(dev->i2c_desc,
pmallick 0:e8a1ba50c46b 89 data_buffer,
pmallick 0:e8a1ba50c46b 90 2,
pmallick 0:e8a1ba50c46b 91 1);
pmallick 0:e8a1ba50c46b 92 }
pmallick 0:e8a1ba50c46b 93
pmallick 0:e8a1ba50c46b 94 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 95 * @brief Initializes the communication peripheral and checks if the device is
pmallick 0:e8a1ba50c46b 96 * present.
pmallick 0:e8a1ba50c46b 97 *
pmallick 0:e8a1ba50c46b 98 * @param device - The device structure.
pmallick 0:e8a1ba50c46b 99 * @param init_param - The structure that contains the device initial
pmallick 0:e8a1ba50c46b 100 * parameters.
pmallick 0:e8a1ba50c46b 101 *
pmallick 0:e8a1ba50c46b 102 * @return status - The result of the initialization procedure.
pmallick 0:e8a1ba50c46b 103 * Example: -1 - I2C peripheral was not initialized or the
pmallick 0:e8a1ba50c46b 104 * device is not present.
pmallick 0:e8a1ba50c46b 105 * 0 - I2C peripheral was initialized and the
pmallick 0:e8a1ba50c46b 106 * device is present.
pmallick 0:e8a1ba50c46b 107 *******************************************************************************/
pmallick 0:e8a1ba50c46b 108 int32_t adt7420_init(struct adt7420_dev **device,
pmallick 0:e8a1ba50c46b 109 struct adt7420_init_param init_param)
pmallick 0:e8a1ba50c46b 110 {
pmallick 0:e8a1ba50c46b 111 struct adt7420_dev *dev;
pmallick 0:e8a1ba50c46b 112 int32_t status;
pmallick 0:e8a1ba50c46b 113 uint8_t test = 0;
pmallick 0:e8a1ba50c46b 114
pmallick 0:e8a1ba50c46b 115 dev = (struct adt7420_dev *)malloc(sizeof(*dev));
pmallick 0:e8a1ba50c46b 116 if (!dev)
pmallick 0:e8a1ba50c46b 117 return -1;
pmallick 0:e8a1ba50c46b 118
pmallick 0:e8a1ba50c46b 119 /* I2C */
pmallick 0:e8a1ba50c46b 120 status = i2c_init(&dev->i2c_desc, &init_param.i2c_init);
pmallick 0:e8a1ba50c46b 121
pmallick 0:e8a1ba50c46b 122 /* Device Settings */
pmallick 0:e8a1ba50c46b 123 dev->resolution_setting = init_param.resolution_setting;
pmallick 0:e8a1ba50c46b 124
pmallick 0:e8a1ba50c46b 125 test = adt7420_get_register_value(dev, ADT7420_REG_ID);
pmallick 0:e8a1ba50c46b 126 if(test != ADT7420_DEFAULT_ID)
pmallick 0:e8a1ba50c46b 127 status = -1;
pmallick 0:e8a1ba50c46b 128
pmallick 0:e8a1ba50c46b 129 *device = dev;
pmallick 0:e8a1ba50c46b 130
pmallick 0:e8a1ba50c46b 131 return status;
pmallick 0:e8a1ba50c46b 132 }
pmallick 0:e8a1ba50c46b 133
pmallick 0:e8a1ba50c46b 134 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 135 * @brief Free the resources allocated by adt7420_init().
pmallick 0:e8a1ba50c46b 136 *
pmallick 0:e8a1ba50c46b 137 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 138 *
pmallick 0:e8a1ba50c46b 139 * @return ret - The result of the remove procedure.
pmallick 0:e8a1ba50c46b 140 *******************************************************************************/
pmallick 0:e8a1ba50c46b 141 int32_t adt7420_remove(struct adt7420_dev *dev)
pmallick 0:e8a1ba50c46b 142 {
pmallick 0:e8a1ba50c46b 143 int32_t ret;
pmallick 0:e8a1ba50c46b 144
pmallick 0:e8a1ba50c46b 145 ret = i2c_remove(dev->i2c_desc);
pmallick 0:e8a1ba50c46b 146
pmallick 0:e8a1ba50c46b 147 free(dev);
pmallick 0:e8a1ba50c46b 148
pmallick 0:e8a1ba50c46b 149 return ret;
pmallick 0:e8a1ba50c46b 150 }
pmallick 0:e8a1ba50c46b 151
pmallick 0:e8a1ba50c46b 152 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 153 * @brief Resets the ADT7420.
pmallick 0:e8a1ba50c46b 154 * The ADT7420 does not respond to I2C bus commands while the default
pmallick 0:e8a1ba50c46b 155 * values upload (approximately 200 us).
pmallick 0:e8a1ba50c46b 156 *
pmallick 0:e8a1ba50c46b 157 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 158 *
pmallick 0:e8a1ba50c46b 159 * @return None.
pmallick 0:e8a1ba50c46b 160 *******************************************************************************/
pmallick 0:e8a1ba50c46b 161 void adt7420_reset(struct adt7420_dev *dev)
pmallick 0:e8a1ba50c46b 162 {
pmallick 0:e8a1ba50c46b 163 uint8_t register_address = ADT7420_REG_RESET;
pmallick 0:e8a1ba50c46b 164
pmallick 0:e8a1ba50c46b 165 i2c_write(dev->i2c_desc,
pmallick 0:e8a1ba50c46b 166 &register_address,
pmallick 0:e8a1ba50c46b 167 1,
pmallick 0:e8a1ba50c46b 168 1);
pmallick 0:e8a1ba50c46b 169 dev->resolution_setting = 0;
pmallick 0:e8a1ba50c46b 170 }
pmallick 0:e8a1ba50c46b 171
pmallick 0:e8a1ba50c46b 172 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 173 * @brief Sets the operational mode for ADT7420.
pmallick 0:e8a1ba50c46b 174 *
pmallick 0:e8a1ba50c46b 175 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 176 * @param mode - Operation mode.
pmallick 0:e8a1ba50c46b 177 * Example: ADT7420_OP_MODE_CONT_CONV - continuous conversion;
pmallick 0:e8a1ba50c46b 178 * ADT7420_OP_MODE_ONE_SHOT - one shot;
pmallick 0:e8a1ba50c46b 179 * ADT7420_OP_MODE_1_SPS - 1 SPS mode;
pmallick 0:e8a1ba50c46b 180 * ADT7420_OP_MODE_SHUTDOWN - shutdown.
pmallick 0:e8a1ba50c46b 181 *
pmallick 0:e8a1ba50c46b 182 * @return None.
pmallick 0:e8a1ba50c46b 183 *******************************************************************************/
pmallick 0:e8a1ba50c46b 184 void adt7420_set_operation_mode(struct adt7420_dev *dev,
pmallick 0:e8a1ba50c46b 185 uint8_t mode)
pmallick 0:e8a1ba50c46b 186 {
pmallick 0:e8a1ba50c46b 187 uint8_t register_value = 0;
pmallick 0:e8a1ba50c46b 188
pmallick 0:e8a1ba50c46b 189 register_value = adt7420_get_register_value(dev, ADT7420_REG_CONFIG);
pmallick 0:e8a1ba50c46b 190 register_value &= ~ADT7420_CONFIG_OP_MODE(ADT7420_OP_MODE_SHUTDOWN);
pmallick 0:e8a1ba50c46b 191 register_value |= ADT7420_CONFIG_OP_MODE(mode);
pmallick 0:e8a1ba50c46b 192 adt7420_set_register_value(dev, ADT7420_REG_CONFIG, register_value);
pmallick 0:e8a1ba50c46b 193 }
pmallick 0:e8a1ba50c46b 194
pmallick 0:e8a1ba50c46b 195 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 196 * @brief Sets the resolution for ADT7420.
pmallick 0:e8a1ba50c46b 197 *
pmallick 0:e8a1ba50c46b 198 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 199 * @param resolution - Resolution.
pmallick 0:e8a1ba50c46b 200 * Example: 0 - 13-bit resolution;
pmallick 0:e8a1ba50c46b 201 * 1 - 16-bit resolution.
pmallick 0:e8a1ba50c46b 202 *
pmallick 0:e8a1ba50c46b 203 * @return None.
pmallick 0:e8a1ba50c46b 204 *******************************************************************************/
pmallick 0:e8a1ba50c46b 205 void adt7420_set_resolution(struct adt7420_dev *dev,
pmallick 0:e8a1ba50c46b 206 uint8_t resolution)
pmallick 0:e8a1ba50c46b 207 {
pmallick 0:e8a1ba50c46b 208 uint8_t register_value = 0;
pmallick 0:e8a1ba50c46b 209
pmallick 0:e8a1ba50c46b 210 register_value = adt7420_get_register_value(dev, ADT7420_REG_CONFIG);
pmallick 0:e8a1ba50c46b 211 register_value &= ~ADT7420_CONFIG_RESOLUTION;
pmallick 0:e8a1ba50c46b 212 register_value |= (resolution * ADT7420_CONFIG_RESOLUTION);
pmallick 0:e8a1ba50c46b 213 adt7420_set_register_value(dev, ADT7420_REG_CONFIG, register_value);
pmallick 0:e8a1ba50c46b 214 dev->resolution_setting = resolution;
pmallick 0:e8a1ba50c46b 215 }
pmallick 0:e8a1ba50c46b 216
pmallick 0:e8a1ba50c46b 217 /***************************************************************************//**
pmallick 0:e8a1ba50c46b 218 * @brief Reads the temperature data and converts it to Celsius degrees.
pmallick 0:e8a1ba50c46b 219 *
pmallick 0:e8a1ba50c46b 220 * @param dev - The device structure.
pmallick 0:e8a1ba50c46b 221 *
pmallick 0:e8a1ba50c46b 222 * @return temperature - Temperature in degrees Celsius.
pmallick 0:e8a1ba50c46b 223 *******************************************************************************/
pmallick 0:e8a1ba50c46b 224 float adt7420_get_temperature(struct adt7420_dev *dev)
pmallick 0:e8a1ba50c46b 225 {
pmallick 0:e8a1ba50c46b 226 uint8_t msb_temp = 0;
pmallick 0:e8a1ba50c46b 227 uint8_t lsb_temp = 0;
pmallick 0:e8a1ba50c46b 228 uint16_t temp = 0;
pmallick 0:e8a1ba50c46b 229 float temp_c = 0;
pmallick 0:e8a1ba50c46b 230
pmallick 0:e8a1ba50c46b 231 msb_temp = adt7420_get_register_value(dev, ADT7420_REG_TEMP_MSB);
pmallick 0:e8a1ba50c46b 232 lsb_temp = adt7420_get_register_value(dev, ADT7420_REG_TEMP_LSB);
pmallick 0:e8a1ba50c46b 233 temp = ((uint16_t)msb_temp << 8) + lsb_temp;
pmallick 0:e8a1ba50c46b 234 if(dev->resolution_setting) {
pmallick 0:e8a1ba50c46b 235 if(temp & 0x8000)
pmallick 0:e8a1ba50c46b 236 /*! Negative temperature */
pmallick 0:e8a1ba50c46b 237 temp_c = (float)((int32_t)temp - 65536) / 128;
pmallick 0:e8a1ba50c46b 238 else
pmallick 0:e8a1ba50c46b 239 /*! Positive temperature */
pmallick 0:e8a1ba50c46b 240 temp_c = (float)temp / 128;
pmallick 0:e8a1ba50c46b 241 } else {
pmallick 0:e8a1ba50c46b 242 temp >>= 3;
pmallick 0:e8a1ba50c46b 243 if(temp & 0x1000)
pmallick 0:e8a1ba50c46b 244 /*! Negative temperature */
pmallick 0:e8a1ba50c46b 245 temp_c = (float)((int32_t)temp - 8192) / 16;
pmallick 0:e8a1ba50c46b 246 else
pmallick 0:e8a1ba50c46b 247 /*! Positive temperature */
pmallick 0:e8a1ba50c46b 248 temp_c = (float)temp / 16;
pmallick 0:e8a1ba50c46b 249 }
pmallick 0:e8a1ba50c46b 250
pmallick 0:e8a1ba50c46b 251 return temp_c;
pmallick 0:e8a1ba50c46b 252 }