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.

[参考译文] TLV320AIC3204:从辅助接口进行 8kHz 至 16KZ 采样

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1612966/tlv320aic3204-8khz-to-16kz-sampling-from-secondary-interface

器件型号: TLV320AIC3204

您好、

我将编解码器的次级 I2S 端口连接到 VoLTE 调制解调器的 PCM 端口。

调制解调器在 S_BLCK 引脚 32 (GPIO/MFP5) 上发送 2.048MHz 时钟、在 S_WCLK 引脚 8 (SCLK/MFP3) 上发送 8kHz 时钟。 这使得编解码器在 S_DOUT 引脚 11 (MISO/MFP4) 上输出音频数据。

当我打电话时、我听到了音频、到目前为止一切都很好。  以下寄存器适用于 VoLTE 通道上的 8kHz 音频:

寄存器 004:000 (0x02 -> 0000 0010)
寄存器 005:000 (0x00 -> 0000 0000)
寄存器 018:000 (0x81 -> 1000 0001)
寄存器 019:000 (0x82 -> 1000 0010)
寄存器 020:000 (0x80 --> 1000 0000)
寄存器 027:000 (0x40 -> 0100 0000)
寄存器 028:000 (0x00 -> 0000 0000)
寄存器 031:000 (0x08 --> 0000 1000)
寄存器 032:000 (0x0C -> 0000 1100)
寄存器 033:000 (0x09->0000 1001)
寄存器 052:000 (0x04 -> 0000 0100)
寄存器 055:000 (0x10 --> 0001 0000)
寄存器 056:000 (0x02 -> 0000 0010)


然后将调制解调器上的 BCLK 更改为 16KHz、然后将寄存器更改为以下值(27 到 56 与先前配置相比保持不变):

寄存器 004:000 (0x0A --> 0000 1010)
寄存器 005:000 (0x94 --> 1001 0100)
寄存器 006:000 (0x04 -> 0000 0100)
寄存器 007:000 (0x00 -> 0000 0000)
寄存器 008:000 (0x00 -> 0000 0000)
寄存器 011:000 (0x88 -> 1000 1000)
寄存器 012:000 (0x82 -> 1000 0010)
寄存器 018:000 (0x88 -> 1000 1000)
寄存器 019:000 (0x82 -> 1000 0010)
寄存器 020:000 (0x80 --> 1000 0000)

基本上、我启用 PLL、并将 2.048 GPIO 设置为 CODEC_CLKIN、也设置为 PLL 时钟输入。

然后、I SET PLL 启用、R=4、J=4、D=0、P=1、这会返回 32.768MHz 的 CODEC_CLKIN。

将 NDAC/NADC 设置为 8、将 MDAC/mAdc 设置为 2 并将 AOSR 设置为 128、这会返回 4096KHz ADC_CLK、2048KHz ADC_MOD_CLK 和 16KHz ADC_FS。

拨打电话时、我在 DOUT 引脚 11 上看不到任何数据。

禁用 PLL 并将 P0_R5 恢复为 0x00 并告诉调制解调器恢复为 8kHz 会在我调用调制解调器时返回适当的音频。

我确定我的配置有问题、但可能缺少一些内容?

感谢您发送编修。

