IMPLEMENTED SO FAR

- Support for 4x20 LCD Display and large number display
- Brightness and contrast adjustment with remote
- (OPUS/Wolfson WM8741) DAC volume control: remote and rotary encoder
- (OPUS/Wolfson WM8741) DAC random filter selection 1 to 5 with remote
- (OPUS/Wolfson WM8741) DAC upsampling selection (L, M, H -this is the OSR setting)
- I2C level shifting (5V to 3.3V)
- Optimized power-up sequence

Wednesday, February 17, 2010

Programming Buffalo II DAC: I2C Isolation

As extreme care has been afforded to reduce noise on Buffalo II, perhaps it would be also prudent to implement the I2C isolation solution to prevent any noise sneaking through an external microprocessor such as Arduino on the I2C lines.

Note: a reader alerted me that the on-board microprocessor goes to sleep after setting up the registers of the DAC. In such case, there should be no additional noise from the on-board microprocessor. However, when the microprocessor is sleeping, only an interrupt can wake it up. If one uses the Arduino as the external microprocessor, some of the code may not be interrupt based, for example polling IR remote signals. So, if the microprocessor is doing more than just setting up the registers at power-on, in general it is not a good idea to put the microprocessor to sleep. Therefore some isolation in the i2c lines would be a welcomed noise avoidance implementation.

Analog Devices magnetic coupling devices has a solution for this task: The ADum1250. Previous observations here indicate that this is the best solution.
The ADuM1250/ADuM12511 are hot swappable digital isolators with nonlatching, bidirectional communication channels compatible with I2C® interfaces. This eliminates the need for splitting I2C signals into separate transmit and receive signals for use with standalone optocouplers.
The ADuM1250 provides two bidirectional channels, supporting a complete isolated I2C interface. The ADuM1251 provides one bidirectional channel and one unidirectional channel for those applications where a bidirectional clock is not required.
Both the ADuM1250 and ADuM1251 contain hot swap circuitry to prevent glitching data when an unpowered card is inserted onto an active bus.
The application note indicates that side 1 (left) should be used for the device (the DAC) and side 2 for the I2C bus (Arduino)












The pull up resistors on side 2 (right side) in the diagram are already implemented in Arduino (inside the uP and enabled in software).


The pull-up resistors on side 1 (left side) I believe are already implemented in Buffalo II as R14 and R15? -Need to confirm with the designers.
 



6 comments:

RossL said...

In order for this to have any positive effect at all, the ground plane and power supply for the processor would be seperate from the ESS Sabre's ground and power. This would require a seperate board. and wires for the I2C bus.

It's probably unnecessary. When you are playing music, the PIC processor is sleeping.

Russ posted the code for his Buffalo 1 a long time ago. When the processor isn't actively doing something such as booting up or configuring the Sabre, the processor goes to sleep.

Sleep mode in a PIC processor is low power and quiet. It's not clocking the I2C bus during normal operation.

Anonymous said...

RossL,

Thanks for the comment. Yes, one side will be powered by Buffalo and the other side powered by the Arduino board.

Interesting about sleeping. In the Arduino environment (since i only know Arduino), the Atmel processor is always in a loop waiting for "events" to happen like an interrupt change in state in an I/O pin. I'll have to research "sleep mode" in Arduino and see how that works. "main" in Arduino is a loop.

Russ said...

Because the uC does not actually drive anything (except to GND), it is actually very quiet even when communicating. this is because the I2C lines are only weakly pulled up via fairly high resistors. there is not much current moving around. :)

This is not speculation. It has been tested. :)

The Lazy Engineer said...

Are you Russ from TPA? Thanks for the tip. I don't have test gear to measure, but given the fact that there is a 16 MHz clock running in the uP, and the oscillator in Buff is of the lowest phase noise possible, spending a few $ on a chip that has been designed as an I2C isolator was at least a reasonable (engineering) idea :-)

Russ said...

It is indeed the same Russ. :)

I understand your very valid motivation, and for an external controller such as yours it may be prudent.

My key point is simply that I have designed and tested the supplies on the BUF-II for isolation from each other using inductors(ferrites) and caps and careful routing.

I don't think your likely to find controller noise polluting the clock supplies.

Still what you are doing can't hurt a bit.

Cheers!
Russ

The Lazy Engineer said...

Oh, appreciate you taking time to comment in this blog. I'm sure Arduino was not designed for low noise. Low cost and wide availability was the main motivation.