2373820_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2373820_zh-CN

2373820_zh-CN

2S TDM 主设备:在连续 DMA 数据流期间持续向下移动 1 个插槽

1.测试配置

  • I2S 配置为TDM 主站,DSP 模式,短 WS
  • 每帧 8 个插槽,每个插槽 32 位,帧长 = 256 位
  • 使用fsl_i2s_dma驱动程序
  • 双缓冲器乒乓传输
  • FreeRTOS 任务等待来自 DMA 回调的信号,填满缓冲区,然后调用 I2S_TxTransferSendDMA 重新提交。
  • 测试数据模式:固定 0x000Axxxx(高 16 位 = 0x000A,低 16 位包含插槽索引和采样序列号)

2.持续的单槽下移(100% 可复制)

逻辑分析器捕获显示:
  • 传输的数据始终向下移动整整一个时隙
  • 插槽 0的数据出现在插槽 1的物理位置上
  • 插槽 1的数据出现在插槽 2的物理位置上
  • 推而广之,原本用于插槽 7的数据会出现在下一帧的插槽 0中(或丢失)。
  • 该偏移在数据流启动后保持稳定,不会随着时间的推移而进一步漂移,并保持固定的 1 个槽位偏移量

3.启动数据错位(间歇性)

逻辑分析仪偶尔会观察到
  • WS 帧同步脉冲之后,数据线在一段时间内保持在低电平(全部为零)
  • 空白 1~3 帧后,突然出现有效测试数据
  • 一旦空白间隔结束,数据仍会显示第 2 项所述的 第 2 项所述的 1 个槽偏移
    Xanderwangx_0-1780141578772.pngXanderwangx_0-1780141578772.png
音频(PDM | I2S | SAI)Re: 2S TDM Master: Persistent 1-slot downward shift during continuous DMA streaming

你好@Xanderwangx

感谢您的来信。你能告诉我们你使用的是哪款恩智浦微控制器吗?另外,你在使用我们的评估板还是定制板?您使用的是 SDK 示例代码,还是基于自己的实现?如果这是您自己的代码,您能否与我们分享以作进一步分析?
BR
西莱斯特
Re: 2S TDM Master: Persistent 1-slot downward shift during continuous DMA streaming

你好@Xanderwangx

谢谢您的答复。但是,RT 系列不在我的支持范围内。我主要支持 MCX 和 Kinetis 系列。另外,这是MCX频道,不适用于RT产品。

你能在 i.MX RT 跨界 MCU - NXP 社区 下写一篇新文章吗?RT 支持团队将能为您提供帮助。

BR

西莱斯特

Re: 2S TDM Master: Persistent 1-slot downward shift during continuous DMA streaming

MCU :MIMXRT685-EVK (i.MX RT685)
主板 :基于 RT685 的定制产品板。

我正在使用 带有乒乓缓冲区的
循环 DMA 模式 。 DMA 使用 2 个描述符配置
i2s_transferSendLoopdMA ()。在 DMA 回调中,我填充下一个缓冲区,循环自动继续。

void I2S1_TDM_Init(void)
{
    I2S_Type *base = I2S1;

    /* I2S Configuration */
    i2s_config_t cfg;
    I2S_TxGetDefaultConfig(&cfg);
    cfg.masterSlave = kI2S_MasterSlaveNormalMaster;
    cfg.mode        = kI2S_ModeDspWsShort;     /* TDM = DSP mode */
    cfg.divider     = 24576000 / (TDM_SAMPLE_RATE * TDM_SLOT_NUM * TDM_SLOT_WIDTH);
    cfg.dataLength  = TDM_SLOT_WIDTH;          /* 32-bit */
    cfg.frameLength = TDM_FRAME_LENGTH;        /* 256-bit */
    cfg.oneChannel  = false;
    cfg.position    = 0;
    cfg.wsPol       = true;                    /* DSP A or B */
    I2S_TxInit(base, &cfg);

    /* Enable 8 slots (Primary + 3 Secondary Channels) */
    /* Note: Using 4 channels to cover 8 slots with 32-bit data */
    I2S_EnableSecondaryChannel(base, kI2S_SecondaryChannel1, false, 32 * 2);
    I2S_EnableSecondaryChannel(base, kI2S_SecondaryChannel2, false, 32 * 4);
    I2S_EnableSecondaryChannel(base, kI2S_SecondaryChannel3, false, 32 * 6);

    /* DMA Loop Transfer Setup */
    DMA_Init(DMA0);
    DMA_EnableChannel(DMA0, I2S_TX_DMA_CH);
    DMA_SetChannelPriority(DMA0, I2S_TX_DMA_CH, kDMA_ChannelPriority3);

    DMA_CreateHandle(&dma_handle, DMA0, I2S_TX_DMA_CH);
    I2S_TxTransferCreateHandleDMA(base, &i2s_handle, &dma_handle,
                                  I2S1_Callback, tdm_xfer);
    I2S_TransferInstallLoopDMADescriptorMemory(&i2s_handle, tdm_desc, 2);

    if (I2S_TransferSendLoopDMA(base, &i2s_handle, &tdm_xfer[0], 2)
            != kStatus_Success) {
        while (1);  /* Fails if TDM_FRAMES * 8 > DMA_MAX_TRANSFER_COUNT(1024) */
    }
}

插槽偏移量在电源循环之间是随机的,并非固定值。我之前还尝试过在 DMA 传输前后禁用中断以强制同步,但插槽错位的问题仍然存在。
在 RT685 上,I2S_TransferSendLoopDMA() 是否保证 DMA 启动时对齐到帧边界?如果不行,该如何强制对齐到 WS 边界?
i.MX-RT600 

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎06-16-2026 03:34 AM
更新者: