This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TAC5212: TAC5212 High-performance stereo audio codec with 119dB dynamic range ADC and 120dB dynamic range DAC

Part Number: TAC5212


Tool/software:

Application Note – TAC5212 Audio Codec Configuration

In my project, i have used separate IP cores for the I²S transmitter and receiver. Due to this separation, it is necessary to configure two distinct I²S audio serial interfaces within the TAC5212 — referred to as the primary and secondary audio serial interfaces.

  • The primary audio serial interface is used for the I²S receiver and is connected as follows:

    • BCLK

    • FSYNC

    • DOUT

  • The secondary audio serial interface is used for the I²S transmitter, with the following signal mapping:

    • GPIO1 → FSYNC

    • GPIO2 → BCLK

    • GPI1 → DIN 

The primary interface handles ADC input, while the secondary interface is responsible for DAC output.

All necessary register configurations for this setup have been implemented as specified below. However, during testing, it was observed that the DOUT signal remains at zero. When only the primary interface (receiver) is active, the system functions correctly. The issue arises only when both the I²S transmitter and receiver are integrated — in this case, the output does not behave as expected.

while reading I2C register  : Register (Address = 0x79) [Reset = 0x00] both ADC and DAC are in power down state .

I have checked the hardware setup and pin assignment everything is in correct state.

I2C Register configuration which i have done 

page 0 configuration

