Device driver for AD converters MCP3426, MCP3427, and MCP3428.
Diff: mcp342x.h
- Revision:
- 0:78c512aa4d18
- Child:
- 1:bc877c37027c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcp342x.h Fri Apr 29 16:38:37 2016 +0000 @@ -0,0 +1,202 @@ +#ifndef __MCP342X_H__ +#define __MCP342X_H__ + +#include "mbed.h" + +class MCP342X +{ +public: + /** + * Slave addresses. + */ + typedef enum { + SLAVE_ADDRESS_68H, /**< When Adr0 pin = L and Adr1 pin = L, or Adr0 pin = float and Adr1 pin = float. */ + SLAVE_ADDRESS_69H, /**< When Adr0 pin = L and Adr1 pin = float. */ + SLAVE_ADDRESS_6AH, /**< When Adr0 pin = L and Adr1 pin = H. */ + SLAVE_ADDRESS_6CH, /**< When Adr0 pin = H and Adr1 pin = L. */ + SLAVE_ADDRESS_6DH, /**< When Adr0 pin = H and Adr1 pin = float. */ + SLAVE_ADDRESS_6EH, /**< When Adr0 pin = H and Adr1 pin = H. */ + SLAVE_ADDRESS_6BH, /**< When Adr0 pin = float and Adr1 pin = L. */ + SLAVE_ADDRESS_6FH, /**< When Adr0 pin = float and Adr1 pin = H. */ + } SlaveAddress; + + /** + * Status of function. + */ + typedef enum { + SUCCESS, /**< The function processed successfully. */ + ERROR_I2C_READ, /**< Error related to I2C read. */ + ERROR_I2C_WRITE, /**< Error related to I2C write. */ + ERROR, /**< General Error */ + } Status; + + /** + * Conversion mode setting. + */ + typedef enum { + CONTINUOUS, /**< Continuous conversion mode. Default. */ + ONE_SHOT, /**< One-shot conversion mode. */ + } ConversionMode; + + /** + * Data ready status. + */ + typedef enum { + DATA_NOT_UPDATED, /**< Output register has not been updated. */ + DATA_UPDATED, /**< Output register has been updated with the latest conversion result. */ + } DataStatus; + + /** + * Measurement trigger command. + */ + typedef enum { + TRIGGER, /**< Initiate a new conversion. */ + NONE, /**< No effect. */ + } MeasurementTrigger; + + /** + * Sample rate and resolution setting. + */ + typedef enum { + SAMPLE_240HZ_12BIT, /**< 240 sample per second with 12 bit data. Default. */ + SAMPLE_60HZ_14BIT, /**< 60 sample per second with 14 bit data. */ + SAMPLE_15HZ_16BIT, /**< 15 sample per second with 16 bit data. */ + } SampleSetting; + + + /** + * ADC channel selection. + */ + typedef enum { + ADC_CH1, /**< Channel 1, default. */ + ADC_CH2, /**< Channel 2 */ + ADC_CH3, /**< Channel 3, MCP3428 only, treated as channel 1 by the MCP3426/MCP3427. */ + ADC_CH4, /**< Channel 4, MCP3428 only, treated as channel 2 by the MCP3426/MCP3427. */ + } AdcChannel; + + /** + * Programmable Gain Amplifier setting. + */ + typedef enum { + PGA_1X, /**< Gain 1x, Default. */ + PGA_2X, /**< Gain 2x. */ + PGA_4X, /**< Gain 4x. */ + PGA_8X, /**< Gain 8x. */ + } PgaSetting; + + /** + * Constructor. + * + * @param conn instance of I2C + * @param addr slave address of the device + */ + MCP342X(I2C *conn, SlaveAddress addr); + + /** + * Sets a ADC channel. + * @param ch ADC channel which to be the input. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status setChannel(AdcChannel ch); + + /** + * Gets the current selected ADC channel. + * @return ADC channel currently set. + */ + AdcChannel getChannel(); + + /** + * Sets a conversion mode. + * @param mode Conversion mode which to be set. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status setConversionMode(ConversionMode mode); + + /** + * Gets the current conversion mode. + * @return Current conversion mode. + */ + ConversionMode getConversionMode(); + + /** + * Sets sample setting. + * @param s Sample setting to be set. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status setSampleSetting(SampleSetting s); + + /** + * Gets the current sample setting. + * @return Current sample setting. + */ + SampleSetting getSampleSetting(); + + /** + * Sets gain of Programmable Gain Amplifier (PGA). + * @param s PGA seeting to be set. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status setPgaSetting(PgaSetting s); + + /** + * Gets the current PGA setting. + * @return Current PGA setting. + */ + PgaSetting getPgaSetting(); + + /** + * Checks availability of new data. + * @return Returns true if new data is available. Returns false if no new data is available. + */ + bool isNewDataAvailable(); + + /** + * Gets the AD value. + * @return AD value. + */ + int16_t getValue(); + + /** + * Trigger AD conversion. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status trigger(); + + /** + * Gets the data conversion time. + * @return Conversion time based on the current sample setting in milli-second unit. + */ + float getDataConversionTime(); + +private: + typedef struct { + DataStatus dataStatus; + ConversionMode conversionMode; + SampleSetting sampleSetting; + AdcChannel adcChannel; + PGASetting pgaSetting; + } Config; + + + I2C *connection; /**< Pointer to an I2C object. */ + uint8_t slaveAddress; /**< Slave address. */ + uint8_t dataBuffer[3]; /**< Data buffer including configuration register. */ + uint8_t Config config; /**< Stores the latest configuration. */ + + /** + * Reads the data registers including the configuration register. + * @param val Pointer to the buffer which stores ADC value. + * @param currentConfig Pointer to the structure which stores the current configuration. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status readData(int16_t *val, Config *currentConfig); + + /** + * Sets the configuration register. + * @param Configuration to be set. + * @return SUCCESS when succeeded. Other value will be returned when error. + */ + Status setConfig(const Config *config); +}; + +#endif