2369913_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2369913_zh-CN

2369913_zh-CN

[MCXN947] SAI_RxSetConfig()清除多通道 RX 的 RCR4.FCOMB - 错误确认请求
亲爱的恩智浦支持团队

我写这封信是为了报告我在 MCUXpresso SDK SAI 驱动程序中发现的一个潜在错误。fsl_sai.c)
同时开发 **主动降噪(ANC)**系统 **FDRM-MCXN947 **
评估板。请确认这是否是一个已知问题。
以及是否计划进行修复。

项目概述

我正在 FRDM-MCXN947 上构建一个实时 ANC 系统,音频硬件如下:

  • 4× INMP441 MEMS 传声器 - 用于 FxLMS 算法的前馈和误差传声器
  • 2× MAX98357A I2S 放大器 - 通过 SAI1 TXD0(P3_20)进行抗噪扬声器输出
  • 双核分割: Core0 处理所有 I/O(SAI DMA、LCD、外壳),Core1 运行 FxLMS
    DSP 算法。IPC 通过 MCMGR 邮箱,帧速率为 16 ms(256 个采样点 @ 16 kHz)。

该系统要求每 16 ms 帧同时捕获所有 4 个麦克风。
由于 MCXN947 只为 提供了 一条 用于 SAI1 RX 的 DMA 请求线
(kDma0RequestMuxSai1Rx = 101U),因此 FIFO 组合模式 (RCR4.FCOMB) 是
SDK 支持的唯一路径,可通过单个 DMA 通道同时接收 RXD0 和 RXD1。

发现错误

SDK 版本: MCUXpresso SDK (mcuxsdk-core, commit 0455af2)
驱动程序版本: fsl_sai v2.4.11 / fsl_sai_edma v2.7.4
文件: drivers/sai/fsl_sai.c

问题

SAI_RxSetConfig() 无条件清除 RCR4.FCOMB channelNums> 1,
,即使调用者明确设置 fifoCombine = kSAI_RXFifoCombineModeEnabledOnRead。

呼叫链是

  1. SAI_RxSetFifoConfig() (fsl_sai.c)第 1103-1105
    行)- 从 config->fifoCombine 正确设置 RCR4.FCOMB :

    rcr4 &= ~I2S_RCR4_FCOMB_MASK;
    rcr4 |= I2S_RCR4_FCOMB(config->fifoCombine);   // ← set correctly
    base->RCR4 = rcr4;
  2. SAI_RxSetConfig() (fsl_sai.c)第 1439-1444 行) -在 第 1 步之后运行 ,
    无条件清除:

    /* make sure combine mode disabled while multipe channel is used */
    if (config->channelNums > 1U)
    {
        base->RCR4 &= ~I2S_RCR4_FCOMB_MASK;   // ← always clears, ignores fifoCombine
    }
  3. SAI_TransferRxSetConfigEDMA() (fsl_sai_edma.c)第 362-368 行)--有一个 assert()
    ,正确地 要求 fifoCombine 在 channelNums> 1 时非零,但
    验证的是配置结构,而不是硬件寄存器。当
    RCR4.FCOMB 在硬件中已经为 0 时,断言通过。

第 2 步的注释说 "确保在使用多通道时禁用组合模式"
- 这似乎是将 TX 端逻辑错误地应用到了 RX 端。对于 RX,如 fsl_sai_edma.c 中的示例代码
所述,多通道 DMA需要使用 的 FIFO
组合模式。 第 340-350 行。

观察到的症状

调用 SAI_TransferRxSetConfigEDMA() 后, channelMask = kSAI_Channel0Mask | kSAI_Channel1Mask
和 fifoCombine = kSAI_RXFifoCombineModeEnabledOnRead:

  • SAI1->RCR4& I2S_RCR4_FCOMB_MASK == 0 (应为 2)
  • SAI RX FIFO 溢出错误在 AUDIO_CaptureStart() 时立即触发
  • kStatus_SAI_RxError 回调充斥系统(每秒数百次)
  • FreeRTOS UART 外壳任务(优先级 2)变得完全无响应
  • 未收到有效音频数据

恢复到单通道(仅 kSAI_Channel0Mask , channelNums=1)可立即恢复
完整系统运行。

次要问题 - 容易混淆的枚举值

fsl_sai.h 中的 _sai_fifo_combine 枚举 (第 272-277 行)使用对换的数值
表示 TX 和 RX 方向:

kSAI_FifoCombineModeEnabledOnRead      = 1U,  // TX only
kSAI_RXFifoCombineModeEnabledOnRead    = 2U,  // RX only

fsl_sai_edma.c 中的示例代码 第 348 行使用 kSAI_FifoCombineModeEnabledOnRead
(TX 枚举,值=1)进行 RX 配置。在
FSL_FEATURE_SAI_HAS_FIFO_COMBINE_MODE=1 的设备上,它会静默配置 RX 的写入组合而不是读取组合。


目前的解决方法

