General usable MCP4728 quad DAC implementation only limited function has to be used together with the DevInterface lib

Dependents:   mbedSerialInterface_talkback2 MCP4728test mbedSerialInterface_sequencer

mcp4728.h

Committer:
wbeaumont
Date:
2015-10-23
Revision:
0:7a0ebc527fb9
Child:
1:cd7c70a46739

File content as of revision 0:7a0ebc527fb9:

#ifndef MCP_4728_H
#define MCP_4728_H


#include "stdbool.h"

#include "dev_interface_def.h"
#include "I2CInterface.h" 
#include "DACInterface.h" 

#define VERSION_MCP4728_HDR "0.01"

/** MCP4728 class.
 *  Used for interfacing with a mcp4728 12-Bit QUAD  Digital-to-Analog Converter.
 *  To convert between the 12bit dac_value and Vout, use the following formula: dac_value = (Vout*4096/Vref), where Vout is  
 *  the desired output analog voltage, Vref is the voltage connected to the Vdd pin of the device. Typically Vdd will be 3.3volts.
 *
 * (C) Wim Beaumont Universiteit Antwerpen 2015        
 *  
 */
class MCP4728 : public DACInterface
{
    float vref ;
    
    
    public:
    /** The device supports two types of power modes: normal and power-down. In normal mode the device
     * operates a normal digital to analog conversion. In power-down mode all digitial to analog  
     * conversion is stopped, resulting in the device using less power (typically 60nA). Also, in power 
     * down mode Vout will be pulled to ground using either a 1k, 100k or 500k ohm internal resistors. */
    enum PowerMode {
        /** In normal mode the device operates a normal D2A conversion. */
        Normal=0,
        /** Enter the device into a power down mode, and pull Vout to ground using an internal 1k resistor. */
        PowerDown1k=1,
        /** Enter the device into a power down mode, and pull Vout to ground using an internal 100k resistor. */
        PowerDown100k=2,
        /** Enter the device into a power down mode, and pull Vout to ground using an internal 500k resistor. */
        PowerDown500k=3
    };
    
    
    
    enum VrefMode {
        ExternRef=0,  // == VDD 
        InternRef=1
        
    };
    
    
    enum GainMode {
        GainX1=0,
        GainX2=1
    };
    
    typedef struct MCP4728ChCfg{
         GainMode gain;
         VrefMode  vref;
         PowerMode pwr;
    } MCP4728ChCfgdummy;
    
    MCP4728ChCfg ChCfg[4];
        
    
    /** The device supports 3 different I2C bus frequencies.*/
    enum BusFrequency {
        /** Standard 100kHz bus. */
        Standard100kHz,
        /** Fast 400kHz bus. */
        Fast400kHz,
        /** High Speed 3.4Mhz bus. WARNING: the test suite fails for the mbed LPC1768 when this frequency is selected - not tested on other platforms.*/
        HighSpeed3_4Mhz
    };
    
    /** Create an mcp4725 I2C interface
     * 
     * @param i2cinterface pointer to the  MBED I2C interface 
     * @param scl I2C clock line pin
     * @param bus_frequency the frequency at which the I2C bus is running.
     * @param device_address_bits The 3bit address bits of the device.
     */
    MCP4728(I2CInterface* i2cinterface,  int device_address_bits);
    
    
    /* Update the power mode and DAC value.
     *
     * @param   mode The Power mode to set the device into.
     * @param   dac_value The 12bit dac register data value.
     * @param   writeToEeprom True if the config is to be stored 
     *          in eeprom, otherwise false
     * 
     * @returns 
     *       0 on success,
     *   non-0 on failure
     */
    int write(enum PowerMode mode, int dac_value, bool writeToEeprom);
    
        
    /** Read the contents of the dac register, the contents of eeprom, and if an eeprom write is currently active.
     * 
     * @param   mode Pointer to variable to store the current power mode.
     * @param   mode_eeprom Pointer to variable to store the power mode as is stored in eeprom.
     * @param   dac_value Pointer to variable to store the current dac value.
     * @param   dac_value_eeprom Pointer to variable to store the dac value as is stored in eeprom.
     * @param   eeprom_write_in_progress Pointer to variable to store the current eeprom write status.
     *
     * @returns 
     *       0 on success,
     *   non-0 on failure
     */
    int read(enum PowerMode& mode, enum PowerMode& mode_eeprom, int& dac_value, int& dac_value_eeprom, bool& eeprom_write_in_progress);
    
    virtual int getDACvalue(int &value, int ch=0);
    virtual int setDACvalue( int value, int ch=0);
    protected:
    /** mbed I2C interface driver. */
    I2CInterface* _i2c_interface;
    /** The full i2c device address. */
    int _device_address;
    
};

#endif