We are using eight TLV320AIC3104 audio codecs connect to an OMAP-L138 for DSP. Our application is phase sensitive, and we have found that there is a small random phase shift between codecs that takes on discrete values at multiples of 1 master clock cycle. Phase difference observed so far is between 0 and 7 clock cycles. Each codec has dedicated DIN/DOUT to DSP, not multiplexed.
The phase shift occurs whenever a soft-reset is triggered by writing to page 0 / register 1. It also occurs at hardware reset even if soft reset it not commanded through register 1.
We would like to know if there is anything that can be done to get the codecs exactly synchronized?
Start up sequence is:
- power on
- setup gpio/clock on DSP
- hardware reset of codecs
- soft reset of all codecs
- write register values of all codecs
Register writes (in order) are:
- reg 0: 0x00 (select page 0)
- reg 1: 0x80 (soft reset)
- reg 3: 0x20 (Q=4 for CLKIN)
- reg 101: 0x01 (use CLKIN not PLL)
- reg 8: 0x00 (BCLK and WCLK are slave)
- reg 9: 0xF6 (LJ, 32-bit, ADC/DAC resync ON)
- reg 7: 0x6A (48khz, dual rate)
- reg 21: 0xF8 (LINE1RP control)
- reg 24: 0xF8 (LINE1LP control
- reg 26: 0x00 (agc off)
- reg 27: 0x00 (gain max)
- reg 29: 0x00 (agc off)
- reg 30: 0x00 (gain max)
- reg 40: 0x82 (cmv=1.65V, no soft stepping)
- reg 41: 0x50 (dac output path)
- reg 82: 0x80 (dac left route)
- reg 92: 0x80 (dac right route)
- reg 86: 0x08 (left output level)
- reg 93: 0x08 (right output level)
- reg 19: 0x87 (left ADC power ON)
- reg 22: 0x87 (right ADC power ON)
- reg 37: 0xC0 (left & right DAC power ON)
- reg 15: 0x00 (left ADC unmute)
- reg 16: 0x00 (right ADC unmute)
- reg 43: 0x00 (left DAC unmute)
- reg 44: 0x00 (right DAC unmute)
Register writes are accomplished over an I2C mux broadcasting to all codecs simultaneously, so the soft reset should occur at the same time.
We have tried many things that have not impacted the problem:
- adjust various wait/delays between I2C write steps
- write to codecs individually or broadcast simultaneously
- configure GPIO DIN/DOUT ports in a specific order
- check hardware reset line if it is actually pulled low/high (it is)
- write register to turn on ADC/DAC earlier or later
- write register to configure CLKIN earlier or later
- ADC/DAC resync flag ON or OFF