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.

[参考译文] AM2434:MMC 中断 CAN't 在 PRU 中断中设置

Guru**** 2445440 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1200042/am2434-mmc-interrupt-can-t-be-set-in-pru-interrupt

器件型号:AM2434
"Thread:SysConfig"中讨论的其他器件

您好、Champs:

在 R5代码中、客户启用了 PRU 和 MMC 中断。 PRU 的优先级高于 MMC。 在 PRU ISR 函数中、它会与 MMC 进行通信。  MMCSD1_NORMTR_STS(正常中断状态寄存器,0FA0 0030h)和 MMCSD1_ERROR_INTR_STS(错误中断状态寄存器,0FA0 0032h)寄存器中的中断状态位未设置。  
客户启用了所有中断。  

为什么不能在 PRU 中断中设置 MMC 中断?




谢谢
此致
闪亮

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

    尊敬的 Shine:

    MMC 是否向 R5F/VIM 生成中断应该与 PRU 是否也向 R5F/VIM 生成中断无关。 这也与 VIM 无关、因为您认为 MMC 外设本身不会生成中断。

    如果 PRU 中断(未执行 PRU ISR)被禁用、MMC 是否会生成中断(在 MMCSD1_NORMTR_STS 或 MMCSD1_ERROR_INTR_STS 中设置的标志)?

    此致、
    弗兰克

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

    尊敬的 Frank:

    感谢您的大力支持。

    客户正在使用 TI 的 SDK、其中的中断由 Hwip_irq_handler_c ()函数处理。 同时、MMCSD1_NORMAL _INTR_STS_EN 和 MMCSD1_ERROR_INTR_STS_EN 中的中断均已启用。 PRU ISR 进程退出后、便可进入 MMC ISR。 关键是、在 PRU ISR 中、当 MMC 进行通信时、您可以看到 MMCSD1_NORMTR_STS 和 MMCSD1_ERROR_INTR_STS 中断标志未设置。 仅当 PRU ISR 退出时、才  可以设置 MMCSD1_NORMAL _INTR_STS 和 MMCSD1_ERROR_INTR_STS 中断标志。

    我想知道、如何在高优先级中断 ISR 中获得低优先级中断状态标志? ? ? 或者、有可能吗?

    谢谢
    此致、
    闪亮

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

    尊敬的 Shine:

    Wendy Jiang 说:
    PRU 的优先级高于 MMC 的[/报价]

    我假设您在使用 IRQ、并且您参考的是 VIM PRU (ICSSG)与 MMC 中断优先级。 是这样吗?

    中断的 VIM 优先级对外设寄存器(此处为 MMC)中生成的中断状态位没有影响。

    您是否在使用非 RTOS? 根据文档、没有 RTOS 支持 IRQ 中断嵌套: https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_05_00_24/exports/docs/api_guide_am243x/KERNEL_NORTOS_PAGE.html#autotoc_md490

    在 MMC ISR 清除 MMC 状态寄存器后、PRU ISR 是否会中断 MMC ISR (因为其优先级较低)? 退出 PRU ISR 后、MMC ISR 将恢复。

    此致、
    弗兰克

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

    尊敬的 Frank:

    非常感谢。  

    下面是客户的回复。

    我假设您使用的是 IRQ、而是指的是 VIM PRU (ICSSG)与 MMC 的中断优先级。 这是否正确?


    是的、我在 PRU ISR 中禁用了所有中断、然后使用了 MMC。 MMC 器件可以正确接收数据、在发送数据后中断标志应设置为1、但我检查了  MMCSD1_NORMTR_STS 和 MMCSD1_ERROR_INTR_STS 、但它们未设置为1。  

    谢谢
    此致
    闪亮

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

    尊敬的 Shine:

    如果您完全禁用 PRU 中断并执行您当前在 MMC ISR 内使用 PRU ISR 进行的 MMC 处理、会出现什么行为? 您是否看到预期的行为?

    如果您将 PRU 和 MMC ISR 设置为相同的中断优先级该怎么办?

    您能给我发送一个展示行为的玩具示例、以便我可以让您更好地进行调试吗?

    此致、
    弗兰克

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

    尊敬的 Frank:

    PRU 中断已完全禁用、MMC 中断状态为正常。 MMC 发送数据后、可以将 MMCSD1_NORMTR_STS 中的 Xfer_complete 设置为 他所需的1。

    BTW、客户很抱歉、他没有可以证明此问题的合适测试代码。

    谢谢
    此致
    闪亮

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

    尊敬的 Frank:

    下面是客户的 MMC SDIO 配置、它不在 PRU ISR 中。 当  MMC 发送/接收数据时、Xfer_complete 的状态也在改变。  


    .ssBaseAddr = CSL_MMCSD1_SS_CFG_BASE、
    .ctrlBaseAddr = CSL_MMCSD1_CTL_CFG_BASE
    .inputClkFreq = 200*1000000U、
    .outputClkFreq = 4*1000000U、
    .ClockEdge = SDIO_CLOCK_EDGE_FALLING、
    .enableDma = true、
    .intrEnable = true、
    .intrNum = 166u、
    .busWidth = SDIO_WIDTH_4BIT、
    .busVoltage = SDIO_VOLT_3_3V、
    .Callback = SDIO_IRQHandler、
    }、

    MMCSD1_NORMAL_INTR_STS_ENA = 0xFFFF;
    MMCSD1_ERROR_INTR_STS_ENA = 0xFFFF;
    MMCSD1_NORMAL_INTR_SIG_ENA = 0xFFFF;
    MMCSD1_ERROR_INTR_SIG_ENA = 0xFFFF;

    静态空 SDIO_IRQHandler (void *arg)

    const SDIO_Attrs * SDioAttrs =(const SDIO_Attrs *) arg;
    const CSL_MMC_ctlcfgRegs *preg=(const CSL_MMC_ctlcfgRegs *)(sdioAttrs->ctrlBaseAddr);

    uint16_t regErr = 0u;
    uint16_t regNor = 0u;
    uint16_t respVal [8]={0};

    regErr = CSL_REG16_RD (&PRG->ERROR_INTR_STS);
    regNor = CSL_REG16_RD (&PRG->NORMAL_INTR_STS);

    IF (regNor 和 CSL_MMC_CTLCFG_NORMAL_INTR_STS_CMD_COMPLETE_MASK)

    flgResp=1;
    }

    IF (regNor 和 CSL_MMC_CTLCFG_NORMAL_INTR_STS_BUF_RD_READY_MASK)

    flgResp=2;
    }

    CSL_REG16_WR (&PRG->ERROR_INTR_STS、0xFFFF);
    CSL_REG16_WR (&PRG->NORMAL _INTR_STS、0xFFFF);

    }

    静态 uint16_t SDIO_StateCode ()

    const CSL_MMC_ctlcfgRegs *preg=(const CSL_MMC_ctlcfgRegs *)(gSdioAttrs->ctrlBaseAddr);

    uint16_t regErr;
    uint16_t regNor;
    uint16_t resCode = 0;

    regErr = CSL_REG16_RD (&PRG->ERROR_INTR_STS);
    regNor = CSL_REG16_RD (&PRG->NORMAL_INTR_STS);

    IF (regNor 和 CSL_MMC_CTLCFG_NORMAL_INTR_STS_CMD_COMPLETE_MASK)

    resCode=1;
    }

    IF (regNor 和 CSL_MMC_CTLCFG_NORMAL_INTR_STS_BUF_RD_READY_MASK)

    resCode=2;
    }
    /*
    CSL_REG16_WR (&PRG->ERROR_INTR_STS、0xFFFF);
    CSL_REG16_WR (&PRG->NORMAL _INTR_STS、0xFFFF);
    */
    返回 RESCode;

    }



    谢谢
    此致
    闪亮

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

    尊敬的 Shine:

    我看了 SDK 08.05 MMCSD 驱动程序。 我不是该驱动程序的专家、但根据我的判断、不支持中断模式。

    • SysConfig 没有"中断启用"开关。 生成的代码集 gMmcsdAttrs[0].intrEnable 为 false。
    • 在驱动程序内(.. 如果 attrs->intrEnable 为 true,则注册\source\drivers\mmcsd\v0\mmcsd_v0.c:MMCSD_open ()。
    • MMCSD_ISR()是一个空函数。

    另外、通过查看 SDK 的发行说明、我可以看到 MMCSD R5F 驱动程序的注释"Interrupt mode not tested": https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_05_00_24/exports/docs/api_guide_am243x/RELEASE_NOTES_08_05_00_PAGE.html

    我循环在 MMCSD 驱动程序专家进一步评论,如果我错了。

    客户使用什么 SDK 软件进行 MMCSD 传输? 客户如何启用和注册 MMCSD 软件的中断?

    我希望确保我了解客户想要做什么。 您能否确认我在下面的总结是正确的?

    摘要:

    • 在 R5F 上执行软件。
    • 最终用例。
      • 使用 VIM 上的 MMCSD1_EMMCSDSS_INTR_0输入、路由至 IRQ。
      • 使能中断。
    • 使用 ICCSGn、Prum。
      • 使用 VIM 上的一个 PRU_ICSSG0_PR1_HOST_INTR_pend_0-7中断输入、路由到 IRQ。
      • 使能中断。
    • PRU 中断设置为高于 MMCSD 中断的优先级。
    • 在 PRU ISR 内部:
      • MMCSD 用于读取和/或写入。
      • 客户期望在 MMCSD 读取/写入完成后、在位于 PRU ISR 内部时更新 MMCSD1_NORMAL _INTR_STS 位。 这些状态寄存器位在 PRU ISR 中未按预期更新。
      • 客户需要 MMCSD1_NORMTR_STS 位来更新 PRU ISR 内的位、以实现代码的正确运行。
    • 客户禁用了 MMCSD 中断、在 PRU ISR 中观察到相同的行为。 这似乎表明中断嵌套不会导致问题。
    • 如果禁用 PRU 中断、则 MMCSD 正常运行。 读取/写入完成后、MMCSD1_NORMAL _INTR_STS 位已正确设置。

    如何在 PRU ISR 内设置决定 MMCSD1_NORMTR_STS 位的客户?

    在 PRU ISR 内部、这些寄存器的值是什么:

    • MMCSD1_NORMAL_INTR_SIG_ENA
    • MMCSD1_NORMAL_INTR_STS_ENA

    如果在 PRU ISR 外部调用 MMCSD 读取/写入、这些寄存器的值是多少?

    如果在 PRU 内部使用了另一个中断、例如 DMTimer、客户是否会看到相同的行为?

    此致、
    弗兰克

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

    尊敬的 Frank:

    客户使用什么 SDK 软件进行 MMCSD 传输?

    SDK 8.5.0.24

    客户如何启用和注册 MMCSD 软件的中断?

    HwiP_Params hwiPrms;
    if ((sdioAttrs->intrEnable == true)&&(sdioAttrs->Callback!= NULL))

    HwiP_Params_init (&hwiPrms);
    hwiPrms.intNum = sdioAttrs->intrNum;
    hwiPrms.callback = sdioAttrs->Callback;
    hwiPrms.args =(void *) sdioAttrs;
    hwiPrms.priority = 0x03;
    状态= HwiP_structure (NULL、&hwiPrms);
    }

    如何在 PRU ISR 内设置决定 MMCSD1_NORMTR_STS 位的客户?

    MMC 发送数据后、客户读取 MMCSD1_NORMTR_STS 以查看是否 Xfer_complete  设置为1。


    如果在 PRU ISR 外部调用 MMCSD 读取/写入、这些寄存器的值是多少?


    谢谢
    此致
    闪亮

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

    尊敬的 Shine:

    我知道客户正在使用自己的 SDIO 驱动程序。 是这样吗?

    您能否确认我的上述总结是否正确?

    感谢您在 PRU ISR 外部共享 MMCSD1_NORMAL_INTR_SIG_ENA / MMCSD1_NORM_INTR_STS_ENA。 根据您的快照、我了解:

    • MMCSD1_NORMAL_INTR_SIG_ENA = 0x7FFF
    • MMCSD1_NORMAL_INTR_STS_ENA = 0x7FFF

    在 PRU ISR 中、这些寄存器的值是什么?

    如果使用了另一个中断而不是 PRU、例如 DMTimer、客户会看到相同的行为吗? 对他们来说、这应该是一个简单的实验。

    我想不出在 ISR (PRU 或其他)内屏蔽(或不更新) MMCSD 状态寄存器更新的原因。 我认为这与 PRU 主机中断、R5F VIM 或 SDK IRQ 处理程序无关。

    我将此主题重新分配给一位在 MMCSD 方面拥有更多专业知识的同事。

    此致、
    弗兰克

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

    尊敬的 Frank:

    非常感谢。

    下面是客户的回复。

    摘要:

    • 在 R5F 上执行软件。 可以
    • 最终用例。
      • 使用 VIM 上的 MMCSD1_EMMCSDSS_INTR_0输入、路由至 IRQ。  可以
      • 使能中断。  可以
    • 使用 ICCSGn、Prum。
      • 使用 VIM 上的一个 PRU_ICSSG0_PR1_HOST_INTR_pend_0-7中断输入、路由到 IRQ。

    PRU_ICSSG1_PR1_HOST_INTR_pend_1,PRU_ICSSG1_PR1_HOST_INTR_Pend_2,PRU_ICSSG1_PR1_HOST_INTR_pend_3,PRU_ICSSG1_PR1_HOST_INTR_pend_4

      • 使能中断。  可以
    • PRU 中断设置为高于 MMCSD 中断的优先级。

    是,PRU=1,MMCSD=15。μ s 如果将 MMCSD 优先级更改为其他值、例如4、结果是相同的。  

    • 在 PRU ISR 内部:
      • MMCSD 用于读取和/或写入。 可以
      • 客户期望在 MMCSD 读取/写入完成后、在位于 PRU ISR 内部时更新 MMCSD1_NORMAL _INTR_STS 位。 这些状态寄存器位在 PRU ISR 中未按预期更新。  可以
      • 客户需要 MMCSD1_NORMTR_STS 位来更新 PRU ISR 内的位、以实现代码的正确运行。 可以
    • 客户禁用了 MMCSD 中断、在 PRU ISR 中观察到相同的行为。 这似乎表明中断嵌套不会导致问题。

    MMCSD1_NORMAL _INTR_STS。 无法将 Xfer_complete 设置为1

    • 如果禁用 PRU 中断、则 MMCSD 正常运行。 读取/写入完成后、MMCSD1_NORMAL _INTR_STS 位已正确设置。 可以

    在 PRU ISR 中、这些寄存器的值是什么?

    如果使用了另一个中断而不是 PRU、例如 DMTimer、客户会看到相同的行为吗?  

    是的、DMTimer 可以正确运行。



    谢谢
    此致、
    闪亮

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

    尊敬的 

    要更深入地分析  问题,客户是否可以共享该问题 被复制的项目? 这样可以节省我们重新创建项目的时间。 客户可以选择删除所有他们的专有软件、并从 SDK 代码库中将问题复制到香草软件上。

    这确实可以将调试速度加快几天。

    谢谢。此致、
    Aakash

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

    尊敬的 Shine:

    感谢您的答复。

    从您的快照来看、我了解 MMCSD1_NORMAL _INTR_SIG_ENA/MMCSD1_NORMAL _INTR_STS_ENA 在 PRU ISR 中具有以下设置:

    • MMCSD1_NORMAL_INTR_SIG_ENA = 0x7FFF
    • MMCSD1_NORMAL_INTR_STS_ENA = 0x7FFF

    这些看起来是正常的。

    是,DMTimer 可以正确运行。

    显而易见、当您采用 DMTimer ISR 时、您能够在 ISR 内部使用 MMCSD 软件、并且 MMCSD 运行正常? 我想你已将 DMTimer 中断优先级设置为与 PRU ISR 相同(当它内置到代码中时)? 这表明 PRU 中断存在一些问题。

    我同意 Aakash 的观点、再次请求提供一个演示此行为的示例。 我了解客户编写了自定义 MMCSD 驱动程序软件。  此外、我们很难使用 SDK MMCSD API 重新创建此目标配置、因为它们当前不支持中断模式(Aakash、请确认)。

    此致、
    弗兰克

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

    尊敬的 

    对于初学者、我们可以举个例子、使用 PRU 和 DMTimer 进行演示、这对我们来说也是一个很好的开始。 我们可能需要更多的资料,以说明如何需要更改 MMCSD,但这将使我们能够更好地提供支持。

    此致、
    Aakash

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

     Aakash 和 Frank、您好!

    感谢您的大力支持。

    好的。 我已经联系过客户、询问他是否愿意为我们提供测试项目。  

    我一收到就会立即将其发布在此处。  

    谢谢
    此致、
    闪亮