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.

[参考译文] CCS/TMDSLCDK138:McASP 音频环回示例 TDM 配置

Guru**** 2601915 points
Other Parts Discussed in Thread: TLV320AIC3106

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/647197/ccs-tmdslcdk138-mcasp-audio-loopback-example-tdm-configuration

器件型号:TMDSLCDK138
主题中讨论的其他器件:TLV320AIC3106

工具/软件:Code Composer Studio

您好!

我不熟悉 DSP 开发、我使用 StarterWare McASP 环回示例。 我想将 TDM 时分配置为让 TLV320AIC3106编解码器在不同的时隙上进行传输(将来、我们将有8个编解码器连接到同一总线)。 在给定的示例中、我将更改以下代码(8kHz、160个样本):

/*发送和接收部分都将使用的采样率*/
#define SAMPLING_RATE                        (8000u)

/*每个音频缓冲器要使用的样本数*/
#define NUM_SAMESS_PER_AUDIO_BUF            (160u)

通过这种更改、音频回送正常。 要激活音频编解码器上的 TDM、我已将文件 aic31.c 更改为使用256时钟传输(函数 AIC31DataConfig):

原始代码:

/*写入数据类型和 插槽宽度*/
 CodecRegWrite (baseAddr、AIC31_P0_REG9、(数据类型|插槽));

修改了代码(在 P0 REG9上添加了256时钟位激活):

/*写入数据类型和 插槽宽度*/
 CodecRegWrite (baseAddr、AIC31_P0_REG9、(数据类型|插槽| 0x08));

在主文件中、我更改了以下代码:

在 AIC31I2SConfigure 函数上(我们将有8个编解码器、对 R&L 通道进行采样、因此每个 TMD 帧有16个插槽、我希望编解码器在插槽2和3上传输、而不是像原来那样在0和1上传输、因此我已将偏移更改为从位32开始):

   /*配置数据格式和采样率*/
   //原始代码:AIC31DataConfig (SOC_I2C_0_regs、AIC31_datatype_I2S、SLOT_SIZE、0);
   AIC31DataConfig (SOC_I2C_0_regs、AIC31_datatype_I2S、SLOT_SIZE、32);

在""函数中、我已将 McASP 配置更改为使用16个插槽并在插槽2和3上处于活动状态(不是最初的0和1):

/*配置帧同步。 I2S 应采用 TDM 格式、具有2个插槽*/
   //原始代码:McASPRxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、2、MCASP_RX_FS_WIDTH_WORD、
   //                  MCBSP_RX_FS_EXT_BEGIN_ON_FRAGE_EDGE);
   //McASPTxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、2、MCASP_TX_FS_WIDTH_WORD、
   //                  MCBSP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);

  //配置16个插槽
   McASPRxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、16、MCASP_RX_FS_WIDTH_WORD、
                       McASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
   McASPTxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、16、MCASP_TX_FS_WIDTH_WORD、
                       McASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);

/*启用发送器/接收器插槽。 I2S 使用2个插槽*/
   //原始代码:McASPRxTimeSlotSet (SOC_MCASP_0_CTRL_regs、I2S_SLOTS);
   //McASPTxTimeSlotSet (SOC_MCBSP_0_CTRL_regs、I2S_SLOTS);

//将插槽2和3设置为在 McASP 串行器上处于活动状态
   McASPRxTimeSlotSet (SOC_MCBSP_0_CTRL_regs、0x000000C);
   McASPTxTimeSlotSet (SOC_MCBSP_0_CTRL_regs、0x0000000C);

我不知道我在配置中缺少什么、因为它不起作用、因此欢迎您提供任何帮助(我已经尝试过其他传输格式、例如左对齐格式或 DSP、结果是相同的)。

此致、