目前,我通过在 SAI_TransferRxSetConfigEDMA() 返回后手动恢复 RCR4.FCOMB
来解决这个问题:

SAI_TransferRxSetConfigEDMA(SAI1, &s_saiRxHandle, &rxConfig);

/* Workaround: fsl_sai.c:1443 clears RCR4.FCOMB unconditionally when channelNums>1 */
SAI1->RCR4 = (SAI1->RCR4 & ~I2S_RCR4_FCOMB_MASK) | I2S_RCR4_FCOMB(2U);

这很脆弱,需要绕过 SDK API 直接访问寄存器。

问题

  1. fsl_sai v2.4.11 中的 bug 是否已得到确认?
  2. 是否有已知的修复程序或修补版本?
  3. fsl_sai_edma.c:348 处的示例代码(kSAI_FifoCombineModeEnabledOnRead 用于 RX 时使用了
    )是有意为之还是文档错误?
  4. 有没有官方支持的方法可以
    在 MCXN947 上使用我可能错过的公共 SDK API 从 SAI1 RXD0 + RXD1 同时捕获?

完整的错误报告及完整的调用链分析附后。

感谢您的时间和支持。

致以最崇高的敬意,
Huynh Mao
[email protected]

音频(PDM | I2S | SAI)MCXCRe: [MCXN947] SAI_RxSetConfig() clears RCR4.FCOMB for multi-channel RX — bug confirmation request

你好@maohuynh、

感谢您的耐心等待。

首先,我可以确认fsl_sai v2.4.11和fsl_sai_edma v2.7.4已经是最新版本。
 
关于您的声明
"SAI_RxSetConfig() (fsl_sai.c)第 1439-1444 行)在步骤 1 之后运行",
,我有些担心。
 
查看fsl_sai.c 之后虽然SAI_RxSetConfig() 在行号上出现在 SAI_RxSetFifoConfig() 之后,但实际执行流程显示,只要启用了 FSL_SAI_HAS_FIFO_EXTEND_FEATURE,就会首先调用 SAI _ RxSetConfig(),然后在该函数内调用 SAI _RxSetFifoConfig ()。
 
这意味着启用 FSL_SAI_HAS_FIFO_EXTEND_FEATURE 后,RCR4_FCOMB 字段最终将被正确配置。
 

Celeste_Liu_0-1779869684528.png

至于在第1443行清除FCOMB,我的理解是该操作旨在手动重置指针,这与参考手册(RM)中的描述一致。
 

Celeste_Liu_1-1779870035296.png

因此,我目前认为这里没有错误。
如果您认为我的理解有误,请随时指出。
祝您有美好的一天。
 
BR
西莱斯特
Re: [MCXN947] SAI_RxSetConfig() clears RCR4.FCOMB for multi-channel RX — bug confirmation request

你好@maohuynh、

谢谢您的帖子。 我目前正在调查您提出的问题,并将尽快给您回复。

BR

西莱斯特

Re: [MCXN947] SAI_RxSetConfig() clears RCR4.FCOMB for multi-channel RX — bug confirmation request

您好@Celeste_Liu,
谢谢您的说明。
重新阅读源代码后,
,我同意 SAI_RxSetFifoConfig() 在清除后确实恢复了 RCR4.FCOMB - 您对执行顺序的解释是正确的。

然而,硬件故障的根本原因是另一个问题:枚举 _sai_fifo_combine 在 TX 和 RX 之间共享数值,但对于相同的数值,TCR4.FCOMB 和 RCR4.FCOMB 的硬件编码是相反的(在 PERI_I2S.h 中得到证实):

  • RCR4.FCOMB = 1 → 启用 FIFO 写入 (来自接收移位寄存器)--并非 DMA 所需的内容
  • RCR4.FCOMB = 2 → 启用 FIFO 读取 (通过软件/DMA) ← 正确用于多通道 RX DMA

fsl_sai_edma.c 中的示例代码第 348 行指示 fifoCombine = kSAI_FifoCombineModeEnabledOnRead(= 1),这是TX枚举。对于 RX DMA 读取来说,它的名称听起来没错,但其数值(1)映射的是 RCR4 上的写合并,而不是读合并。第 366 行的断言验证了同样的错误值,并默默通过,因此在硬件配置错误时没有报错。

我采用的变通方法是在 SAI_TransferRxSetConfigEDMA() 之后直接写入 I2S_RCR4_FCOMB(2U)。恩智浦能否确认第 348 行的示例是否应使用 kSAI_RXFifoCombineModeEnabledOnRead (= 2),以及是否应相应更新第 366 行的断言?

您能帮我检查一下吗?

BRs、

毛慧

Re: [MCXN947] SAI_RxSetConfig() clears RCR4.FCOMB for multi-channel RX — bug confirmation request

你好@maohuynh、

我已经审查了代码,你的观点很有道理。我会将此问题报告给我们的内部 SDK 团队,以便进一步修复。

BR

西莱斯特

Tags (1)
No ratings
Version history
Last update:
‎06-09-2026 04:28 AM
Updated by: