12 Bit ADC and DAC I2C Protocol

Im trying to create a project that takes in a 3.5 mm jack/ and or mic input to A0 coverts it through ADC and outputs it on the audrino pins of the DAC. I have already created a preamp that takes in a mic into A0 as well as a 3.5 jack.

Furthermore Ive created a R2R resistor ladder with a low pass filter, power amplifier, and output. I know the R2R ladder can be low quality. Ive inserted an image of my dac circuit below. Using timer function I was able to send a live audio output however the sound quality was
really bad. So i thought I can get an external DAC and ADC to increase better quality.

I just got a MCP4725 which is an external 12 bit DAC with I2C interface. Also a
adafruit ADS1015 12 bit ADC with I2C interface. I goal is to get better sound quality by using external ADC and DAC. Any suggestions on how to I2C serial protocol. I know there is a library however I want to go into register programming? Moreover would it be okay using the 8 bit built in ADC and a 12 bit DAC or will these cause problems?

Heres the code I was working on with the DAC taking in AnologRead(A0), however the output isnt produced. Is there any problem with my code?

#define Address_Value 0x60
// MCP4725A0 address is 0x60 or 0x61
// MCP4725A1 address is 0x62 or 0x63
// MCP4725A2 address is 0x64 or 0x65
// MCP4725A3 address is 0x66 or 0x67

void I2CInitFunction(void){
    TWSR = 0x00; // No needed presclaer 
    TWBR = 0x0C; // 400 Hz
    //enable TWI
    TWCR = (1<<TWEN);

void I2CWhileCompleteFunction(void){
    // loops until TWCR and TWINT is Set
    while ((TWCR & (1<<TWINT)) == 0);

void I2CStartFunction(void){
    // TWSTA set 1 transmit start condition
    // TWINT set 1 to clear TWINT Flag 
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

void I2CStopFunction(void){
    // Last byte has been sent and trasnfer is ended
    // Can use Stop condition or a Repeated Start Condition 
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);

void I2CSendValueFunction(uint8_t val){
    // In order to enter MT mode, SLA+W must betransmitted. 
    // This is done by writing SLA+W to TWDR
    // Thereafter the TWINT bit should be cleared (by writing it to one) to continue the transfer.
    // When SLA+W has been successfully transmitted, a data packet should be transmitted
    // This isdone by writing the data byte to TWDR. 
    // TWDR must only be written when TWINT is high. If not,the access will be discarded 
    TWDR = val;
    TWCR = (1<<TWINT)|(1<<TWEN);

int sensorValue = 0;

void setup() {
  // Initlazies I2C

void loop() {
  sensorValue = analogRead(A0);
  // Read to Transmit
  // Sends with #define adress value
  // Dac Register ( c0 = 1, c1 = 1, c2 = 0)

good for you for trying to create you own I2C function but since you are having probs why just not try the built in wire.h lib and see it if works.

example here: MCP4725 Digital to Analog Converter Hookup Guide - learn.sparkfun.com

also are your sure the address is correct. you can check using the I2C scanner (Arduino Playground - I2cScanner)

"Moreover would it be okay using the 8 bit built in ADC and a 12 bit DAC or will these cause problems?"

not 8 but 10 bit ADC on UNO for example

tip: how many levels does a 10 bit and 12 bit have? that should answer your question!