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?