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 }