write_reg_addrs = 8'h00 ; write_reg_data = 8'h00 ; // page.
write_reg_addrs = 8'h01 ; write_reg_data = 8'h00 ; // reset
write_reg_addrs = 8'h00 ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h02 ; write_reg_data = 8'h09 ; // default
write_reg_addrs = 8'h03 ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h04 ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h05 ; write_reg_data = 8'h15 ; // default
write_reg_addrs = 8'h06 ; write_reg_data = 8'h35 ; // default
write_reg_addrs = 8'h07 ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h0A ; write_reg_data = 8'hA2 ; // gpio 1 --> sec fsync
write_reg_addrs = 8'h0B ; write_reg_data = 8'h92 ; // gpio 2 --> sec blck
write_reg_addrs = 8'h0C ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h0D ; write_reg_data = 8'h02 ; // gpi 1 --> sec sdi
write_reg_addrs = 8'h0E ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h0F ; write_reg_data = 8'h00 ; // default
write_reg_addrs = 8'h10 ; write_reg_data = 8'h52 ; // ------------>DOUT is configured as ASI DOUT
write_reg_addrs = 8'h11 ; write_reg_data = 8'h14 ; //*14 DEFAUL ----->Primary ASI DIN is disable , sec fsync = gpio 1, sec blck = gpio 2
write_reg_addrs = 8'h12 ; write_reg_data = 8'h60 ; //*60 ----------> sec din in gpi 1
write_reg_addrs = 8'h13 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h14 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h15 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h18 ; write_reg_data = 8'h00 ; //*20 --------> both pri and sec asi enable and sec asi have independent configuration
write_reg_addrs = 8'h19 ; write_reg_data = 8'h00 ; // DEFAULT -
write_reg_addrs = 8'h1A ; write_reg_data = 8'h80 ; // --------------------> 12s mode and 16bit data NEED TO CONFIGURE
write_reg_addrs = 8'h1B ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h1C ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h1D ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h1E ; write_reg_data = 8'h20 ; // Primary ASI channel 1 output is in a adc ch1 data condition and 12s left slot 0 // NEED TO CONFIGURE
write_reg_addrs = 8'h1F ; write_reg_data = 8'h30 ; // Primary ASI channel 2 output is in a adc ch2 data condition and 12s right slot 0 // NEED TO CONFIGURE
write_reg_addrs = 8'h20 ; write_reg_data = 8'h02 ; // DEFAULT
write_reg_addrs = 8'h21 ; write_reg_data = 8'h03 ; // DEFAULT
write_reg_addrs = 8'h22 ; write_reg_data = 8'h04 ; // DEFAULT
write_reg_addrs = 8'h23 ; write_reg_data = 8'h05 ; // DEFAULT
write_reg_addrs = 8'h24 ; write_reg_data = 8'h06 ; // DEFAULT
write_reg_addrs = 8'h25 ; write_reg_data = 8'h07 ; // DEFAULT
write_reg_addrs = 8'h26 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h27 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h28 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h29 ; write_reg_data = 8'h01 ; // DEFAULT
write_reg_addrs = 8'h2A ; write_reg_data = 8'h02 ; // DEFAULT
write_reg_addrs = 8'h2B ; write_reg_data = 8'h03 ; // DEFAULT
write_reg_addrs = 8'h2C ; write_reg_data = 8'h04 ; // DEFAULT
write_reg_addrs = 8'h2D ; write_reg_data = 8'h05 ; // DEFAULT
write_reg_addrs = 8'h2E ; write_reg_data = 8'h06 ; // DEFAULT
write_reg_addrs = 8'h2F ; write_reg_data = 8'h07 ; // DEFAULT
write_reg_addrs = 8'h32 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h33 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h34 ; write_reg_data = 8'h40 ; // DEFAULT
write_reg_addrs = 8'h35 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h36 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h37 ; write_reg_data = 8'h20 ; // DEFAULT
write_reg_addrs = 8'h38 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h39 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h3A ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h3B ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h3C ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h3D ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h3E ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h3F ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h40 ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h41 ; write_reg_data = 8'h00 ; // -----------> READ ONLY
write_reg_addrs = 8'h42 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h43 ; write_reg_data = 8'h54 ; // DEFAULT
write_reg_addrs = 8'h4B ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h4C ; write_reg_data = 8'h5C ; // DEFAULT
write_reg_addrs = 8'h4D ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h4E ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h4F ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h50 ; write_reg_data = 8'h40 ; // DEFAULT adc 1 single ended
write_reg_addrs = 8'h51 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h52 ; write_reg_data = 8'hA1 ; // -------------> CH1 ADC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h53 ; write_reg_data = 8'h80 ; // -------------> CH1 ADC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h54 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h55 ; write_reg_data = 8'h40 ; // DEFAULT adc 2 single ended
write_reg_addrs = 8'h57 ; write_reg_data = 8'hA1 ; // -------------> CH2 ADC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h58 ; write_reg_data = 8'h80 ; // -------------> CH2 ADC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h59 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h5A ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h5B ; write_reg_data = 8'hA1 ; // DEFAULT
write_reg_addrs = 8'h5C ; write_reg_data = 8'h80 ; // DEFAULT
write_reg_addrs = 8'h5D ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h5E ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h5F ; write_reg_data = 8'hA1 ; // DEFAULT
write_reg_addrs = 8'h60 ; write_reg_data = 8'h80 ; // DEFAULT
write_reg_addrs = 8'h61 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h62 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h64 ; write_reg_data = 8'h2C ;
write_reg_addrs = 8'h65 ; write_reg_data = 8'h20 ; // DEFAULT
write_reg_addrs = 8'h66 ; write_reg_data = 8'h20 ; // DEFAULT
write_reg_addrs = 8'h67 ; write_reg_data = 8'hC9 ; // -------------> CH1A DAC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h68 ; write_reg_data = 8'h80 ; // -------------> CH1A DAC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h69 ; write_reg_data = 8'hC9 ; // -------------> CH1B DAC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h6A ; write_reg_data = 8'h80 ; // -------------> CH1B DAC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h6B ; write_reg_data = 8'h2C ;
write_reg_addrs = 8'h6C ; write_reg_data = 8'h20 ; // DEFAULT
write_reg_addrs = 8'h6D ; write_reg_data = 8'h20 ; // DEFAULT
write_reg_addrs = 8'h6E ; write_reg_data = 8'hC9 ; // -------------> CH2A DAC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h6F ; write_reg_data = 8'h80 ; // -------------> CH2A DAC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h70 ; write_reg_data = 8'hC9 ; // -------------> CH2B DAC DIGITAL VOLUME CONTROL - DEFAULT 0DB
write_reg_addrs = 8'h71 ; write_reg_data = 8'h80 ; // -------------> CH2B DAC GAIN CALIB - DEFAULT 0DB
write_reg_addrs = 8'h72 ; write_reg_data = 8'h18 ; // DEFAULT
write_reg_addrs = 8'h73 ; write_reg_data = 8'h18 ; // DEFAULT
write_reg_addrs = 8'h76 ; write_reg_data = 8'hCC ; // -------------> ENABLING INPUT AND OUTPUT CHANNEL
write_reg_addrs = 8'h77 ; write_reg_data = 8'h00 ; // DEFAULT
write_reg_addrs = 8'h78 ; write_reg_data = 8'hc0 ; //--------------> Power up all enabled ADC and DAC channels
write_reg_addrs = 8'h79 ; write_reg_data = 8'h00 ; //--------------> READ ONLY
write_reg_addrs = 8'h7A ; write_reg_data = 8'h80 ; //--------------> READ ONLY


