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.

TLV320AIC3120: Beep Generation and PLL settings validation

Part Number: TLV320AIC3120


Tool/software:

Hi Ti Team,

We were trying to generate beep in TLV320AIC3120, but we couldn't get any beep output.
Could you help us debug the issue. Could you please check our PLL config and Register settings done for Beep generation.
MCLK: 18.518 MHz
TLV320AIC3120 is in slave mode.
Beep Generation register write script

#!/bin/bash

# I2C bus and device address
I2C_BUS=1 # Update this to your specific I2C bus if necessary
I2C_ADDR=0x18

# Helper function to write to a register
write_register() {
    local reg=$1
    local val=$2
    echo "Writing to register 0x$reg: 0x$val"
    i2cset -y $I2C_BUS $I2C_ADDR 0x$reg 0x$val
}

# Helper function to switch page
switch_page() {
    local page=$1
    echo "Switching to page $page"
    write_register 00 $page
}

# Start configuration
echo "Starting I2C configuration for TLV320AIC3120..."

# Page 0: Reset the codec
switch_page 00
write_register 01 01 # Reset
sleep 0.01           # Allow time for reset

# Page 0: Clock configuration
write_register 04 03 # Clock source select
write_register 05 91 # PLL power-up, P=1, R=1
write_register 06 05 # J=5
write_register 07 08 # D=2300 MSB
write_register 08 FC # D=2300 LSB
sleep 0.01           # Allow PLL to stabilize

# Configure NDAC, MDAC, DOSR
write_register 0B 82 # NDAC = 2
write_register 0C 8E # MDAC = 14
write_register 0D 00 # DOSR MSB = 0
write_register 0E 48 # DOSR LSB = 0x48

# Configure NADC, MADC, AOSR
write_register 12 87 # NADC = 7
write_register 13 84 # MADC = 4
write_register 14 48 # AOSR = 72 (0x48)

# Miscellaneous settings
write_register 1B 20 # Codec interface control
write_register 3C 19 # DAC processing block # PRB 25
																														 
# Switch to Page 8 for additional configuration
switch_page 08   
write_register 01 04 # Adaptive filter
											   																			  
# Switch to Page 1 for headphone driver setup
switch_page 01
write_register 1F 04 # Initial headphone driver configuration
write_register 21 4E # Codec secondary interface control
write_register 23 40 # Route DAC to HPOUT via mixer
write_register 28 06 # Enable HPOUT driver
write_register 1F 82 # Power up HPOUT output driver
write_register 24 92 # Set analog volume for HPOUT

# Switch to Page 0 for beep settings
switch_page 00
write_register 40 0C #volume
write_register 0B 02 #Power down NDAC
write_register 47 80 # Enable beep generator
write_register 4A 12 # Beep-Length Middle Bits
write_register 4B C0 # Beep Length LSB
write_register 4C 5A # Beep Sin(x) MSB
write_register 4D 82 # Beep Sin(x) LSB
write_register 4E 5A # Beep Cos(x) MSB
write_register 4F 82 # Beep Cos(x) LSB
write_register 0B 82 # NDAC = 2 for beep #NDAC Power up
write_register 40 00 # DAC Volume Control

write_register 3F B6 # DAC Data-Path Setup		
write_register 41 00 # DAC Volume Control #0dB

echo "I2C configuration complete. Check HPOUT for beep signal."

Python script for sine, cos, beep length:

import numpy as np

def calculate_values(Fin, Fs, Cycle):
    sine_value = np.round(np.sin(2 * np.pi * Fin / Fs) * 2**15)
    cosine_value = np.round(np.cos(2 * np.pi * Fin / Fs) * 2**15)
    beep_length = np.floor(Fs * Cycle / Fin)
    print(beep_length);
    sine_hex = hex(int(sine_value))
    cosine_hex = hex(int(cosine_value))
    beep_length_hex = hex(int(beep_length))
    
    return sine_hex, cosine_hex, beep_length_hex

# Example usage
Fin = 1000  # Input frequency
Fs = 48000  # Sampling frequency
Cycle = 100  # Number of cycles

sine_hex, cosine_hex, beep_length_hex = calculate_values(Fin, Fs, Cycle)
print(f"Sine: {sine_hex}")
print(f"Cosine: {cosine_hex}")
print(f"Beep Length: {beep_length_hex}")


##Sine = dec2hex(round(sin(2*π*Fin/Fs)*2^15))
##Cosine = dec2hex(round(cos(2*π*Fin/Fs)*2^15))
##Beep Length = dec2hex(floor(Fs*Cycle/Fin))

