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

Dependents:   ADC128D818_HelloWorld

ADC128D818.cpp

Committer:
fblanc
Date:
2013-08-27
Revision:
0:9cc68ef524da
Child:
1:5f9dbbbc34c5

File content as of revision 0:9cc68ef524da:


#include "ADC128D818.h"

//Create instance
ADC128D818::ADC128D818(PinName sda, PinName scl, PinName adc_int) : _i2c(sda, scl), _Adc_Int (adc_int)
{
}

//destroy instance
ADC128D818::~ADC128D818()
{
}

int ADC128D818::init(char address, char mode, char vref, char rate, char mask_channel, char mask_int)
{

char data;
char cmd_data[2];

    _address=address << 1; //bug ?

    //2 test Busy_Status_Register
    cmd_data[0]= ADC_REG_Busy_Status_Register;

    if(_i2c.write(_address, cmd_data, 1))
        return  -1; //NO DEVICE
    _i2c.read(_address,&data,1); //read a byte

    if ((data & Busy_Status_Register_Not_Ready) == 1)
        return  -2; //ADC is BUSY
        
    ADC128D818::stop();
    //3 Program the Advanced Configuration Register
    data=0;
    switch (vref)
    {
        case ADC_VREF_INT:
            data&=~Advanced_Configuration_Register_External_Reference_Enable; //0
        break;
        case ADC_VREF_EXT:
            data|=Advanced_Configuration_Register_External_Reference_Enable; //1
        break;
    }
    switch (mode)
    {
        case ADC_MODE_0:
            data&=~Advanced_Configuration_Register_Mode_Select_0; //0
            data&=~Advanced_Configuration_Register_Mode_Select_1; //0
        break;
        case ADC_MODE_1:
            data&=~Advanced_Configuration_Register_Mode_Select_0; //0
            data|=Advanced_Configuration_Register_Mode_Select_1; //1
        break;
        case ADC_MODE_2:
            data|=~Advanced_Configuration_Register_Mode_Select_0; //1
            data&=Advanced_Configuration_Register_Mode_Select_1; //0
        break;
        case ADC_MODE_3:
            data|=~Advanced_Configuration_Register_Mode_Select_0; //1
            data|=Advanced_Configuration_Register_Mode_Select_1; //1
        break;
    }
   
    cmd_data[0]=ADC_REG_Advanced_Configuration_Register;
    cmd_data[1]=data;

   _i2c.write(_address, cmd_data, 2); //send a byte & wait acknowledged

    //4 Program the Conversion Rate Register
    data=0;
    switch (rate)
    {
        case ADC_RATE_LOW_POWER:
            data&=~Advanced_Configuration_Register_External_Reference_Enable; //0
        break;
        case ADC_RATE_CONTINUOUS:
            data|=Advanced_Configuration_Register_External_Reference_Enable; //1
        break;
    }
    
    cmd_data[0]=ADC_REG_Conversion_Rate_Register;
    cmd_data[1]=data;

    _i2c.write(_address, cmd_data, 2); //send a byte & wait acknowledged

    //5 Choose to enable or disable the channels using the Channel Disable Register

    cmd_data[0]=ADC_REG_Channel_Disable_Register;
    cmd_data[1]=mask_channel;

    _i2c.write(_address, cmd_data, 2); //send a byte & wait acknowledged

    //6 Using the Interrupt Mask Register

    cmd_data[0]=ADC_REG_Interrupt_Mask_Register;
    cmd_data[1]=mask_int;

    _i2c.write(_address, cmd_data, 2); //send a byte & wait acknowledged

return  0;
}


int ADC128D818::init_limit(char channel, int limit, char high_low)
{
    char cmd_data[3];
    char *ptr;
    cmd_data[0]=ADC_REG_Limit_Registers + channel + high_low;
    ptr=(char *) & limit;
    cmd_data[1]=*ptr;
    cmd_data[2]=*++ptr;

    _i2c.write(_address, cmd_data, 3); //send a byte & wait acknowledged

   return  0;
}

int ADC128D818::read_channel(char channel)
{

    char data[2];
//    char *ptr;
    char cmd[1] ;
    cmd[0] = ADC_REG_Channel_Readings_Registers + channel;
    _i2c.write(_address, cmd, 1); //send a byte & wait acknowledged
    //ptr=(char *) & data;
    _i2c.read(_address,data,2); //read a byte
    
   return  (int) data[0]*256+data[1];
}



char ADC128D818::read_register(char Register)
{
    char cmd ;
    cmd = Register;
    
    _i2c.write(_address, &cmd, 1); //send a byte 
    _i2c.read(_address,&cmd,1); //read a byte
    
   return  cmd;
}

void ADC128D818::start()
{
    char cmd_data[2];
    cmd_data[0]= ADC_REG_Configuration_Register;
    cmd_data[1]= Configuration_Register_Start | Configuration_Register_INT_Enable  ;

   _i2c.write(_address, cmd_data, 2); //send a 2 byte 

}
void ADC128D818::stop()
{
    char cmd_data[2];
    cmd_data[0]= ADC_REG_Configuration_Register;
    cmd_data[1]= 0 ;

   _i2c.write(_address, cmd_data, 2); //send a byte 

}