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.

[参考译文] CC3200AUDBOOST:WiFi 音频-超过8 kHz 16位反向立体声

Guru**** 2513185 points
Other Parts Discussed in Thread: TLV320AIC3254, CC3200, CC3200AUDBOOST

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/617828/cc3200audboost-wifi-audio---going-above-8-khz-16-bit-reverse-stereo

器件型号:CC3200AUDBOOST
主题中讨论的其他器件:TLV320AIC3254CC3200

我让 WiFi 音频示例工作、要启用双工立体声、我更改了:

AudioCodecConfig (audio_codec_TI_3254、audio_codec_n_bit、audio_codec_bit_rate、
audio_codec_reverse_Stereo、audio_codec_speaker_all、
AUDIO_CODE_MIC_ALL);

AudioCaptureRenderConfigure (AUDIO_CODE_N_BIT、AUDIO_CODE_BIT_RATE、AUDIO_CODE_REVERE_STEREO、RecordPlay、1);

当 AUDIO_CODE_N_BIT 为16 (16位样本)且 AUDIO_CODE_BIT_RATE 为8000 (8kHz)时、此功能按预期工作(双工立体声音频传输)。

但是、一旦我尝试使用16kHz 时、它就不再工作了-相反、红色 LED 只会闪烁。 使用24位采样时会出现类似的问题。

16 kHz 的4个通道仍应处于可用的 TCP 吞吐量内? 我正在尝试从该模块获得至少4个48 kHz 24位信道... (尽管我希望交换到 UDP 以获得额外吞吐量)。