Benoit

 

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

    您好、

    抱歉、您的延迟时间可能会延长、请允许我再有一天浏览您的寄存器。

    -米尔

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

    没问题。

    Benoit

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

    继我昨天的初始消息之后、为了更新您、我今天尝试了不同的设置、只是为了确认我不是疯了。

    这里是从编解码器的 PCM 总线原理图复制粘贴的代码、您可以看到它非常简单。

    下面是我当前使用的 C 代码的复制粘贴、用于收听来自调制解调器的 8kHz VoLTE 音频、它按预期工作。 我将调制解调器的 VoLTE 信道设置为 8kHz、拨打电话、一切正常。

    下面的函数 有以下参数格式:  Audio_SetRegister( page、register、value )。

    据我所知、值为 0x0A 的 P0 R4 将 2.048MHz 时钟(引脚 32 S_BCLK)设置为 PLL 的输入(D3=1、D2=0:GPIO 引脚是 PLL 的输入)、也将设置为编解码器的主时钟输入 (D1=1、D0=0: GPIO 引脚为 CODEC_CLKIN):

    Audio_SetRegister( 0, 4, 0x0A );
    Audio_SetRegister( 0, 5, 0xC2 );
    Audio_SetRegister( 0、6、0x16 );
    Audio_SetRegister( 0、7、0x00 );
    Audio_SetRegister( 0、8、0x00 );

    Audio_SetRegister( 0, 11, 0x84 ); ***********
    Audio_SetRegister( 0, 12, 0x84 );
    Audio_SetRegister( 0, 18, 0x84 );***********
    Audio_SetRegister( 0, 19, 0x84 );

    ************* 将这些设置更改为 0x88 和  

    Audio_SetRegister( 0、20、0x80 );
    Audio_SetRegister( 0, 27, 0x40 );
    Audio_SetRegister( 0, 28, 0x00 );
    Audio_SetRegister( 0、31、0x08 );
    Audio_SetRegister( 0, 32, 0x0C );
    Audio_SetRegister( 0, 33, 0x09 );
    Audio_SetRegister( 0、52、0x04 );
    Audio_SetRegister( 0, 55, 0x10 );
    Audio_SetRegister( 0、56、0x02 );

    因此、来自 S_BCLK 引脚 32 的编解码器的主时钟源是来自调制解调器的 2.048MHz 时钟。

    编解码器的 S_WCLK 引脚 8 也是来自调制解调器的 8kHz 时钟。

    寄存器 5-8 (R*J*D)/P 会产生 32.768MHz CODEC_CLKIN。

    当我在 VoLTE 通话中测试上述设置时、我会听到音频。 这里的一切都很好。

    下面是 我用于计算的 AIC3204 软件的快照:

    这些设置使我能够在调制解调器的 VoLTE 信道设置为 8kHz 时进行 VoLTE 呼叫。

    调制解调器也可以执行 16KHz、因此 、如果我要将 ADC_FS 设置为 16KHz、我只需将 NDAC 和 NADC 更改为 4、这会将 ADC_FS 设置为 16KHz:

    问题是当我将 NDAC 和 NADC 更改为 4  以使 ADC_FS 为 16KHz 时、编解码器中没有音频数据发出。 一旦我恢复到  NDAC 和 8 的 NADC、ADC_FS 就会降至 8kHz、我有音频。

    使用逻辑分析仪、我可以监控 2.048MHz、8kHz 和 PCM 音频线路、 在这两种情况下、我都看到正确的时钟 、但我只在 NDAC/NADC 设置为 8 (8kHz ADC_FS) 时看到音频数据、而当设置为 4 时、返回 16KHz ADC_FS、但 PCM 线路上没有数据(尽管存在时钟)

    那么、您认为这些值是否正常? 可能有什么问题?

    我正在等待调制解调器制造商回复我、以确认 16KHz 应该工作、但从您的角度来看、编解码器是否正常?

    再次感谢、

    Benoit

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

    您好 Benoit、  

    您正在使用 PLL? 该器件的应用参考指南的第 77 页规定了 PLL 和时钟结构的限制。 PLL CODEC_CLKIN 输出的器件正常运行的下限为 80MHz、因此 32MHz 过低。 我对它的工作印象深刻... 我建议将您的 P 分频器更改为包含在 MDAC/mADC 分频器中 — 如果您的 AVDD 为 1.8V 或更高、128MHz 的 PLL 输出时钟将正常。

    -米尔

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

    尊敬的 Mir:

    好赶上了,我完全忘了这个。 我设置的是 R=4、J=12、P=1。 这会返回 98.304MHz 的 CODEC_CLKIN。

    然后、在分频器中、我将 NADC 设置为 12、将 mAdc 设置为 4、这会返回 ADC_CLK = 8192KHz、ADC_MOD_CLK = 2.048MHz 且 ADC_FS = 16KHz。

    如果我仅将 mAdc 更改为 8、则会得到 ADC_MOD_CLK = 1024KHz、ADC_FS = 8kHz。

    VoLTE 呼叫以 8kHz 的频率工作、但我相信现在由于调制解调器的时钟问题、16KHz 呼叫不起作用。

    公司回复我应该从调制解调器看到 4.096MHz BCLK,但我只得到 2.048MHz。

    如果我取得进展、我会继续向您发布信息;同时、如果您有其他想法、请告诉我。

    谢谢。

    Benoit

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

    您好、Mir、

    我能够使调制解调器上的 16KHz 语音呼叫正常工作、因此我相信我的编解码器已正确配置。  在我关闭 TT 之前、也许您可以分享您对 我最后一条消息配置的想法、然后我将关闭 TT。

    谢谢、

    Benoit

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

    您好 Benoit、

    MIR 已不在办公室、下周将返回支持该主题。

    此致、

    Garret

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

    尊敬的 Mir:

    我在这里有一个损耗。 我想我在编解码器上没有执行任何操作。 现在我已经有了更好的理解并且可以重现问题了、让我们从一开始就开始。

    我的调制解调器可以进行 8 位 8KHz VoLTE 呼叫和 16 位 16KHz VoLTE 呼叫。

    对于 8 位 8kHz VoLTE 调用、 调制解调器输出:
    1) 引脚 32 S_BCLK IN (GPIO/MFP5) 上的 2.048MHz;
    2) 在引脚 8 S_WCLK IN (SCLK/MFP3) 上为 8kHz;
    3) S_DOUT (MISO/MFP4) 引脚 11 上的 8 位音频数据;

    指定  16 位 16 KHz VoLTE 调用、调制解调器输出:
    1) 引脚 32 S_BCLK IN (GPIO/MFP5) 上的 4.096MHz;
    2)  (SCLK/MFP3) 中引脚 8 S_WCLK 输入上的 16KHz;
    3)  S_DOUT (MISO/MFP4) 引脚 11 上的 16 位音频数据;

    请注意、这两种类型的呼叫都在工作。 但这是事情...  我遇到的问题是、从一开始就引导整个设备时(调制解调器联机,编解码器已初始化)、如果我让调制解调器首先进行 16KHz 的调用、就会进行调用、但没有音频。  然后我告诉调制解调器进行一个 8kHz 的呼叫,那一个工作,我听到的音频。 然后我挂断电话并再次告诉它,以发出一个 16kHz 的语音呼叫,这一次它是有效的。

    但是、如果我 启动并首先进行 8kHz 调用、挂断然后进行 16kHz 调用、那么这一个有效、16KHz 调用将始终有效、直到我重新启动。

    回顾一下:

    BOOT ->调用 16kHz 失败 -->呼叫 8kHz 典型工作原理 -->调用 16Khz 工作 -->呼叫 16 工作-->呼叫 16 工作

    boot -->调用 8kHz 典型工作原理 -->呼叫 16 w orks -->呼叫 16 作品-->呼叫 16 作品  

    我知道问题不是调制解调器。 我正在监控时钟、它们应该是什么:4.096MHz 和 16KHz、无论它是失败的呼叫还是良好的呼叫。

    我正在想的是、初始 4.096MHz 和 16kHz 时钟不会以某种方式在内部同步编解码器、因此我看不到音频数据。 然后 8kHz 调用启用“内部同步“、这就是为什么在接下来的 16kHz 调用中它有效的原因。 一旦完成初始模式、我就可以根据我的意愿进行 16kHz 的通话。

    在 8kHz 和 16kHz 音频下、我将 PLL 参数设置为 CODEC_CLKIN 为 122.88MHz。 配置这种位模式会令人困惑、因为时钟会根据呼叫类型而变化。

    这是用于 16KHz 16 位音频的 PLL 配置和分频器配置:

    如图所示、ADC_FS 为 16KHz。

    这是我的代码:

    AUDIO_SetRegister (0、4、0x0B); //  GPIO 引脚是 PLL 输入、 GPIO 引脚是 CODEC_CLKIN

    AUDIO_SetRegister( 0、5、0xC3 );// D7:PLL 已上电、D6-4:P=4、D3-0:R=3 --> 195
    AUDIO_SetRegister (0、6、0x28);// D7-6:保留、D5-0:j=40 --> 40

    AUDIO_SetRegister( 0、11、0x8F );// D7:NDAC 分频器上电、D6-0:NDAC=15 --> 143.
    AUDIO_SetRegister (0、18、0x8F);// D7:NADC 分频器上电、D6-0:NDAc=15 --> 143.

    AUDIO_SetRegister (0、12、0x84);// D7:MDAC 分频器上电、D6-0:MDAC=4 --> 132.
    AUDIO_SetRegister (0、19、0x84);// D7:mAdc 分频器上电、D6-0:mAdc=4 --> 132.

    AUDIO_SetRegister (0、13、0x00);// D7-2:保留、D1-0:DOSR MSB=0 --> 0
    AUDIO_SetRegister( 0、14、0x80 );// D7-0:DOSR LSB=128 --> 128

    AUDIO_SetRegister( 0、20、0x80 );// D7-0:AOSR=128 --> 128

    以下是 8KHz / 8 位音频的设置:

    如您所见、ADC_FS 为 8kHz。

    这是我的代码:

    AUDIO_SetRegister (0、4、0x0B);// GPIO 引脚是 PLL 输入、 GPIO 引脚是 CODEC_CLKIN

    AUDIO_SetRegister (0、5、0xA3);// D7:PLL 已上电、D6-4:P=2、D3-0:R=3 --> 163
    AUDIO_SetRegister (0、6、0x28);// D7-6:保留、D5-0:j=40 --> 40

    AUDIO_SetRegister( 0、11、0x8F );// D7:NDAC 分频器上电、D6-0:NDAC=15 --> 143.
    AUDIO_SetRegister (0、18、0x8F);// D7:NADC 分频器上电、D6-0:NDAc=15 --> 143.

    AUDIO_SetRegister (0、12、0x88);// D7:MDAC 分频器上电、D6-0:MDAC=8 --> 136
    AUDIO_SetRegister (0、19、0x88);// D7:mAdc 分频器上电、D6-0:mAdc=8 --> 136

    AUDIO_SetRegister (0、13、0x00);// D7-2:保留、D1-0:DOSR MSB=0 --> 0
    AUDIO_SetRegister( 0、14、0x80 );// D7-0:DOSR LSB=128 --> 128

    AUDIO_SetRegister( 0、20、0x80 );// D7-0:AOSR=128 --> 128

    现在我的问题:

    1) 由于 BCLK 时钟源根据我进行的调用类型而变化、因此这意味着 也需要针对 两个时钟源之一更改 PLL 和分频器设置。 那么、 在重新启用更改之前关闭的“任何“之前、在更改所有这些设置之前、是否应该重置或关闭任何设置?

    2) 调制解调器的 BCLK 和 WCLK 只有在呼叫在远端应答之前才会被调制解调器启用。 因此、 如果两个时钟在调用之间都发生变化(例如进行一个 8kHz 调用、然后一个 16KHz 时钟、再一个 8kHz 时钟)、 在 准备呼叫之前、我必须对编解码器执行任何操作、这样我是否需要禁用 PLL 或关闭某些功能、为时钟 x 配置它、然后重新启用这些功能?  例如、2.048MHz BCLK 为 8kHz 时、8KHz 调用和 16KHz 调用之间的唯一区别是 P=2/mAdc=8、而 BCLK 为 4.096KHz 时、对于 16KHz、则 P=4/mAdc=4。 这些设置可确保 两个实例中来自 PLL 的 CODEC_CLKIN 均为 122.88MHz。

    有什么想法吗?

    谢谢!

    Benoit

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

    您好 Benoit、

    我们应在此处检查以下几点、以验证问题发生的位置。 首先、您能否检查示波器上的 BCLK、FSYNC 和 DIN 引脚? 理想情况下、您可以同时检查它们、以查看调制解调器输出在每个信道之间留出的空间。 由于您说它生成 2.048MHz 或 4.096MHz BCLK、因此这是采样率的 256 倍。 我们要确保信道之间有适当的间距。 您可能还希望将位深度/字长设置为 32、因为这是上限、并允许器件使用 PTM_P4、该要求每个样本至少需要 20 位。 这是通过第 0 页上的寄存器 0x1b 进行设置的。  

    另外要检查的是在 16k 情况之后执行寄存器转储(第 0 页和第 1 页)、在 8k 情况之后执行转储、然后在 16k 情况之后执行转储、当它再次工作时。 我们可能会找到一个可在这些情况之间进行更改的寄存器。

    此致、
    Mir