MCP4725
Dependents: Cube_Mini_Template
Diff: mcp4725.cpp
- Revision:
- 0:3214e3bbf25c
- Child:
- 5:3e6ffce1eea2
diff -r 000000000000 -r 3214e3bbf25c mcp4725.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcp4725.cpp Sun Oct 27 13:49:35 2013 +0000 @@ -0,0 +1,80 @@ +#include "mcp4725.h" +#include "mbed.h" + +MCP4725::MCP4725(PinName sda, PinName scl, BusFrequency bus_frequency, int device_address_bits) +{ + _i2c_interface = new I2C(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); +} \ No newline at end of file