我们非常感谢您对此提供的任何帮助! 提前谢谢。

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

    我会深入研究这个问题、然后再回来!

    此致、

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

    使用上述设置调用 AudioCodecConfig()时,返回-1 (错误)。 假设使用 AUDIO_CODE_TI_3254、这是由传递给上述函数的两个变量导致的:

    (1)如果设置了 AUDIO_CODE_16_BIT 以外的任何内容,AudioCodecConfig()将返回-1 (错误)。

    (2)假设使用 AUDIO_CODE_16_BIT 而不是 AUDIO_CODE_N_BIT

    audio_codec_16_bit * audio_codec_bit_rate * audio_codec_reverse_立体声 评估为1024000、导致 AudioCodeConfig ()返回-1 (错误)。

    音频编解码器中的应用程序代码当前支持512000Hz 的位时钟。 任何其他位时钟频率都会导致函数返回-1 (错误)。

    AudioCodecConfig()需要修改以支持立体声24位回放。 代码将类似于 AudioCodecConfig 中提供的代码、但需要根据 TLV320AIC3254数据表修改寄存器值。 还需要在 CC3200上设置更多值。

    此致、
    Bryan Kahler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 我期待你的答复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bryan、
    感谢您的回复。

    我使用 了#define AUDIO_CODE_N_BIT AUDIO_CODE_16_BIT、以便可以在16和24之间轻松地更改这两个函数。

    是的、我看到两个函数中都缺少代码 RE 16位。 阻止我在4个通道上超过8kHz 的问题是否相同?

    我将按照您的建议再次查看数据表。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ben、

    当您提到4个通道时、您是否指的是 Ch1+Ch2 TX 和 Ch3+CH4 RX、例如立体声扬声器、立体声麦克风?

    您能更详细地解释一下您的项目吗?  您尝试耦合到哪种类型的音频编解码器(TLV320AIC3254)? 这将通过 I2S 实现吗?  您是否将为音频编解码器生成主时钟、并在音频编解码器上生成 PLL?

    CC3200 I2S 外设当前仅在主机模式下运行、并提供 BCLK、WCLK、DIN 和 DOUT。  根据规范、I2S 每个数据线路仅支持2个通道。  TLV320AIC3254 PLL 的最小输入时钟为512kHz。  

    在 CC3200的 WiFi 音频示例中、BCLK 以512KHz 满足音频编解码器 PLL 的最小输入、因为 BCLK = 2 * BitsPerSample * SamplesPerSecond、其中 BitsPerSample = 16且 SamPerSecond = 16000。

    在 SamplesPerSecond = 8000和 BitsPerSample = 24的情况下、BCLK 将为384kHz、远低于驱动 TLV320AIC3254 PLL 以生成音频主时钟所需的512kHz 最小输入 CLK。


    此致、
    Bryan Kahler

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

    您好、Bryan、

    >当您提到4个通道时,是否指 Ch1+Ch2 TX 和 Ch3+CH4 RX,例如立体声扬声器、立体声麦克风?

    当我说4个通道时、我是指每个模块上的2个通道 TX 和2个通道 RX。 在两个 CC32300AUDBOOST 上、我都可以在线路输入上播放音乐、在线路输出上播放耳机。 第一个电路板的 LineIn 从第二个电路板的 LineOut 起作用、而第二个电路板的 LineIn 从第一个电路板的 LineOut 起作用。

    >您能更详细地解释一下您的项目吗?  您尝试耦合到哪种类型的音频编解码器(TLV320AIC3254)? 这将通过 I2S 实现吗?  您是否将为音频编解码器生成主时钟、并在音频编解码器上生成 PLL?

    我的项目是为 I2S 音频创建一个(全双工)无线网桥、并利用剩余带宽进行一些通信(SPI 和 I2C)。 目前、我将重点介绍音频器件、并使用 TLV320AIC3254来协助进行原型设计/概念验证。 现在、根据 WiFi 音频示例、我使用 PLL 来生成时钟。

    >在 CC3200的 WiFi 音频示例中、BCLK 在512 KHz 时满足音频编解码器 PLL 的最小输入、因为 BCLK = 2 * BitsPerSample * SamplesPerSecond、其中 BitsPerSample = 16且 SamplesPerSecond = 16000。

    对于4个8kHz 16位通道、也满足该要求。 BCLK = 4 * 16 * 8000 = 512'000Hz。 该配置有效(因为 BCLK 与示例相同)。

    我正在努力调整 CCS 中的以下代码以生成自定义 BCLK (大于512kHz)。 即使阅读了相关参考页面:应用参考指南: http://www.ti.com/lit/an/slaa408a/slaa408a.pdf 。 页数:38、52和77。


    bitClk = bitsPerSample * bitrate * noOfChannels; if (bitClk =512000) { AudioCodecPageSelect (TI3254_PAGE_0); AudioCodecRegWrite (TI3254_CLK_MUX_REG、0x03);// PLL 时钟为 CODE_CLKIN AudioCodecRegWrite (TI3254_CLK_PLL_P_R_REG、0x94);// PLL 上电、P=1、R=4 AudioCodecRegWrite (TI3254_CLK_PLL_J_REG、0x2A);// J=42 AudioCodecRegWrite (TI3254_CLK_PLL_D_MSB_REG、0x00);// D = 0 AudioCodecRegWrite (TI3254_CLK_NDAC_REG、0x8E);// NDAC 分压器加电、NDAC = 14 AudioCodecRegWrite (TI3254_CLK_MDAC_REG、0x81);// MDAC 分频器加电、MDAC = 1 AudioCodecRegWrite (TI3254_DAC_OSR_MSB_REG、0x01);// DOSR = 0x0180 = 384 AudioCodecRegWrite (TI3254_DAC_OSR_LSB_REG、0x80);// DOSR = 0x0180 = 384 AudioCodecRegWrite (TI3254_CLK_NADC_REG、0x95);// NADC 分频器加电、NADC = 21 AudioCodecRegWrite (TI3254_CLK_mAdc_REG、0x82); // mAdc 分频器加电、mAdc = 2 AudioCodecRegWrite (TI3254_ADC_OSR_REG、0x80);// AOSR = 128 (((与 PRB_R1配合使用到 PRB_R6、ADC 滤波器类型 A) } 其他 { 返回-1; }

    我想针对 bitClk =1024000和其他几个问题扩展此内容。 我很难看到本示例中选择的值与参考指南中提供的公式是如何对应的。

    CODE_CLKIN = NADC * mAdc * AOSR * ADC_FS

    因此,在本例中,AOSR = 128,ADC_FS = 16kHz,CODEC CLKIN = PLL 时钟= 512000?

    但是 NADC * mAdc = 0.25? 这显然是不正确的。 我哪里出错了?

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

    您好 Ben、

    感谢您的详细回答!

    如果我弄错了、请纠正我的问题、但似乎 WiFi 音频示例当前以您要查找的模式运行。

    此示例运行您描述为4个通道(CC3200和 TLV320AIC3254之间的立体声 TX、立体声 RX)的模式。 为了实现这一点、使用了 I2S 外设的 DOUT 和 DIN 信号线。 DOUT 和 DIN 使用相同的 BCLK 和 WCLK。 在 TDM 等其他模式下、可以在单条数据线上传输2个以上的通道、这是绝对正确的、不过、WiFi 示例使用 I2S、而不是 TDM。

    根据 I2S 规范、每条数据线交错2个通道。 WCLK 高电平/低电平表示 CH1/CH2。 在 I2S 中、单个数据线不包含4个通道。 如下所示、在 WiFi 音频示例中、使用两条数据线来完成2通道 TX 和2通道 RX。

    对于 wifi 示例:

    BCLK (BCLK 参考8)*以512KHz 运行。 BCLK = 2通道* 16位* 16000 Hz = 512、000

    WCLK (FSYNC 参考7)*以16KHz 运行。 1字时钟的周期发生在完全传输期间、左通道的16位(低电平)和右通道的16位(高电平)。 WCLK = BCLK / 32位= 16、000

    DIN (DIN 参考9)*是承载扬声器的 R/L 声道 PCM 音频数据的数字线路。 DIN 上有2个通道。 采样率为每通道每秒16000次采样。 每个样本为16位。 因此、DIN 的比特率为每秒512000位。 DIN 比特率=(每个左通道16位/采样+每个右通道16位/采样)*每秒16000个采样=每秒51000位。 用另一种方式表示:2 * 16 * 16000 = 512000。

    DOUT (DOUT 参考10)*是从板载麦克风传送 R/L 声道 PCM 音频数据的数字线路。 DOUT 上有2个通道。 采样率为每通道每秒16000次采样。 每个样本为16位。 因此、DOUT 的比特率为每秒512000位。 DOUT 位速率=(每个左通道16位/采样+每个右通道16位/采样)*每秒16000个采样=每秒51000个位。 用另一种方式表示:2 * 16 * 16000 = 512000。

    *图2-1中的引脚参考。 CC3200AUDBOOST 板接口(www.ti.com/.../swru383.pdf)

    如果您的器件未按上述方式运行、请在运行期间附加 DIN、DOUT、BCLK 和 WCLK 的示波器/逻辑分析仪快照。

    此致、
    Bryan Kahler

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

    您好、Bryan、

    再次感谢-这种回应很有用、我想我可以澄清几个问题。

    >为实现此目的、I2S 外设的 DOUT 和 DIN 信号线均已使用。 DOUT 和 DIN 使用相同的 BCLK 和 WCLK。

    当然可以。 我需要2个通道"TX"(DOUT)和2个通道"RX"(DIN)。

    当我"按原样"运行 WiFi 音频演示时,一个板在 DOUT 上有2个通道 TX,但不使用 DIN,另一个板相反, DOUT 上没有任何内容,在 DIN 上有2个通道。

    通过查看代码、我注意到头文件中有许多定义。 (audiocodec.h)

    //每个样本的位宏
    #define AUDIO_CODE_8_BIT8
    #define AUDIO_CODE_16_BIT16
    #define AUDIO_CODE_20_BIT20
    #define AUDIO_CODE_24_BIT24
    
    
    //通道数量宏
    #define AUDIO_CODE_DEFAULT0
    #define AUDIO_CODE_MONO1
    #define AUDIO_CODE_STERICE_CODE_DECODE_DECODEC2
    #define3 #define AUDIO_REVERE_CODE_DECODE_DECODECODE_
    

    浏览 audiocodec.c 我注意到我的第一篇文章中显示的两个函数: AudioCodecConfig(...) 和 AudioCaptureRenderConfigure(...) 在主文件中调用并使用 AUDIO_CODE_STEREO 定义。

    请注意、我需要"反向立体声"或双工音频、我将这些实例改为 AUDIO_CODE_REVERSE_STEREO。 这不起作用、因为 PLL 时钟仅在 AudioCodecConfig (...)中设置为512kHz 功能。

    然而、通过将音频采样率降低至8kHz、再次计算出该函数中的 PLL 时钟为512kHz、系统工作正常-这次在两个电路板上同时使用 DOUT 和 DIN。

    我从您所说的内容中了解到、对于2 + 2通道16kHz 音频、I2S 位时钟应为512kHz (由于 DIN + DOUT)。 很遗憾、我没有找到正确配置的方法。

    我尝试更改 AudioCodecConfig (...) 返回 到 AUDIO_CODE_STEREO 并使用16kHz、但不再进行双工传输、因此更细微的事情很明显...

    为清楚起见、以下是示例中默认调用函数的方式:

    AudioCodecConfig (audio_codec_TI_3254、audio_codec_16_bit、16000、
    AUDIO_CODE_STEREO、AUDIO_CODE_SPEAKER_ALL、
    AUDIO_CODE_MIC_ALL);
    
    ...
    
    
    AudioCaptureRenderConfigure (AUDIO_CODE_16_BIT、16000、AUDIO_CODE_STEREO、RecordPlay、1); 

    这就是我所做的工作:

    AudioCodecConfig (audio_codec_TI_3254、audio_codec_16_bit、8000、
    audio_codec_reverse_Stereo、audio_codec_speaker_all、
    AUDIO_CODE_MIC_ALL);
    
    ...
    
    AudioCaptureRenderConfigure (audio_codec_16_bit、8000、audio_codec_reverse_Stereo、RecordPlay、1); 

    虽然这是我希望工作的内容:

    AudioCodecConfig (audio_codec_TI_3254、audio_codec_16_bit、16000、
    audio_codec_reverse_Stereo、audio_codec_speaker_all、
    AUDIO_CODE_MIC_ALL);
    
    ...
    
    AudioCaptureRenderConfigure (AUDIO_CODE_16_BIT、16000、AUDIO_CODE_REVERGE_STEREO、RecordPlay、1); 

    或者、更理想的情况是在该过程结束时:

    AudioCodecConfig (audio_codec_TI_3254、audio_codec_24_bit、48000、
    audio_codec_reverse_Stereo、audio_codec_speaker_all、
    AUDIO_CODE_MIC_ALL);
    
    ...
    
    AudioCaptureRenderConfigure (AUDIO_CODE_24_BIT、48000、AUDIO_CODE_REVERGE_STEREO、RecordPlay、1); 

    感谢您的所有帮助!

    此致、

    编辑:附录。 我认为这是上述两项职能的有关部分。

    void AudioCaptureRenderConfigure (unsigned char bitsPerSample、
    无符号短比特率、
    unsigned char noOfChannels、
    unsigned char RxTx、
    unsigned charDMA)
    {
    unsigned longbitClk;
    
    bitClk = bitsPerSample * bitrate * noOfChannels;
    
    IF (DMA)
    {
    if (bitsPerSample = 16)
    {
    MAP_PRCMI2SClockFreqSet (512000);
    MAP_I2SConfigSetExpClk (I2S_base、512000、bitClk、I2S_SLOT_SIZE_16|
    I2S_PORT_DMA);
    } 

    ^请注意 I2S 时钟和位时钟之间的隐含差异。

    int AudioCodecConfig (unsigned char codecId、unsigned char bitsPerSample、unsigned short bitrate、
    unsigned char noOfChannels、unsigned char 扬声器、unsigned char mic)
    {
    unsigned intbitClk = 0;
    
    if (codecId = audio_codec_TI_3254)
    {
    AudioCodecPageSelect (TI3254_PAGE_0);
    
    // BHC -我根据其中一个参考文档 Bryan 链接添加了 switch 语句。 对于16位情况、它与示例中提供的默认值相同。
    switch (bitsPerSample){
    
    case audio_codec_16_bit:AudioCodecRegWrite (TI3254_AUDIO_IF_1_REG、0x00);break;
    case audio_codec_20_bit:AudioCodecRegWrite (TI3254_AUDIO_IF_1_REG、0x10);break;// 0b 00 01 0 0 0 0 0
    case audio_codec_24_bit:AudioCodecRegWrite (TI3254_AUDIO_IF_1_REG、0x20);break;//^I2S ^20 Bits
    case audio_codec_32_bit:AudioCodecRegWrite (TI3254_AUDIO_IF_1_REG、0x30);break;
    
    默认值:return -1;
    }
    
    
    bitClk = bitsPerSample * bitrate * noOfChannels;
    if (bitClk =512000)
    {
    AudioCodecPageSelect (TI3254_PAGE_0);
    
    AudioCodecRegWrite (TI3254_CLK_MUX_REG、0x03);// PLL 时钟为 CODE_CLKIN
    AudioCodecRegWrite (TI3254_CLK_PLL_P_R_REG、0x94);// PLL 上电、P=1、R=4
    AudioCodecRegWrite (TI3254_CLK_PLL_J_REG、0x2A);// J=42
    AudioCodecRegWrite (TI3254_CLK_PLL_D_MSB_REG、0x00);// D = 0
    
    AudioCodecRegWrite (TI3254_CLK_NDAC_REG、0x8E);// NDAC 分压器加电、NDAC = 14
    AudioCodecRegWrite (TI3254_CLK_MDAC_REG、0x81);// MDAC 分频器加电、MDAC = 1
    AudioCodecRegWrite (TI3254_DAC_OSR_MSB_REG、0x01);// DOSR = 0x0180 = 384
    AudioCodecRegWrite (TI3254_DAC_OSR_LSB_REG、0x80);// DOSR = 0x0180 = 384
    
    AudioCodecRegWrite (TI3254_CLK_NADC_REG、0x95);// NADC 分频器加电、NADC = 21
    AudioCodecRegWrite (TI3254_CLK_mAdc_REG、0x82); // mAdc 分频器加电、mAdc = 2
    AudioCodecRegWrite (TI3254_ADC_OSR_REG、0x80);// AOSR = 128 (((与 PRB_R1配合使用到 PRB_R6、ADC 滤波器类型 A)
    }
    其他
    {
    返回-1;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、很明显、我不小心把东西弄乱了。 您是对的、默认情况下、该示例执行双工立体声16 kHz 16位音频。 重新安装 SDK 并再次尝试该示例证明了这一点。 很抱歉。

    我不确定"反向立体声"接头的点是什么、但这无关紧要。

    知道这是可行的、我现在将返回到我的基本查询-增加采样深度和采样率。 你的第一个答复谈到了这一点,我现在将对此加以处理。

    谢谢!