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:测试 TLV320AIC3120 输出以及窦波问题

Guru**** 2826855 points

Other Parts Discussed in Thread: TLV320AIC3120

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1577562/tlv320aic3120-test-tlv320aic3120-output-with-sinus-wave-issue

部件号:TLV320AIC3120


您好:

我们正在尝试测试 TLV320AIC3120。 我们决定首先使用数字生成的正弦波测试输出。

TLV320AIC3120 在 11.294118MHz 处接收 MCLK、我们使用的 PLL 具有以下配置:J = 6、D = 9870、P = R = 1、NDAC = 5 和 MDAC = 3、从而使 FS = 44.1kHz。

我们配置 DAC、如数据表的 7.3.12.15 第 65 页所示(显然我们的 PLL 配置)。 我们做了一些小的修改:  

  • HPOUT 静音和断电(我们使用 SPKP 和 SPKM 输出)、
  • D 类驱动器输出级增益= 6dB(而不是 18)、
  • D 类输出模拟音量=–20dB(而不是–9)

蜂鸣发生器模式似乎运行良好、我们无法产生相同的声音、数字值以 I2S 发送到编解码器。

我们不知道这是我们的生产方式、数字数据的发送方式、还是 TLV320AIC3120 的配置。  

我们如何生成和发送数据:  

#define PI 3.14159265358979323846
#define TAU (2.0 * PI)
[...]
u8 signal[65536];
u32 nsamples = 65536;
f64 t = 0;
s16 sin_value = 0;
u32 i = 0;
[...]
while(i < nsamples) {
    t = ((((f64)i) / 4.0)) / (44100);
    sin_value = 32767*sin(400 * TAU * t);
    signal[i] = (sin_value >> 8) & 0xFF; // left msb
    signal[i+1] = sin_value & 0xFF; // left lsb
    signal[i+2] = signal[i]; // right msb
    signal[i+3] = signal[i+1]; // right lsb
    i += 4;
}
[...]
HAL_SAI_Transmit(&hsai_BlockA1, signal, nsamples/2, HAL_MAX_DELAY);

提前感谢。

此致、

Malo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Malo、

    如果我正确读取了您的代码、您是否尝试使用 2 位数据点? 在该配置中、我们预计会有 16 位数据、这意味着左声道的 MSB 到 LSB 将首先接收信号[0:15]、然后接收信号[16:31]中右声道的 MSB 到 LSB 等 另一点需要注意的是、数据必须与 BCLK 同时发送、如果您遵循第 65 页中的寄存器、则假定 BCLK 处于从模式、因此您需要确保 BCLK 和音频数据同时发送。 如果您可以共享 DIN 引脚(和 BCLK/WCLK)输入内容的示波器屏幕截图、这将对您有所帮助、我会检查数据和时钟以确保其适用于此应用。

    另外需要注意的是、信号阵列大小允许 0.046 秒的信号、因此请记住这一点、它会非常快。

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Mir、

    HAL_Sai_transmit 函数接受 8 位数据表、因此我们将 sin_value[15:8]放在 signal[i]中、将 sin_value[7:0]放在 signal[i+1]中。 SAI 块配置为使用 I2S 协议发送 16 位数据。 我们将数据信号复制到接下来的 16 位(信号[I+2]和信号[I+3])上、以便与图 7-44 第 76 页所示的一样。

    以下是 WCLK (D0)、BCLK (D1) 和 DIN (D2) 信号的示波器屏幕截图:

    WCLK 频率的测量值为 44.189kHz、1.412MHz 用于 BCLK 信号。

    您能解释一下如何找到   0.046 秒的信号吗?

     HAL_SI_TRANSMIT 函数处于无限循环中。

    此致、

    Malo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我看到,对不起,我没有完全理解你的代码. 它看起来是正确的、有 16 位时钟和数据通过。 您的问题是信号没有足够大吗? 或者您根本听不到声音? 您能否附加 I2C 命令或寄存器转储? 我知道您使用此示例作为基础、但让我们看看您的特定解决方案正在发生什么。

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我解决了其中一个问题,我的数据没有按正确的顺序在我的表中设置:我应该在 MSB 之前输入 LSB。 现在我可以听到一些其他的声音,而不是一些刺激性的声音。 但我认为我的问题没有解决。 DAC 输出端似乎没有正确的输出声频。

    现在的代码:

    [...]
    uint16_t signal[65535];
    u32 nsamples = 65535;
    f64 t = 0;
    int16_t sin_value = 0;
    f64 sin_value_f64 = 0.0;
    [...]
    u32 i = 0;
    u16 BeepFrequency = 2000;
    while(i < nsamples) {
        t = ((f64)i) / 2.0;
        sin_value_f64 = sin(((2.0 * M_PI * BeepFrequency) / tlv320.sample_rate) * t);
        sin_value = (int16_t)(32767 * sin_value_f64);
        signal[i] = sin_value; // left
        signal[i+1] = sin_value; // right
        i += 2;
    }
    [...]
    HAL_SAI_Transmit(&hsai_BlockA1, (uint8_t *)signal, nsamples/2, HAL_MAX_DELAY);

    以下是使用蜂鸣发生器功能在 D 类扬声器输出端产生 2000 Hz 正弦波时的声频谱截图(从我的手机上):

    我们可以看到、 功率为–46dB 时、峰值频率约为 2000Hz。

    当我们使用 I2S 协议以 2000Hz 的频率将正弦数据发送到 DAC 时:

    我们可以看到、 功率为–51dB 时、频率约为 1000Hz。

    下面是 I2C 命令、我用于配置 DAC 以播放在 I2S 中接收到的数据:

    W 00 00
    W 01 01
    (Delay 1 ms)
    W 04 03
    W 06 06
    W 07 26
    W 08 8E
    W 05 91
    (Delay 10 ms)
    W 0B 85
    W 0C 83
    W 0D 00
    W 0E 80
    W 1B 00
    W 3C 10
    W 00 08
    W 01 04
    W 00 00
    W 00 01
    W 1F 04
    W 21 4E
    W 35 40
    W 28 06
    W 2A 04
    W 1F 82
    W 20 86
    W 24 92
    W 26 A8
    W 00 00
    W 3F 94
    W 41 D4
    W 40 04

    此致、

    Malo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Malo、

    您的代码看起来不错、除了您写入为第 1 页保留的寄存器 0x35 的寄存器“W 30 40“外、我不确定您在这里的意思。

    对于数据发送、I2S 信号在 WCLK 之后有 1 位移位、它们首先发送 MSB、然后按顺序发送所有位、直到 LSB。 这张图显示了这种转变。 也许是位移会影响输出?

    此致、
    Mir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    是的、抱歉、它应该为“W 23 40“(十进制格式为 0x23 = 35)。   

    我解决了我的问题、我不应该在 signal[i]和 signal[i]中设置相同的数据。 现在它运行良好。

    谢谢你。

    此致、

    Malo