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.

TLV320AIC3101: Pop sound when TLV320AIC3101 starts recording

Part Number: TLV320AIC3101

Hi team,

Circuit is a typical application of TLV320AIC3101 datasheet. We started recording with TLV320AIC3101, and there was a broken sound about 0.4s. Is it normal? Monitor with earphone, there is obvious pop sound. Is there any way to solve this problem?

Best Regards,
Amy Luo

  • Amy, 

    This will depend entirely on your recording sequence, can you share your sequence with me?

    best regards,

    -Steve Wilson

  • Hi Steve,

    Thanks for your response.

    void InitCodec()
    {    
        volatile unsigned int delay = 0xFFF;    
        /* Select Page 0 */
        CodecRegWrite(AIC31_P0_REG0, 0,sizeof(CodecWrite));    
        /* Reset the codec */
        CodecRegWrite(AIC31_P0_REG1, AIC31_RESET,sizeof(CodecWrite));    
        while(delay--);
        
        
        CodecRegWrite(AIC31_P0_REG9, (0u << 6u | 2u << 4u),sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG10, 0,sizeof(CodecWrite));
        
        CodecRegWrite( AIC31_P0_REG8, 0x00,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG7, 0x0A,sizeof(CodecWrite));
            
        //set ADC    
        CodecRegWrite(AIC31_P0_REG15, 0x00,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG16, 0x00,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG17, 0x0F,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG18, 0xF0,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG25, 0x40,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG19, 0x04,sizeof(CodecWrite));
        
        CodecRegWrite(AIC31_P0_REG22, 0x04,sizeof(CodecWrite));

        //set DAC
        CodecRegWrite(AIC31_P0_REG37, 0xE0,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG41, 0x02,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG42, 0x6C,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG47, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG46, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG51, 0x01,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG64, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG63, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG65, 0x01,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG43, 0x00,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG44, 0x00,sizeof(CodecWrite));

        CyDelay(500);

        CodecRegWrite(AIC31_P0_REG51, 0x09,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG65, 0x09,sizeof(CodecWrite));
    }

    Best Regards,
    Amy Luo

  • Hi Amy, 

    This looks like the initialization sequence.  do you run this every time the codec records?

    best regards,

    -Steve Wilson

  • Hi Steve,

    Because of the low power consumption requirement, TLV320AIC3101 needs to enter deep sleep, so it will initialize and record again every time.

    Best Regards,
    Amy Luo

  • Amy, 

    Here are my recommendations:

        volatile unsigned int delay = 0xFFF;    
        /* Select Page 0 */
        CodecRegWrite(AIC31_P0_REG0, 0,sizeof(CodecWrite));    
        /* Reset the codec */
        CodecRegWrite(AIC31_P0_REG1, AIC31_RESET,sizeof(CodecWrite));    
        while(delay--);
        
        
        CodecRegWrite(AIC31_P0_REG9, (0u << 6u | 2u << 4u),sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG10, 0,sizeof(CodecWrite));
        
        CodecRegWrite( AIC31_P0_REG8, 0x00,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG7, 0x0A,sizeof(CodecWrite));
            
        //set ADC    
        CodecRegWrite(AIC31_P0_REG15, 0x00,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG16, 0x00,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG17, 0x0F,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG18, 0xF0,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG25, 0x40,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG19, 0x04,sizeof(CodecWrite));
        
        CodecRegWrite(AIC31_P0_REG22, 0x04,sizeof(CodecWrite));

        //set DAC
        CodecRegWrite(AIC31_P0_REG37, 0xE0,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG41, 0x02,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG42, 0x6C,sizeof(CodecWrite));

        CodecRegWrite(AIC31_P0_REG47, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG46, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG51, 0x01,sizeof(CodecWrite));


        CodecRegWrite(AIC31_P0_REG64, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG63, 0x80,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG65, 0x01,sizeof(CodecWrite));


    //The delay below should match the ramp up time set  in register 42.  this is to allow the output to power up.Alternately wait until Reg 94 D1 = '1'. 

        CyDelay(500);

        CodecRegWrite(AIC31_P0_REG51, 0x09,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG65, 0x09,sizeof(CodecWrite));

    //  the delay below is a function of the soft stepping. if set to 1step per sample this is 508/fs .  if set to 1 step every 2 samples then 1016/fs.

       CyDelay(500) 


        CodecRegWrite(AIC31_P0_REG43, 0x00,sizeof(CodecWrite));
        CodecRegWrite(AIC31_P0_REG44, 0x00,sizeof(CodecWrite));
    // the delay below is a function of the soft stepping. if set to 1step per sample this is 508/fs .  if set to 1 step every 2 samples then 1016/fs.

        CyDelay(500);


    }

    If you can make use of the weak bias on the HPOUT,  that would eliminate any residual pop on power up. so if you enable the weak bias when the device first initializes only,  that would do the trick. of course there is a slight current draw when this is enabled.  so make sure it is acceptable for you.

    best regards,

    -Steve wilson