Driver for the Microchip MCP432x series of ADCs.

Dependents:   AKDP-RevD7_014

Fork of MCP342x by Osamu Koizumi

Committer:
tkstreet
Date:
Thu Aug 09 23:38:12 2018 +0000
Revision:
9:9e70e215d39a
Parent:
7:356650b8b01e
Child:
10:9e1bb1e16e68
Updated debugging calls.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coisme 1:bc877c37027c 1 #include "mcp342x.h"
coisme 1:bc877c37027c 2
coisme 1:bc877c37027c 3 #define LEN_DATA_REGISTER 3 // Length of the data registers.
coisme 1:bc877c37027c 4 #define LEN_ONE_BYTE 1
coisme 1:bc877c37027c 5
coisme 1:bc877c37027c 6 MCP342X::MCP342X(I2C *conn, SlaveAddress addr) {
tkstreet 9:9e70e215d39a 7 DBG_L3("#ADC object created\r\n");
coisme 1:bc877c37027c 8 slaveAddress = addr;
coisme 1:bc877c37027c 9 connection = conn;
coisme 1:bc877c37027c 10
coisme 1:bc877c37027c 11 init();
coisme 1:bc877c37027c 12 }
coisme 1:bc877c37027c 13
masahikofukasawa 4:6215f50b3297 14 /**
masahikofukasawa 4:6215f50b3297 15 * Destructor.
masahikofukasawa 4:6215f50b3297 16 *
masahikofukasawa 4:6215f50b3297 17 */
masahikofukasawa 4:6215f50b3297 18 //MCP342X::~MCP342X(){
masahikofukasawa 4:6215f50b3297 19 // if (connection) delete connection;
masahikofukasawa 4:6215f50b3297 20 //}
masahikofukasawa 4:6215f50b3297 21
coisme 1:bc877c37027c 22 MCP342X::Status MCP342X::init() {
coisme 1:bc877c37027c 23 Status status;
masahikofukasawa 5:0ecc54b7fb2e 24
masahikofukasawa 5:0ecc54b7fb2e 25 // general call reset (software POR)
masahikofukasawa 6:ed68eca49e70 26 // char general_reset = 0x06;
masahikofukasawa 6:ed68eca49e70 27 // connection->write(0, &general_reset, LEN_ONE_BYTE);
masahikofukasawa 5:0ecc54b7fb2e 28
coisme 1:bc877c37027c 29 int16_t val = 0;
coisme 1:bc877c37027c 30 // Reads the current configuration.
coisme 1:bc877c37027c 31 if ((status=readData(&val, &currentConfig)) != SUCCESS) {
coisme 1:bc877c37027c 32 return status;
coisme 1:bc877c37027c 33 }
coisme 1:bc877c37027c 34
coisme 1:bc877c37027c 35 // Initialize internal variable
coisme 1:bc877c37027c 36 currentConfig.measurementTrigger = NONE;
coisme 1:bc877c37027c 37
coisme 1:bc877c37027c 38 return status;
coisme 1:bc877c37027c 39 }
coisme 1:bc877c37027c 40
coisme 1:bc877c37027c 41 MCP342X::Status MCP342X::readData(int16_t *val, Config *config) {
tkstreet 9:9e70e215d39a 42 DBG_L3("#ADC: Reading data\r\n");
coisme 1:bc877c37027c 43 char buf[LEN_DATA_REGISTER];
coisme 1:bc877c37027c 44
coisme 1:bc877c37027c 45 // Reads data registers.
coisme 1:bc877c37027c 46 if (connection->read((slaveAddress << 1), buf, LEN_DATA_REGISTER) != 0) {
coisme 1:bc877c37027c 47 return ERROR_I2C_READ;
coisme 1:bc877c37027c 48 }
coisme 1:bc877c37027c 49
coisme 1:bc877c37027c 50 // Decodes configuration register data.
coisme 1:bc877c37027c 51 decodeConfigurationRegister(config, buf[2]);
coisme 1:bc877c37027c 52
coisme 1:bc877c37027c 53 // Converts AD value
coisme 1:bc877c37027c 54 *val = (int16_t)((buf[0] << 8) | buf[1]);
coisme 1:bc877c37027c 55
coisme 1:bc877c37027c 56 return SUCCESS;
coisme 1:bc877c37027c 57 }
coisme 1:bc877c37027c 58
coisme 1:bc877c37027c 59 void MCP342X::decodeConfigurationRegister(Config *config, uint8_t regVal) {
coisme 1:bc877c37027c 60 uint8_t tmp = 0;
coisme 1:bc877c37027c 61
coisme 1:bc877c37027c 62 // For the meaning of each bit, see the section 5.2 in the datasheet.
coisme 1:bc877c37027c 63
coisme 1:bc877c37027c 64 // Decodes Ready Bit (~RDY), Bit 7
coisme 1:bc877c37027c 65 tmp = ((0x80 & regVal) >> 7);
coisme 1:bc877c37027c 66 if (tmp == 0x00) {
coisme 1:bc877c37027c 67 config->dataStatus = DATA_UPDATED;
coisme 1:bc877c37027c 68 } else {
coisme 1:bc877c37027c 69 config->dataStatus = DATA_NOT_UPDATED;
coisme 1:bc877c37027c 70 }
coisme 1:bc877c37027c 71
coisme 1:bc877c37027c 72 // Decodes Channel Selection Bits, Bit 6-5
coisme 1:bc877c37027c 73 tmp = ((0x60 & regVal) >> 5);
coisme 1:bc877c37027c 74 if (tmp == 0x00) {
coisme 1:bc877c37027c 75 config->adcChannel = ADC_CH1;
coisme 1:bc877c37027c 76 } else if (tmp == 0x01) {
coisme 1:bc877c37027c 77 config->adcChannel = ADC_CH2;
coisme 1:bc877c37027c 78 } else if (tmp == 0x02) {
coisme 1:bc877c37027c 79 config->adcChannel = ADC_CH3;
coisme 1:bc877c37027c 80 } else { // ch == 0x03
coisme 1:bc877c37027c 81 config->adcChannel = ADC_CH4;
coisme 1:bc877c37027c 82 }
coisme 1:bc877c37027c 83
coisme 1:bc877c37027c 84 // Decodes Conversion Mode Bit, Bit 4
coisme 1:bc877c37027c 85 tmp = ((0x10 & regVal) >> 4);
coisme 1:bc877c37027c 86 if (tmp == 0x01) {
coisme 1:bc877c37027c 87 config->conversionMode = CONTINUOUS;
coisme 1:bc877c37027c 88 } else {
coisme 1:bc877c37027c 89 config->conversionMode = ONE_SHOT;
coisme 1:bc877c37027c 90 }
coisme 1:bc877c37027c 91
coisme 1:bc877c37027c 92 // Decodes Sample Rate Selection Bit
coisme 1:bc877c37027c 93 tmp = ((0x0C & regVal) >> 2);
coisme 1:bc877c37027c 94 if (tmp == 0x00) {
coisme 1:bc877c37027c 95 config->sampleSetting = SAMPLE_240HZ_12BIT;
coisme 1:bc877c37027c 96 } else if (tmp == 0x01) {
coisme 1:bc877c37027c 97 config->sampleSetting = SAMPLE_60HZ_14BIT;
coisme 1:bc877c37027c 98 } else {
coisme 1:bc877c37027c 99 config->sampleSetting = SAMPLE_15HZ_16BIT;
coisme 1:bc877c37027c 100 }
coisme 1:bc877c37027c 101
coisme 1:bc877c37027c 102 // Decodes PGA Gain Selection Bits
coisme 1:bc877c37027c 103 tmp = (0x03 & regVal);
coisme 1:bc877c37027c 104 if (tmp == 0x00) {
coisme 1:bc877c37027c 105 config->pgaSetting = PGA_1X;
coisme 1:bc877c37027c 106 } else if (tmp == 0x01) {
coisme 1:bc877c37027c 107 config->pgaSetting = PGA_2X;
coisme 1:bc877c37027c 108 } else if (tmp == 0x02) {
coisme 1:bc877c37027c 109 config->pgaSetting = PGA_4X;
coisme 1:bc877c37027c 110 } else {
coisme 1:bc877c37027c 111 config->pgaSetting = PGA_8X;
coisme 1:bc877c37027c 112 }
coisme 1:bc877c37027c 113 }
coisme 1:bc877c37027c 114
coisme 1:bc877c37027c 115 MCP342X::Status MCP342X::setConfig(const Config *config) {
coisme 1:bc877c37027c 116 char val = 0;
coisme 1:bc877c37027c 117
coisme 1:bc877c37027c 118 // Measurement trigger
coisme 1:bc877c37027c 119 if (config->measurementTrigger == TRIGGER) {
coisme 1:bc877c37027c 120 val |= 0x80;
coisme 1:bc877c37027c 121 } else {
coisme 1:bc877c37027c 122 val |= 0x00;
coisme 1:bc877c37027c 123 }
coisme 1:bc877c37027c 124
coisme 1:bc877c37027c 125 // Channel Selection
coisme 1:bc877c37027c 126 if (config->adcChannel == ADC_CH1) {
coisme 1:bc877c37027c 127 val |= 0x00;
coisme 1:bc877c37027c 128 } else if (config->adcChannel == ADC_CH2) {
coisme 1:bc877c37027c 129 val |= 0x20;
coisme 1:bc877c37027c 130 } else if (config->adcChannel == ADC_CH3) {
coisme 1:bc877c37027c 131 val |= 0x40;
coisme 1:bc877c37027c 132 } else { // config->adcChannel == ADC_CH4
coisme 1:bc877c37027c 133 val |= 0x60;
coisme 1:bc877c37027c 134 }
coisme 1:bc877c37027c 135
coisme 1:bc877c37027c 136 // Conversion Mode
coisme 1:bc877c37027c 137 if (config->conversionMode == CONTINUOUS) {
coisme 1:bc877c37027c 138 val |= 0x10;
coisme 1:bc877c37027c 139 } else if (config->conversionMode == ONE_SHOT) {
coisme 1:bc877c37027c 140 val |= 0x00;
coisme 1:bc877c37027c 141 }
coisme 1:bc877c37027c 142
coisme 1:bc877c37027c 143 // Sample Rate
coisme 1:bc877c37027c 144 if (config->sampleSetting == SAMPLE_240HZ_12BIT) {
coisme 1:bc877c37027c 145 val |= 0x00;
coisme 1:bc877c37027c 146 } else if (config->sampleSetting == SAMPLE_60HZ_14BIT) {
coisme 1:bc877c37027c 147 val |= 0x04;
coisme 1:bc877c37027c 148 } else { //config->sampleSetting == SAMPLE_15HZ_16BIT
coisme 1:bc877c37027c 149 val |= 0x08;
coisme 1:bc877c37027c 150 }
coisme 1:bc877c37027c 151
coisme 1:bc877c37027c 152 // PGA Gain Selection
coisme 1:bc877c37027c 153 if (config->pgaSetting == PGA_1X) {
coisme 1:bc877c37027c 154 val |= 0x00;
coisme 1:bc877c37027c 155 } else if (config->pgaSetting == PGA_2X) {
coisme 1:bc877c37027c 156 val |= 0x01;
coisme 1:bc877c37027c 157 } else if (config->pgaSetting == PGA_4X) {
coisme 1:bc877c37027c 158 val |= 0x02;
coisme 1:bc877c37027c 159 } else { // config->pgaSetting == PGA_8X) {
coisme 1:bc877c37027c 160 val |= 0x03;
coisme 1:bc877c37027c 161 }
coisme 1:bc877c37027c 162
coisme 1:bc877c37027c 163 // Write to the device.
coisme 1:bc877c37027c 164 if (connection->write((slaveAddress << 1), &val, LEN_ONE_BYTE) != 0) {
coisme 1:bc877c37027c 165 return ERROR_I2C_WRITE;
coisme 1:bc877c37027c 166 }
coisme 1:bc877c37027c 167
coisme 1:bc877c37027c 168 return SUCCESS;
coisme 1:bc877c37027c 169 }
coisme 1:bc877c37027c 170
coisme 1:bc877c37027c 171
coisme 1:bc877c37027c 172 MCP342X::Status MCP342X::setChannel(AdcChannel ch) {
coisme 1:bc877c37027c 173 currentConfig.adcChannel = ch;
coisme 1:bc877c37027c 174 return setConfig(&currentConfig);
coisme 1:bc877c37027c 175 }
coisme 1:bc877c37027c 176
coisme 1:bc877c37027c 177 MCP342X::AdcChannel MCP342X::getChannel() {
coisme 1:bc877c37027c 178 return currentConfig.adcChannel;
coisme 1:bc877c37027c 179 }
coisme 1:bc877c37027c 180
coisme 1:bc877c37027c 181 MCP342X::Status MCP342X::setConversionMode(ConversionMode mode) {
coisme 1:bc877c37027c 182 currentConfig.conversionMode = mode;
coisme 1:bc877c37027c 183 return setConfig(&currentConfig);
coisme 1:bc877c37027c 184 }
coisme 1:bc877c37027c 185
coisme 1:bc877c37027c 186 MCP342X::ConversionMode MCP342X::getConversionMode() {
coisme 1:bc877c37027c 187 return currentConfig.conversionMode;
coisme 1:bc877c37027c 188 }
coisme 1:bc877c37027c 189
coisme 1:bc877c37027c 190 MCP342X::Status MCP342X::setSampleSetting(SampleSetting s) {
coisme 1:bc877c37027c 191 currentConfig.sampleSetting = s;
coisme 1:bc877c37027c 192 return setConfig(&currentConfig);
coisme 1:bc877c37027c 193 }
coisme 1:bc877c37027c 194
coisme 1:bc877c37027c 195 MCP342X::SampleSetting MCP342X::getSampleSetting() {
coisme 1:bc877c37027c 196 return currentConfig.sampleSetting;
coisme 1:bc877c37027c 197 }
coisme 1:bc877c37027c 198
coisme 1:bc877c37027c 199 MCP342X::Status MCP342X::setPgaSetting(PgaSetting s) {
coisme 1:bc877c37027c 200 currentConfig.pgaSetting = s;
coisme 1:bc877c37027c 201 return setConfig(&currentConfig);
coisme 1:bc877c37027c 202 }
coisme 1:bc877c37027c 203
coisme 1:bc877c37027c 204 MCP342X::PgaSetting MCP342X::getPgaSetting() {
coisme 1:bc877c37027c 205 return currentConfig.pgaSetting;
coisme 1:bc877c37027c 206 }
coisme 1:bc877c37027c 207
coisme 1:bc877c37027c 208 MCP342X::Status MCP342X::getData(Data *pt) {
coisme 1:bc877c37027c 209 Status status;
coisme 1:bc877c37027c 210
coisme 1:bc877c37027c 211 int16_t val = 0;
coisme 1:bc877c37027c 212 if ((status=readData(&val, &currentConfig)) != SUCCESS) {
coisme 1:bc877c37027c 213 return status;
coisme 1:bc877c37027c 214 }
coisme 1:bc877c37027c 215
coisme 1:bc877c37027c 216 pt->st = currentConfig.dataStatus;
coisme 1:bc877c37027c 217 pt->value = val;
coisme 1:bc877c37027c 218
coisme 1:bc877c37027c 219 return status;
coisme 1:bc877c37027c 220 }
coisme 1:bc877c37027c 221
coisme 1:bc877c37027c 222 MCP342X::Status MCP342X::trigger(){
coisme 1:bc877c37027c 223 Status status;
coisme 1:bc877c37027c 224
coisme 1:bc877c37027c 225 currentConfig.measurementTrigger = TRIGGER;
coisme 1:bc877c37027c 226 status = setConfig(&currentConfig);
coisme 1:bc877c37027c 227 currentConfig.measurementTrigger = NONE;
coisme 1:bc877c37027c 228
coisme 1:bc877c37027c 229 return status;
coisme 2:96d9bfe25b03 230 }
coisme 2:96d9bfe25b03 231