12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interface

Dependents:   ADC128D818_HelloWorld

ADC128D818.h

Committer:
fblanc
Date:
2013-09-05
Revision:
2:f9a0518b352a
Parent:
1:5f9dbbbc34c5
Child:
3:816284ff2a09

File content as of revision 2:f9a0518b352a:

/**
 * @brief ADC128D818 12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interfac
 * http://www.ti.com/product/adc128d818/
 * @date 02/09/2013
 * @author F.BLANC LAAS-CNRS
 * http://homepages.laas.fr/fblanc/
 */

#ifndef ADC128D818_H

#define ADC128D818_H

#include "mbed.h"


//Library for the ADC128D818 12 BIT ADC.
enum ADC_MODE {
    ADC_MODE_0 = 0x00,
    ADC_MODE_1 = 0x01,
    ADC_MODE_2 = 0x02,
    ADC_MODE_3 = 0x03
};
enum ADC_ADDRESS {
    ADC_ADDRESS_LOW_LOW = 0x1D,
    ADC_ADDRESS_LOW_MID = 0x1E,
    ADC_ADDRESS_LOW_HIGH = 0x1F,
    ADC_ADDRESS_MID_LOW = 0x2D,
    ADC_ADDRESS_MID_MID = 0x2E,
    ADC_ADDRESS_MID_HIGH = 0x2F,
    ADC_ADDRESS_HIGH_LOW = 0x35,
    ADC_ADDRESS_HIGH_MID = 0x36,
    ADC_ADDRESS_HIGH_HIGH = 0x37
};
enum ADC_VREF {
    ADC_VREF_INT = 0x00,
    ADC_VREF_EXT = 0x01
};
enum ADC_RATE {
    ADC_RATE_LOW_POWER = 0x00,
    ADC_RATE_CONTINUOUS = 0x01
};
enum ADC_LIMIT {
    ADC_LIMIT_HIGH = 0x00,
    ADC_LIMIT_LOW = 0x01
};
enum ADC_CHANNEL {
    ADC_CHANNEL_IN0 = 0x00,
    ADC_CHANNEL_IN1 = 0x01,
    ADC_CHANNEL_IN2 = 0x02,
    ADC_CHANNEL_IN3 = 0x03,
    ADC_CHANNEL_IN4 = 0x04,
    ADC_CHANNEL_IN5 = 0x05,
    ADC_CHANNEL_IN6 = 0x06,
    ADC_CHANNEL_IN7 = 0x07,
    ADC_CHANNEL_TEMP = 0x07
};
enum ADC_INT {

    ADC_INT_IN0 = (char)~(0x01 <<0),
    ADC_INT_IN1 = (char)~(0x01 <<1),
    ADC_INT_IN2 = (char)~(0x01 <<2),
    ADC_INT_IN3 = (char)~(0x01 <<3),
    ADC_INT_IN4 = (char)~(0x01 <<4),
    ADC_INT_IN5 = (char)~(0x01 <<5),
    ADC_INT_IN6 = (char)~(0x01 <<6),
    ADC_INT_IN7 = (char)~(0x01 <<7),
    ADC_INT_TEMP = (char)~(0x01 <<7),
    ADC_INT_ALL = 0x00
};
enum ADC_ENABLE {

