Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor

Dependents:   Frequency_Counter_w_GPS_1PPS MQTToverCC3000 Frequency_Cntr_1PPS_F746ZG

ADT7410.cpp

Committer:
kenjiArai
Date:
2017-08-23
Revision:
4:523b5b34e0c9
Parent:
3:912cd5ac1cce

File content as of revision 4:523b5b34e0c9:

/*
 * mbed library program
 *  Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor
 *  http://www.analog.com/en/mems-sensors/digital-temperature-sensors/adt7410/products/product.html
 *
 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Created: November    26th, 2014
 *      Revised: FAugust     23rd, 2017
 */

#include    "mbed.h"
#include    "ADT7410.h"

ADT7410::ADT7410 (PinName p_sda, PinName p_scl, uint8_t addr)
 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
{
    ADT7410_addr = (char)addr;
    init();
}

ADT7410::ADT7410 (I2C& p_i2c, uint8_t addr)
 : _i2c(p_i2c)
{
    ADT7410_addr = (char)addr;
    init();
}

/////////////// Read All data /////////////////////////////
void ADT7410::read_all()
{
    dt[0] = ADT7410_A_T_MSB;
    _i2c.write((int)ADT7410_addr, (char *)dt, 1, true);
    _i2c.read((int)ADT7410_addr, (char *)dt, 4, false);
}

/////////////// Read Temperature //////////////////////////
float ADT7410::read_temp()
{
    uint16_t data;

    read_all();
    if (dt[3] & 0x80){  // 16bit
        data = (dt[0] << 8) + dt[1];       
    } else {            // 13bit
        data = (dt[0] << 8) + (dt[1] & 0xf8);
    }
    if (dt[0] & 0x80){  // -
        return (float)(data - 65536) / 128;
    } else {            // +
        return (float)data / 128;
    }
}

/////////////// Check Status //////////////////////////////
uint8_t ADT7410::read_status()
{
    int8_t dt = read_reg_byte(ADT7410_A_STATUS);
    return dt;
}

/////////////// Check Configration //////////////////////////
uint8_t ADT7410::read_config()
{
    int8_t dt = read_reg_byte(ADT7410_A_CONFIG);
    return dt;
}

/////////////// Set Configration //////////////////////////
uint8_t ADT7410::set_config(uint8_t cfg)
{
    return write_reg_byte(ADT7410_A_CONFIG, cfg);
}

/////////////// Read ID & REV //////////////////////////
void ADT7410::read_id_rev()
{
    uint8_t dt;

    dt = read_reg_byte(ADT7410_A_ID);
    id_number = GET_ID(dt);
    rev_number = GET_REV(dt);
}

uint8_t ADT7410::read_ID()
{
    return id_number;
}

uint8_t ADT7410::read_REV()
{
    return rev_number;
}

uint8_t ADT7410::who_am_i()
{
    if (id_number == I_AM_ADT7410){
        return 1;
    } else {
        return 0;
    }
}

/////////////// Read/Write specific register //////////////
uint8_t ADT7410::read_reg_byte(uint8_t reg)
{
    uint8_t dx[2];
    
    dx[0] = reg;
    _i2c.write((int)ADT7410_addr, (char *)dx, 1, true);
    _i2c.read((int)ADT7410_addr, (char *)dx, 1, false);
    return dx[0];
}

uint8_t ADT7410::write_reg_byte(uint8_t reg, uint8_t dt)
{
    uint8_t dx[2];
    
    dx[0] = reg;
    dx[1] = dt;
    _i2c.write((int)ADT7410_addr, (char *)dx, 2, false);
    return dx[1];
}

/////////////// Initialize ////////////////////////////////
void ADT7410::init()
{
    uint8_t dx[2];

    dx[0] = ADT7410_A_CONFIG;
    dx[1] = RESOLUTION_16BIT + OPERATION_MODE_CONT;
    _i2c.write((int)ADT7410_addr, (char *)dx, 2, false);
    read_id_rev();
}