page 3 configuartion


write_reg_addrs = 8'h00 ; write_reg_data = 8'h03 ;
write_reg_addrs = 8'h1A ; write_reg_data = 8'h80 ;
write_reg_addrs = 8'h1B ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h1C ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h1D ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h1E ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h1F ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h20 ; write_reg_data = 8'h02 ;
write_reg_addrs = 8'h21 ; write_reg_data = 8'h03 ;
write_reg_addrs = 8'h22 ; write_reg_data = 8'h04 ;
write_reg_addrs = 8'h23 ; write_reg_data = 8'h05 ;
write_reg_addrs = 8'h24 ; write_reg_data = 8'h06 ;
write_reg_addrs = 8'h25 ; write_reg_data = 8'h07 ;
write_reg_addrs = 8'h26 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h27 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h28 ; write_reg_data = 8'h20 ;
write_reg_addrs = 8'h29 ; write_reg_data = 8'h30 ;
write_reg_addrs = 8'h2A ; write_reg_data = 8'h02 ;
write_reg_addrs = 8'h2B ; write_reg_data = 8'h03 ;
write_reg_addrs = 8'h2C ; write_reg_data = 8'h04 ;
write_reg_addrs = 8'h2D ; write_reg_data = 8'h05 ;
write_reg_addrs = 8'h2E ; write_reg_data = 8'h06 ;
write_reg_addrs = 8'h2F ; write_reg_data = 8'h07 ;
write_reg_addrs = 8'h32 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h33 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h34 ; write_reg_data = 8'h10 ;
write_reg_addrs = 8'h35 ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h36 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h37 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h38 ; write_reg_data = 8'h08 ;
write_reg_addrs = 8'h39 ; write_reg_data = 8'h20 ;
write_reg_addrs = 8'h3A ; write_reg_data = 8'h04 ;
write_reg_addrs = 8'h3B ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h3C ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h3D ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h3E ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h44 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h45 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h46 ; write_reg_data = 8'h00 ;
write_reg_addrs = 8'h47 ; write_reg_data = 8'h01 ;
write_reg_addrs = 8'h49 ; write_reg_data = 8'h00 ;

Request:

  • Has anyone encountered a similar issue when using both primary and secondary audio serial interfaces in TAC5212?

  • Are there any known limitations or specific steps to correctly configure the secondary interface for transmission?

  • Could the pin mapping  be a cause of this problem?

  • Hi,

    I have also changed the register setting as specified below but the output does not behave as expected.

    write_reg_addrs = 8'h0A ; write_reg_data = 8'hA2 ; // gpio 1 --> sec fsync
    write_reg_addrs = 8'h0B ; write_reg_data = 8'h92 ; // gpio 2 --> sec blck

    Regards,
    Monica D

  • Hi,

    Are you providing separate frequencies of FSYNC and BCLK? I think it may be easier to just provide the PASI your FSYNC and BCLK clocks and then configure SASI to use the same clocks. If you need the clocks in your second processor you could connect the lines to the PASI clocks. Otherwise, it should not be an issue to provide one set of clocks and use the ADC and DAC simultaneously. I tried to get it working with two separate clock providers and was having trouble as well. It may be possible to do it like that, but will be more difficult than just using only one set of ASI clocks and then sending the PASI clocks into your second core. Let me know if you need help with a script for this as well.

    Best,
    Mir