iMxRT104x:SAI/DMA 中断,频率为 192 kHz。 你好 我们正在实施一个音频应用程序,运行频率为 48kHz、96kHz 和 192kHz。 SAI 源时钟由内部音频 PLL 生成。(49.152 MHz) 我们将 SAI1 配置为 Tx0(异步/领导)和 Rx0(同步)。 SAI FIFO 以 16 个字激活(默认中间值) SAI Tx 和 Rx 由 DMA 通道驱动。DMA 与 2 个连锁 TCD 配合使用(创建双缓冲机制)。 SAI 使用 2 个通道/24 位(32 位对齐字)。 下面是一个关于采样率变化的示例 // SubDivSamples is 4/8/16 respectively for 48/96/192 kHz
uint32_t singleBufferSize = 2 * sizeof(int32_t) * getSubDivSamples();
uint32_t minorLoopSize = 8 * sizeof(int32_t);
EDMA_PrepareTransfer(
&transferConfig,
txBuffer0,
sizeof(int32_t),
(void *)sai1TxRegAddr,
sizeof(int32_t),
minorLoopSize,
singleBufferSize,
kEDMA_MemoryToPeripheral);
EDMA_TcdSetTransferConfig(TxTcd0, &transferConfig, TxTcd1);
EDMA_TcdEnableInterrupts(TxTcd0, kEDMA_MajorInterruptEnable);
EDMA_PrepareTransfer(
&transferConfig,
txBuffer1,
sizeof(int32_t),
(void *)sai1TxRegAddr,
sizeof(int32_t),
minorLoopSize,
singleBufferSize,
kEDMA_MemoryToPeripheral);
EDMA_TcdSetTransferConfig(TxTcd1, &transferConfig, TxTcd0);
EDMA_TcdEnableInterrupts(TxTcd1, kEDMA_MajorInterruptEnable);
EDMA_InstallTCD(DMA0, mTxDmaHandle.channel, TxTcd0);
EDMA_StartTransfer(&mTxDmaHandle);
SAI_TxEnableDMA(SAI1, kSAI_FIFORequestDMAEnable, true);
SAI_TxSetChannelFIFOMask(SAI1, 1U << kSaiTxChannelId);
SAI_TxEnable(SAI1, true); 然后发生频率为 12kHz 的 Tx 中断。(每个 4 个采样点,48kHz;每个 8 个采样点,96kHz,......)。 我监测 Tx 和 Rx 中断回调(使用 GPIO)和 I2S 信号(BCLK、SYNC、TX、Rx) 在 48kHz 和 96kHz 频率下一切运行良好。 但当我将采样率改为 192kHz 时,系统就会停止运行。 我可以看到 I2S BCLK 和 SYNC 是正确的。 我可以看到第一次中断频率为 192kHz(约 14 个 DMA 周期),然后就停止了。 我可以将采样率改回 48kHz,但中断始终无法恢复。 如果有人有想法 Re: iMxRT104x : SAI /DMA interrupt Stop at 192 kHz. 我终于找到了解决办法。我的问题是由于内存中位于 TCD 之前的缓冲区溢出,改变了 TCD 的内容。 现在代码工作得非常完美。 Re: iMxRT104x : SAI /DMA interrupt Stop at 192 kHz. 你好@ju_fz, 根据 TCSR 值(0x90170001),检测到三个标志:
FIFO 请求标志:指示启用的发送 FIFO 出现欠载。向该字段写入逻辑 1 可清除该标记。
FIFO 警告标志:指示启用的发送 FIFO 已空。
FIFO 错误标志:指示启用的发送通道 FIFO 中的字数小于或等于发送 FIFO 水印。
这些标志表明 DMA 无法足够快地传输数据,无法阻止它们被触发信号。这可能有多种原因,如其他中断或 CPU 速度慢。这也解释了为什么在较低的采样率下不会出现这个问题。请确保及时处理中断,以便 DMA 能顺利传输数据。 BR Habib
Re: iMxRT104x : SAI /DMA interrupt Stop at 192 kHz. 你好 感谢您的回复。 SAI FIFO 大小始终为 32 字。 我已将 FIFO 水印安装为 16。 我在几种情况下检查了 TCSR: 48kHz 时:0x90100001 表示无错误 192kHz 时:0x90170001 表示 FIFO 出错 我尝试在 DMA 中断中检测 SAI FIFO 错误标志。我在中断的入口和输出端进行了测试。中断期间未检测到错误,但 DMA 停止。 我尝试禁用 Rx SAI/DMA。发送仍停留在 192kHz。 目前我还没有更多的线索。 朱利安 Re: iMxRT104x : SAI /DMA interrupt Stop at 192 kHz. 您好@ju_fz, 抱歉回复晚了。
问题可能与先进先出超限有关。为了缩小范围,您是否可以尝试将 FIFO 的大小增加到最大值 32 个字,如第 37.3.4 章所述参考手册的 " 数据 FIFO "?
此外,请检查发送控制寄存器 (TCSR) 中的错误状态标志,详见第 37.5.1.4 节、查看是否报告了任何错误状态。
BR Habib
記事全体を表示