    ADC_ENABLE_IN0 = (char)~(0x01 <<0),
    ADC_ENABLE_IN1 = (char)~(0x01 <<1),
    ADC_ENABLE_IN2 = (char)~(0x01 <<2),
    ADC_ENABLE_IN3 = (char)~(0x01 <<3),
    ADC_ENABLE_IN4 = (char)~(0x01 <<4),
    ADC_ENABLE_IN5 = (char)~(0x01 <<5),
    ADC_ENABLE_IN6 = (char)~(0x01 <<6),
    ADC_ENABLE_IN7 = (char)~(0x01 <<7),
    ADC_ENABLE_TEMP = ~(0x01 <<7),
    ADC_ENABLE_ALL = 0x00
};
enum ADC_REG {
    ADC_REG_Configuration_Register  = 0x00,
    ADC_REG_Interrupt_Status_Register = 0x01,
    ADC_REG_Interrupt_Mask_Register = 0x03,
    ADC_REG_Conversion_Rate_Register = 0x07,
    ADC_REG_Channel_Disable_Register = 0x08,
    ADC_REG_One_Shot_Register = 0x09,
    ADC_REG_Deep_Shutdown_Register = 0x0A,
    ADC_REG_Advanced_Configuration_Register = 0x0B,
    ADC_REG_Busy_Status_Register = 0x0C,
    ADC_REG_Channel_Readings_Registers = 0x20,
    ADC_REG_Limit_Registers = 0x2A,
    ADC_REG_Manufacturer_ID_Register = 0x3E,
    ADC_REG_Revision_ID_Register = 0x3F
};
class ADC128D818
{
protected:


    enum Configuration_Register {
        Configuration_Register_Start = 1<<0,
        Configuration_Register_INT_Enable = 1<<1,
        Configuration_Register_INT_Clear = 1<<3,
        Configuration_Register_Initialization = 1<<7
    };

    enum Busy_Status_Register {
        Busy_Status_Register_Busy = 1<<0,
        Busy_Status_Register_Not_Ready = 1<<1
    };

    enum Advanced_Configuration_Register {
        Advanced_Configuration_Register_External_Reference_Enable = 1<<0,
        Advanced_Configuration_Register_Mode_Select_0 = 1<<1,
        Advanced_Configuration_Register_Mode_Select_1 = 1<<2
    };

    enum Conversion_Rate_Register {
        Conversion_Rate_Register_Rate_Register = 1<<0
    };


private:
    I2C _i2c;
    char _data[2];
    char _address;
    char _mode;

public:
    /**
     * @brief Constructor.
     *
     * @param sda I2C
     * @param scl I2C
     * @param adc_int
     */
    ADC128D818(PinName sda, PinName scl, PinName adc_int );
    /**
    * @brief Destructor.
    */
    ~ADC128D818();

    InterruptIn _Adc_Int;
    /**
    * @brief read_channel
    * @param channel
    * @return u32_data
    * @date 02/09/2013
    */
    int read_channel(char channel);
    /**
    * @brief read_register
    * @param Register
    * @return u8_data
    * @date 02/09/2013
    */
    char read_register(char Register);
    /**
    * @brief init
    *
    * @param address I2C (7bits)
        ADC_ADDRESS_LOW_LOW
        ADC_ADDRESS_LOW_MID
        ADC_ADDRESS_LOW_HIGH
        ADC_ADDRESS_MID_LOW
        ADC_ADDRESS_MID_MID
        ADC_ADDRESS_MID_HIGH
        ADC_ADDRESS_HIGH_LOW
        ADC_ADDRESS_HIGH_MID
        ADC_ADDRESS_HIGH_HIGH
    * @param mode :
        ADC_MODE_0
        ADC_MODE_1
        ADC_MODE_2
        ADC_MODE_3
    * @param vref
        ADC_VREF_INT
        ADC_VREF_EXT
    * @param rate
        ADC_RATE_LOW_POWER
        ADC_RATE_CONTINUOUS
    * @param mask_channel
    * @param mask_int
    * @return error 0 OK, -1 NO DEVICE, -2 ADC is BUSY
    * @date 02/09/2013
    */
    int init(char address, char mode, char vref, char rate, char mask_channel, char mask_int);
    /**
    * @brief init_limit
    *
    * @param limit
    * @param high_low
        ADC_LIMIT_HIGH
        ADC_LIMIT_LOW
    * @return error 0 OK
    * @date 02/09/2013
    */
    int init_limit(char channel, char limit, char high_low);
    /**
    * @brief start
    * @date 02/09/2013
    */
    void start();
    /**
    * @brief stop
    * @date 02/09/2013
    */
    void stop();
};

#endif