Library for controlling an MCP4725 "12-Bit Digital-to-Analog Converter with EEPROM Memory". There is an accompanying test suite program "MCP_4725_Library_Test" that can be used to test this library.

Dependents:   IGGE_Power MCP4725_Library_Test MCP4725 SinWave ... more

mcp4725.cpp

Committer:
donalm
Date:
2013-11-07
Revision:
5:3e6ffce1eea2
Parent:
0:3214e3bbf25c

File content as of revision 5:3e6ffce1eea2:

#include "mcp4725.h"
#include "mbed.h"

MCP4725::MCP4725(PinName sda, PinName scl, BusFrequency bus_frequency, int device_address_bits): _i2c_interface(sda, scl)
{
    //Set the frequency
    int freq=0;
    switch(bus_frequency)
    {
        case Standard100kHz:
            freq = 100000;
            break;
        case Fast400kHz:
            freq = 400000;
            break;
        case HighSpeed3_4Mhz:
            freq = 3400000;
            break;
    }
    _i2c_interface.frequency(freq);
    
    // Assemble the full I2C device address.
    _device_address = 0xC0; // Prime the full device address with the device code.
    _device_address |= (device_address_bits<<1);
}

int MCP4725::read(enum PowerMode* mode, enum PowerMode* mode_eeprom, int* dac_value, int* dac_value_eeprom, bool* eeprom_write_in_progress)
{
    char data[5];
    int result;
    
    // Read the raw data from the device.
    result = _i2c_interface.read(_device_address, data, sizeof(data)/sizeof(*data), false);
    
    // Parse the raw data, extracting our fields. Refer to MCP4725 ref manual, section 6.2
    if (result == 0)
    {
        *eeprom_write_in_progress = (data[0] & 0x80)? false:true;
        
        *mode = (enum PowerMode) ((data[0] & 0x06)>>1);
        
        *dac_value  = (data[1]<<4) + (data[2]>>4);
        
        *mode_eeprom = (enum PowerMode)((data[3] & 0x60)>>5);
        
        *dac_value_eeprom = ((data[3] & 0x0F) <<8) + data[4];
    }
     
    return result;
}



int MCP4725::write(enum PowerMode mode, int dac_value, bool writeToEeprom)
{
    char data[3]={0};
    int write_command;
    
    //Which write command are we to use?
    if (writeToEeprom == true)
    {
        //Write DAC Register and EEPROM
        write_command = 3;
    }
    else
    {
        //Write DAC Register
        write_command = 2;
    }
    
    //Assemble our three bytes of data - Refer to MCP4725 ref manual, section 6.
    data[0] = (write_command <<5) | ((int)mode<<1);
    data[1] = (dac_value>>4);
    data[2] = (dac_value<<4);
    
    // Now write them to the device.
    return _i2c_interface.write(_device_address, data, sizeof(data)/sizeof(*data), false);
}