埃伊洛伊

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

    我们的团队需要一些时间来收集实验室中的数据。 请给我们几天时间、我们将会与您联系。

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

    当然、没问题。 我一直在研究该示例。 使用示波器、我看到音频编解码器正在发送数据、但 TX 线上没有数据返回到编解码器。

    我想我最初发布的一个问题是、使用左调整(LEFTJ 或 I2S)格式时、我假设 L&R 数据将一起发送。 但是、使用示波器时、我发现这是不正确的。 在 WCLK 上、"高"侧发送 L 音频、在"低"部分发送 R 音频。 因此、我假设我不需要16个插槽、而是需要8个插槽、因此我已将编解码器更改为使用16位偏移在插槽2上发送数据、并且只有8个插槽在插槽2上处于活动状态的 McASP:

    //发送16位偏移的数据
    AIC31DataConfig (SOC_I2C_0_regs、AIC31_datatype_I2S、SLOT_SIZE、16);

    //配置8个插槽
    McASPRxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、8、MCASP_RX_FS_WIDTH_WORD、
    McASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
    McASPTxFrameSyncCfg (SOC_MCASP_0_CTRL_regs、8、MCASP_TX_FS_WIDTH_WORD、
    McASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);


    //将插槽2设置为在 McASP 串行器上处于活动状态
    McASPRxTimeSlotSet (SOC_MCBSP_0_CTRL_regs、0x0000002);
    McASPTxTimeSlotSet (SOC_MCBSP_0_CTRL_regs、0x00000002);

    我看到的另一个问题是、在 I2SDataTxRxActivate 函数上、当编解码器不在 SLOT0上传输时、不能执行行"while (McASP_MCASP_0_CTRL_regs)& MCASP_TX_STAT_DATAREADY);"、因此对于我的测试、我已经将其注释掉。
    通过使用观察点/断点、我看到通信数据从 RX 缓冲区复制到主 while 循环上的 TX 缓冲区:

    /*复制缓冲区*/
    memcpy ((void *) txBufPtr [lastSentTxBuf]、
    (void *) rxBufPtr[lastFullRxBuf]、
    AUDIO_BUF_SIZE);

    它似乎是有效的数据,因为值正在变化(我没有对它进行解码:D),但使用断点我可以看到在 ISR 代码(函数"EDMA3CCComplisr")上,数据 Rx 发生了事件, 但"EDMA3GetIntrStatus (SOC_EDMA30CC_0_regs)&(1 << EDMA3_CHA_McASP0_TX)"部分中的 Tx 完整事件代码从未执行。

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

    您好、Eloy、

    有关初始化和配置的指导、请参阅以下文档:  

    以下是一些 E2E 帖子、有望为您指明正确的方向:

    请注意、Starterware 是我们无法再支持的传统软件。 当前支持的软件是 Processor SDK: http://www.ti.com/tool/PROCESSOR-SDK-C6748

    希望这对您有所帮助。

    最棒的

    Sahin

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

    感谢您的参考、我已经看到了它们。 现在、如果我在音频编解码器上使用 DSP 模式、EDMA 传输、并且如果我将 McASP 外设配置为使用8个32位插槽、DMA 副本的频率也会增加8倍。

    我已将 DMA 配置为复制整个帧(8个32位的插槽、256位)。 如果我将 McASP 设置为使用1个插槽、则一切正常、但如果我将其增加到8个插槽、则 DMA 发送 Rx 完成事件的速度将加快8倍、有什么原因? 从音频编解码器接收的帧同步信号和位时钟。

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

    回答我上一个帖子时、正确的做法是使 DMA 的 RX 完成事件速度提高8倍、因为我将每帧配置8个插槽。 我看到的是、如果我将编解码器配置为256时钟模式、在具有两个 R&L 通道(每通道16位)的第一个插槽上传输数据(DSP 模式)、并且 McASP 配置为使用1个插槽、一切都正常、但使用8个插槽时、数据会在帧上移位。 使用示波器(通道1是帧同步信号、通道3是编解码器输出数据)配置一个插槽(如下图所示)、数据被正确发送:

    但是、如果我激活 McASP 上的8个插槽、则数据不相等、并且它似乎在帧上移位:

    一个问题是 McASP 是否与帧同步信号同步。 我认为问题可能是当我激活8个时隙时、RBUF 将事件发送到 DMA、并且第一个接收到的事件可能来自"随机时隙"、而不是第一个时隙、因此音频样本会在帧上移位。 有可能吗?

    另一个问题是 McASP XTDM 和 RTDM 掩码。 为了在8个插槽(32位)上接收/发送数据、这两个插槽的配置值都是0x000000FF。 我不确定这是否正确。 在 McASP 手册中、XTDM 寄存器定义显示该值为"模32"(未在 RTDM 寄存器定义中指定)。

    此致、

    埃伊洛伊