I can't see your data pins between the MCU and ADC which limits my ability to respond, but I do see a few problems. First, you need 10 Ohms between VA+ and VD+, not 10k Ohms. Vref+ and VA+ need to be connected to the supply voltage, but that connection seems to be missing. If you measure voltage on those pins do you see 5V?
Can you provide any information on register setup and how you're triggering the conversion?
A0 and A1 outputs are configurable, but the most common use case is to indicate which analog channel is being converted probably for signal conditioning reasons.
Typically you when interfacing devices through I2C or other IC level buses, you will transfer a word of information out of your device, like 8 bits at a time but the payload may vary between protocols (usually a defined protocol word or word range). So to see how your 8bit MCU will work with your 12 bit DAC, first look at the internal data structure of the ADC Output.
You can see that this is a padded 16 bit number and can neatly be stored in two bytes/words using your MCU. In c, this number would transparently be read as a u_int16
or equivalent definition for your platform. Moreover, if you program in C, multi-word data structures are handled transparently, processing and mathematical operations would be slower, but you would be able to safely store a 24bit ADC in a u_int32
and the compiler will handle the word level details for you.
Now when it comes to transfer protocol , I2C is a serial transfer protocol and you can chomp the data on MCU side however you wish (even with a 7 bit mcu if you had such a beast) , but the bus neatly divides the data for you by insisting on an ACK after every 8 bits.
Let's look at the I2C signaling for your ADC.
You can see that all communications are neatly split into 8 bit sections, writing command words, writing registers, reading data, etc. If you were bitbanging this protocol on your MCU in assembly, you would be able to easily work with your word level operations without too much headache. In C this would be done transparently by the compiler.
Your MCU is smart and will handle a lot of bus level details for for you. You can perform I2C transactions using a few control registers on your MCU without dealing with timing details like shown above. For the datasheet you linked (Atmega 48/88/168) the relevant chapter is Chapter 21 (Two-Wire Interface). A high level diagram of I2C communications using your MCU is shown in the following figure.
The benefit of using the integrated I2C is that you save a lot of program space and clock cycles that would be spent bit banging I2C in your code.
Best Answer
You obviously can't use a 9-bit-wide memory as 12-bits. All you need is to get TWO 9-bit memory chips per channel, one manages the lower 9 bits, and the other IC uses only 3 upper bits, leaving the other 6 unconnected.
The IDT7203 datasheet shows clearly how to expand the bus to N bits wide, see Figure 15.