PLL config:

TLV320AIC3120_PLL_Cal_v1.xlsx

Schematics:

Schematics

  • Hi Ti Team,
    We have an update regarding the issue


    We have observed that beep generation functions correctly when the codec is configured as the master with an MCLK of 12MHz. However, when we switch the configuration to have the TLV320AIC3120 as the slave with an MCLK of 18.518MHz, the beep sound is not produced.

    Beep generation register values (configured as the master with an MCLK of 12MHz):

    #!/bin/bash
    
    # I2C bus and device address
    I2C_BUS=1 # Update this to your specific I2C bus if necessary
    I2C_ADDR=0x18
    
    # Helper function to write to a register
    write_register() {
        local reg=$1
        local val=$2
        echo "Writing to register 0x$reg: 0x$val"
        i2cset -y $I2C_BUS $I2C_ADDR 0x$reg 0x$val
    }
    
    # Helper function to switch page
    switch_page() {
        local page=$1
        echo "Switching to page $page"
        write_register 00 $page
    }
    
    # Start configuration
    echo "Starting I2C configuration for TLV320AIC3120..."
    
    # Page 0: Reset the codec
    switch_page 00
    write_register 01 01 # Reset
    sleep 0.01           # Allow time for reset
    
    # Page 0: Clock configuration
    write_register 04 03 # Clock source select
    write_register 05 91 # PLL power-up, P=1, R=1
    write_register 06 06 # J=5
    write_register 07 23 # D=2300 MSB
    write_register 08 A0 # D=2300 LSB
    sleep 0.01           # Allow PLL to stabilize
    
    # Configure NDAC, MDAC, DOSR
    write_register 0B 83 # NDAC = 2
    write_register 0C 9B # MDAC = 14
    write_register 0D 00 # DOSR MSB = 0
    write_register 0E 80 # DOSR LSB = 0x48
    
    # Configure NADC, MADC, AOSR
    write_register 12 83 # NADC = 7
    write_register 13 9B # MADC = 4
    write_register 14 80 # AOSR = 72 (0x48)
    
    # Miscellaneous settings
    write_register 1B 4C # Codec interface control
    write_register 1C 01 # Data-Slot Offset Programmability
    write_register 1D 03 #Codec Interface Control 2
    write_register 1E 83 #BCLK N Divider Value
    write_register 1F 00 #
    write_register 20 00 #
    write_register 21 10 #
    write_register 3C 19 # DAC processing block # PRB_P25
    
    write_register 74 00 #(0x74): VOL/MICDET-Pin SAR ADC — Volume Control PAGE 0
    write_register 44 00
    write_register 41 30
    
    
    # Switch to Page 1 for headphone driver setup
    switch_page 01
    write_register 1F 04 # Initial headphone driver configuration
    write_register 21 4E # Codec secondary interface control
    write_register 23 40 # Route DAC to HPOUT via mixer
    write_register 28 06 # Enable HPOUT driver
    write_register 1F 84 # Power up HPOUT output driver
    write_register 24 80 # Set analog volume for HPOUT
    
    # Switch to Page 8 for additional configuration
    switch_page 08
    write_register 01 04 # Adaptive filter
    
    # Switch to Page 0 for beep settings
    switch_page 00
    write_register 3F 96 # DAC Data-Path Setup    
    write_register 40 0C #volume
    write_register 0B 03 #Power down NDAC
    write_register 47 80 # Enable beep generator
    #write_register 48 00
    write_register 49 12 # Beep-Length MSB
    write_register 4A 4F # Beep-Length Middle Bits
    write_register 4B 80 # Beep Length LSB
    write_register 4C 06 # Beep Sin(x) MSB
    write_register 4D B3 # Beep Sin(x) LSB
    write_register 4E 7F # Beep Cos(x) MSB
    write_register 4F D3 # Beep Cos(x) LSB
    write_register 0B 83 # NDAC = 2 for beep #NDAC Power up
    write_register 40 04 # DAC Volume Control
    
    
    
    echo "I2C configuration complete. Check HPOUT for beep signal."
    

    (MCLK as 18.518MHz and TLV320AIC3120 as slave)
    we were not able to hear the beep sound:

    #!/bin/bash
    
    # I2C bus and device address
    I2C_BUS=1 # Update this to your specific I2C bus if necessary
    I2C_ADDR=0x18
    
    # Helper function to write to a register
    write_register() {
        local reg=$1
        local val=$2
        echo "Writing to register 0x$reg: 0x$val"
        i2cset -y $I2C_BUS $I2C_ADDR 0x$reg 0x$val
    }
    
    # Helper function to switch page
    switch_page() {
        local page=$1
        echo "Switching to page $page"
        write_register 00 $page
    }
    
    # Start configuration
    echo "Starting I2C configuration for TLV320AIC3120..."
    
    # Page 0: Reset the codec
    switch_page 00
    write_register 01 01 # Reset
    sleep 0.01           # Allow time for reset
    
    # Page 0: Clock configuration
    write_register 04 03 # Clock source select
    write_register 05 91 # PLL power-up, P=1, R=1
    write_register 06 05 # J=5
    write_register 07 08 # D=2300 MSB
    write_register 08 FC # D=2300 LSB
    sleep 0.01           # Allow PLL to stabilize
    
    # Configure NDAC, MDAC, DOSR
    write_register 0B 82 # NDAC = 2
    write_register 0C 8E # MDAC = 14
    write_register 0D 00 # DOSR MSB = 0
    write_register 0E 48 # DOSR LSB = 0x48
    
    # Configure NADC, MADC, AOSR
    write_register 12 87 # NADC = 7
    write_register 13 84 # MADC = 4
    write_register 14 48 # AOSR = 72 (0x48)
    
    # Miscellaneous settings
    write_register 1B 40 # Codec interface control
    write_register 1C 01 #
    #write_register 1D 03 #
    #write_register 1E 83 #
    #write_register 1F 00 #
    #write_register 20 00 #
    #write_register 21 10 #
    write_register 3C 19 # DAC processing block # PRB_P25
    
    write_register 74 00 #(0x74): VOL/MICDET-Pin SAR ADC — Volume Control PAGE 0
    write_register 44 00
    write_register 41 30
    
    
    # Switch to Page 1 for headphone driver setup
    switch_page 01
    write_register 1F 04 # Initial headphone driver configuration
    write_register 21 4E # Codec secondary interface control
    write_register 23 40 # Route DAC to HPOUT via mixer
    write_register 28 06 # Enable HPOUT driver
    write_register 1F 84 # Power up HPOUT output driver
    write_register 24 80 # Set analog volume for HPOUT
    
    # Switch to Page 8 for additional configuration
    switch_page 08
    write_register 01 04 # Adaptive filter
    
    # Switch to Page 0 for beep settings
    switch_page 00
    write_register 3F 96 # DAC Data-Path Setup    
    write_register 40 0C #volume
    write_register 0B 02 #Power down NDAC
    write_register 47 80 # Enable beep generator
    write_register 48 00
    write_register 49 12 # Beep-Length MSB
    write_register 4A 4F # Beep-Length Middle Bits
    write_register 4B 80 # Beep Length LSB
    write_register 4C 06 # Beep Sin(x) MSB
    write_register 4D B3 # Beep Sin(x) LSB
    write_register 4E 7F # Beep Cos(x) MSB
    write_register 4F D3 # Beep Cos(x) LSB
    write_register 0B 82 # NDAC = 2 for beep #NDAC Power up
    write_register 40 04 # DAC Volume Control
    
    
    
    echo "I2C configuration complete. Check HPOUT for beep signal."
    

    Is there any limitation for beep generation in TLV320AIC3120 that it can be only done in master mode?

  • Hi,

    I do not think there is a limitation for master mode for the beep generation feature. I wonder if it has to do with the clocks chosen. Can you explain what your input BCLK and WCLK frequencies are? Have you been able to get audio out of the DAC before the beep frequency is enabled?

    Also, it doesn't make sense to use the PLL for slave mode, or to use an MCLK for slave mode - if you are using slave mode, the BCLK and WCLK are input, so there is no need for another clock in the form of MCLK. Usually MCLK is used as an external clock that can be divided down/multiplied by the PLL to create BCLK and WCLK. Let me know what your ASI clock intentions are and we can make this work!

    Best,
    Mir

  • Hi Mir Jeffres,

    Due to a limitation in the processor, we have utilized MCLK instead of BCLK. We successfully obtained a beep at a 48kHz sampling frequency (12MHz MCLK). Additionally, we tested loopback in both master and slave modes using PLL and MCLK. Playback and recording were also tested at 18.513MHz MCLK, following the sample configuration in the datasheet.

    Thank you for your response, which provided us with valuable insights.

  • Hi Abhijith,

    Do you need any more help with this or did you get it working as you wanted?

    Best,
    Mir