Driver for the Microchip MCP432x series of ADCs.
Fork of MCP342x by
mcp342x.cpp@9:9e70e215d39a, 2018-08-09 (annotated)
- 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?
User | Revision | Line number | New 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, ¤tConfig)) != 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(¤tConfig); |
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(¤tConfig); |
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(¤tConfig); |
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(¤tConfig); |
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, ¤tConfig)) != 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(¤tConfig); |
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 |