I was able to change the address of the chip. In case that any one needs to do this I have included the little program that I made. I'm sure that there are many things that can be changed to make it more efficient but I only needed to do this once and this "brute" force approach suited me.
/*
* MPC4728_address_changer.cpp
*
* Created: 5/27/2017 10:42:53 AM
* Author : Daniel Kolbach
* This program changes the address to the DAC chip MPC4728.
* The specs for the chip indicate that you need to control the LDAC pin at a very specific point
* during the sequence of commands sent to the chip via I2C.
* Refer to page 42 of the chip in question
* Disclaimer: This software is provided with no implicit or explicit warranties.
*/
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= (1<<PORTB4)|(1<<PORTB1)|(1<<PORTB0); // Using Arduino Uno, port 8 (PB0) SCL, port 9 (PB1) SDA, port 12 (PB4) LDAC
PORTB |=(1<<PORTB4)|(1<<PORTB1)|(1<<PORTB0);
uint8_t command[4][8]={ 1,1,0,0, 0,0,0,0, // Initial address is 0x60 (0xC0 with the write bit added
0,1,1,0, 0,0,0,1,
0,1,1,0, 0,1,1,0, // Address changed to 0x61
0,1,1,0, 0,1,1,1};
PORTB &= ~(1<<PORTB1); // Sending the start condition for the I2C bus
_delay_us(1.5);
PORTB &= ~(1<<PORTB0);
_delay_us(1.5);
for (int x=0; x<4; x++) // Repeat this for each of the commands.
{
for (int y=0; y<8; y++)
{
if(command[x][y] == 1) PORTB |= (1<<PORTB1); // Check from the command table if high or low needs to be written to SDA
else PORTB &= ~(1<<PORTB1);
_delay_us(0.5);
PORTB |= (1<<PORTB0); // Send the clock pulse
_delay_us(1.3);
PORTB &= ~(1<<PORTB0);
}
DDRB &= ~(1<<PORTB1); // Change SDA to input to check for the answer from the chip
if(x==1) PORTB &= ~(1<<PORTB4); // LDAC needs to be pulled down before the 9th clock pulse only on the second command
if(x==3) PORTB |= (1<<PORTB4); // LDCA needs to be pulled up before the 9th clock pulse only on the 4th command
_delay_us(0.5);
PORTB |= (1<<PORTB0); // Sending the 9th clock pulse
_delay_us(1.5);
PORTB &= ~(1<<PORTB0);
_delay_us(0.3);
DDRB |= (1<<PORTB1); // Returning the SDA line back to output
PORTB |= (1<<PORTB1);
_delay_us (1.7);
}
PORTB &= ~((1<<PORTB0)|(1<<PORTB1)); // Sending the stop signal
_delay_us(1.5);
PORTB |= (1<<PORTB0);
_delay_us(1.5);
PORTB |= (1<<PORTB1);
while (1)
{
}
}