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.

[参考译文] UDMA-AM243X:如何同时使用2个不同的 MCU-PLUS-SDK 实例

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1379715/mcu-plus-sdk-am243x-how-to-use-2-different-udma-instances-at-the-same-time

器件型号:MCU-PLUS-SDK AM243X

工具与软件:

目前、我的设置是 OSPI 有1个 UDMA 实例、该实例使用 uDMA_INST_ID_BCDMA_0、我想为 UART 添加另一个 UDMA 实例、即 uDMA_INST_ID_PKTDMA_0。

但第二个"udma_chOpen()"失败、因为"drvHandleInt->drvInitDone"尚未完成。 如果我调试这个函数、它会运行到"uDMA_chPair ()"并返回失败。

因此、我在评估模块的 UART DMA echo 示例中对其进行测试、并观察到如果我在代码中添加另一个实例(通过在 example.syscfg 中添加它):

/* UDMA driver instance object */
Udma_DrvObject          gUdmaDrvObj[CONFIG_UDMA_NUM_INSTANCES];
/* UDMA driver instance init params */
static Udma_InitPrms    gUdmaInitPrms[CONFIG_UDMA_NUM_INSTANCES] =
{
    {
        .instId             = UDMA_INST_ID_PKTDMA_0,
        .skipGlobalEventReg = FALSE,
        .virtToPhyFxn       = Udma_defaultVirtToPhyFxn,
        .phyToVirtFxn       = Udma_defaultPhyToVirtFxn,
    },
    {
        .instId             = UDMA_INST_ID_BCDMA_0,
        .skipGlobalEventReg = FALSE,
        .virtToPhyFxn       = Udma_defaultVirtToPhyFxn,
        .phyToVirtFxn       = Udma_defaultPhyToVirtFxn,
    },
};

CONFIG_UDMA_NUM_INSTANTS 也增加到2。 但 FW 也停止在"UDMA_chOpen ()"中的"UART_udmaInitRxCh ()"、就像在我的上面的应用中一样、还没有实际使用第二个 UDMA。
那么、我的问题是如何同时使用2个实例、特别是1个用于 OSPI、1个用于 UART (使用 pdma)。
是否有可能以这种方式使用它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Khoa le

    我正在查看您的 问题 ,您可能会在一两天内得到回复。

    此致、

    Anil。

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

    只是为了更新、我分离了 UDMA 对象(即、对于 UART 而言是 UDMA0、对于 OSPI 而言是 UDMA1)后就开始工作了。

    这是否意味着1个外设只允许使用1个 uDMA?

    在本例中、我需要 在 uDMA 中使用2个以上的外设(ospi、uart、cpsw、可能还有更多)、我该怎么做?

    我检查的测试:

    +uart dma echo 示例、然后在 udma0上启用 ospi udma ->不起作用(可能在 UART 和 ospi udma 之间发生冲突?)

    +uart dma echo 示例、然后在 udma1上启用 ospi udma ->有效(在 uart_udmaInitRxCh ()处不存在 stuckt)

    +enet_L2_cpsw_switch 示例、然后启用 UART (使用 与 cpsw 相同的 CONFIG_UDMA_PKTDMA_0)、OSPI (UDMA0上的 BCDMA_0)->不工作 (UART_udmaInitRxCh ()处的 stuckt)

    +enet_L2_cpsw_switch 示例、然后启用 UART (使用 与 cpsw 相同的 CONFIG_UDMA_PKTDMA_0)、OSPI (UDMA1上的 BCDMA_0)->不工作 (UART_udmaInitRxCh ()处的 stuckt)

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

    你好、Khoa le

    有两个 DMA 模块。 一个是 DMSS (数据移动子系统)和 PDMA。

    PDMA 主要用于通过 PKTDMA 在外设之间向目标存储器传输数据、DMSS 用于在具有 BCDMA 通道的存储器之间传输数据。

    通过系统 cfg、可以启用 BCDMA 和 PKTDMA。

    从 BCDMA 您可以分配多个信道、而不会出现问题。

    对于 PKTDMA、您只能启用 PDMA + PKTDMA 配置、并且只能为其分配一个通道和其余通道、您需要手动操作。

    我可以在这个问题上提出错误。

    现在、您可以临时修复如下所示的问题。

    BCDMA 频道:  

    1. 已启用 uDMA + BCDMA  

    2.从系统 cfg 配置多个通道  

    PKTDMA 通道:  

    1.启用 uDMA + PKTDMA  

    2.在您的用例中、CPSW 使用 PKTDMA、因此在 CPSW 示例中定义了 UDMA 目标文件、无需再次配置它们。

    现在,你需要为 UART 启用 PKTDMA。 在这个过程中、您需要为 TX 和 RX 通道执行手动 uDMA 目标配置。

    为此、只需重复使用 uDMA 目标从 UART DMA 示例中生成的相同文件即可  

    此致、

    Anil。

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

    您好、感谢您的回复。

    据我所知(我在你解释后重新表述我的理解):

    1/有2个 UDMA 模块、每个模块都可以用作 DMSS (与 BCDMA 配置配合使用)或 PDMA (与 PKTDMA 配置配合使用)。

    2/在每种配置(BCDMA 或 PKTDMA)中、有多个通道(取决于哪个 DMA)、然后可用于移动数据(或仅在 BCDMA 中可用)。

    但我看到 PDMA0或1仅限于某些外设(如 SPRUIM2G 第6118页中的说明- 2020年5月- 2023年7月修订):

    这意味着、如果我的器件使用 UART0 (仅 PDMA0可用)和 UART2 (仅 PDMA1)、那么我必须使用2个 PDMA、因此我必须对2个 UART 使用2个 UDMA。 和其他 BCDMA 所需的通信也不可用 ?

    3目前在 PKTDMA 下、没有添加通道的选项。 这并不意味着在 PKTDMA 中只有1个 通道可用、但这只是一个错误、我 需要从 UART 手动添加配置?

    在这种情况下、您意味着什么配置?

    正如我所观察到的、我只需要在 UART 外设下启用 DMA 模式和 Umda 对象、然后从 example.syscfg 中生成的文件已包含 UART DMA 对象。 但它仍然在  UART_udmaInitRxCh()停止(就像上面提到的)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、这意味着如果我的器件使用 UART0 (仅 PDMA0可用)和 UART2 (仅 PDMA1可用)、那么我必须使用2个 PDMA、因此我必须将2个 UDMA 用于2个 UART。 和其他 BCDMA 所需通信不可用 ?[/QUOT]

    SoC 上有两个 PDMA 并它们是固定的。

    您无需费心去考虑有多少个 PDMA。 每个 PDMA 支持不同的外设。

    因此、用户需要为每个 外设配置通道编号。

    例如、您需要为 UART0启用 DMA。

    在这种情况下、应 使用一个 PKTDMA 即时正确配置 Tx 和 RX (2)通道编号  

    3/目前在 PKTDMA 下、没有添加频道的选项。 这并不意味着在 PKTDMA 中只有1个 通道可用、但这只是一个错误、我 需要手动添加 UART 中的配置?[/QUOT]

    是的、这是软件错误。 要添加更多 PKTDAM 信道、您需要手动操作。

    在您的用例中,CPSW 已经为 PKTDMA 和 UART + DMA 使用了两个通道,您需要手动操作。 y

    [报价 userid="550120" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1379715/mcu-plus-sdk-am243x-how-to-use-2-different-udma-instances-at-the-same-time/5279186 #5279186"]

    1/有2个 UDMA 模块、每个模块都可以用作 DMSS (与 BCDMA 配置配合使用)或 PDMA (与 PKTDMA 配置配合使用)。

    [报价]

    是的、您的理解是正确的。

    [报价 userid="550120" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1379715/mcu-plus-sdk-am243x-how-to-use-2-different-udma-instances-at-the-same-time/5279186 #5279186"]2/在每种配置(BCDMA 或 PKTDMA)中、有多个信道(取决于具体使用哪一个 DMA)、然后这些信道可用于移动数据(或仅在 BCDMA????中提供)。

    是的、您的理解是正确的。 在 BCDMA 或 PKTDMA 上有不同的通道。 我们需要为每个外设分配单独的通道  

    您能告诉我 DMA 需要哪些外设 以及您正在使用哪个版本的 MCU+SDK 吗?

    所以、我可以创建一个示例、尝试添加2BCDMA 和2PKTDAM 通道分配。

    如果您需要更多通道、则必须以类似的方式执行此操作。

    此致、

    Anil。

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

    您好!

    目前我需要:CPSW (PKTDMA)、OSPI (BCDMA)、 SA2UL (PKTDMA)和 UART (PKTDMA)。

    谢谢

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

    你好、Khoa le

    我可以尝试为  OSPI (BCDMA)、 SA2UL (PKTDMA)和 UART (PKTDMA)创建示例。

    而且,你需要做同样的添加更多的 PKTDMA 通道.

    此致、

    Anil。

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

    您好!

    谢谢您、我会在提供示例时再试一次。

    此致

    Khoa

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

    尊敬的 Anil:

    这些示例有问题吗?

    此致、

    Khoa

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

    您好、Khoa

    很抱歉回复延迟。

    请查看随附的文件、我已创建3个 UART、其中包含1个 PKTDMA 和1个 BCDMA 通道分配、没有遇到任何问题。

    在这里,想法是,我们需要启用 BCDMA 和 PKDTDMA 即时 ,在 这些情况下 ,我们可以创建更多的通道.

    我已经启用了1个 PKTDMA 和1个 BCDMA 实例。

    接下来、对于每个外设、我们需要发送相同的即时消息、但不同的通道。

    目前、当我们为 UART 配置更多 PKTDMA 通道时、UART_DMA open 函数会产生错误。

    TI 生成的代码应立即指向相同的 PKTDMA、但  由于这一原因、它指向不同的 PKTDMA 即时、我们在打开通道时遇到问题。 我暂时修复了这个问题、我会在内部提出该错误、以便在下一个版本中修复它。

    对于您的用例、您需要执行以下步骤。

    目前、您需要:CPSW (PKTDMA)、OSPI (BCDMA)、SA2UL (PKTDMA)和 UART (PKTDMA)应用。

    我们 需要1个 BCDMA 和1个 PKTDMA 实例。

    步骤:  

    1.在 PKTDMA 下,你需要分配不同的通道。

    在上面的示例中、CPSW 模块是一个大模块、所以请看这个示例。

     PKTDMA 即时已由 CPSW 驱动程序初始化、并且 TX 和 RX 通道也从系统 cfg 分配。

    2.接下来、为 OSPI 启用 BCDMA 模块并查看如何在 SBL 中使用 OSPI DMA。   在该示例中、您需要执行类似的步骤。

    3.接下来,您需要 SA2UL。 只需启用加密模块、现在就可以像我们在 SA2UL 示例中所做的那样集成代码。

    4.对于 UART、无需从系统 cfg 启用 PKTDMA、只需将 UART DMA 配置为从系统 cfg 启用。

    如果您仍然遇到此问题、请按照上述步骤操作并共享集成代码。 所以、我可以对它进行处理。

    e2e.ti.com/.../uart_5F00_echo_5F00_dma_5F00_am64x_2D00_evm_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    此致、

    Anil。

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

    尊敬的 Anil:

    您可以在 AM243x EVM 电路板上再试一次吗?

    我曾尝试在 am243x EVM 上复制您的示例、但仍然 遇到相同的问题:

    [MAIN_Cortex_R5_0_0]置位:0.5602s:UART/V0/DMA/UDMA/UART_DMA_UDMA.c:UART_udmaInitRxCh:129:UDMA_SOK == RetVal 失败!!

    (项目文件如下所示)。

    我所测试的内容:

    1/我 尝试在 SDK 08.06.00.42 (mcu_plus_sdk_am243x_08_06_00_43)上复制您的示例、但出现了相同的问题。

    2/我看到您使用的 SDK 是9.xxx、因此我重复使用该 SDK (mcu_plus_sdk_am243x_09_02_00_50)、会出现相同的问题。

    e2e.ti.com/.../sdk_5F00_09_5F00_02_5F00_00_5F00_50_5F00_uart_5F00_echo_5F00_dma_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    3/我将 am64 EVM 的目录与我的 EVM 进行了比较、结果表明没有区别(共享存储器配置和 AM64内核除外)。

    4/我认为可能是我 不小心更改了 SDK 中的某些内容。 因此、我使用新下载的 SDK (mcu_plus_sdk_am243x_08_06_00_45)进行了重试。 没有损坏、出现了相同的问题。

    5/我想 SDK 9.xx 可能会更好、所以我在较新的 SDK (mcu_plus_sdk_am243x_09_02_01_05)上再次进行了测试、但它在相同的地方也会失败。

    e2e.ti.com/.../sdk_5F00_09_5F00_02_5F00_01_5F00_05_5F00_uart_5F00_echo_5F00_dma_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    在这两个测试中、我都添加了 SDK 9.xx:

    #include
    extern UART_UdmaChConfig gUartUdmaChConfig[CONFIG_UART_NUM_DMA_EVENTS];

    gUartUdmaChConfig[1U].drvHandle =&gUdmaDrvObj[0];
    gUartUdmaChConfig[2U].drvHandle =&gUdmaDrvObj[0];

    以了解两个文件夹之间的相似性。

    我还查看了您提供的示例项目、其中显示3个 UART 实例仅使用  来自 udma0的 PKTDMA、而不是1个 PKTDMA 和1个 BCDMA? 是另一个例子吗?

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

    您好、Khoa

     由于我今天正在接受训练、我可以在明天上午以 EOD 或明天上午的方式回复。

    我已经在我身边进行了验证,与上述项目没有遇到任何 udma_driver_open 问题.

    我需要再检查一次、然后回复给您。

    此致、

    Anil。

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

    您好、Khoa

    你可以看看下面的图片吗?

    因此、 在我的测试设置中使用一个 PKTDMA+一个 BCDMA 示例来加载3个 UART 时不会出现问题。

    我已在 AM64X 上进行了测试、这与 AM243器件相同。

    我还要查看您提供的示例项目、其中显示3个 UART 实例仅使用  来自 udma0的 PKTDMA、而不是1个 PKTDMA 和1个 BCDMA? 是另一个例子吗?

    正如我上面提到的,我们需要启用一个 BCDMA 和一个 PKTDMA 即时.

    在此即时下、我们可以创建许多通道。

    目前、我确实启用了一个 PKTDMA 瞬间、之后我 启用了3个通道。

    在加载09.02 以上版本示例之前、您是否可以确认已使用09.02二进制文件初始化 SOC?

    因为、除了资源分配外、从 CCS 加载上述示例时没有问题。

    所以,只需尝试用09.02版本二进制文件刷新 SOC ,看看你是否能加载它.

    此致、

    Anil。

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

    尊敬的 Anil:

    现在、当我从库中导入示例 EVM 项目(UART echo DMA 和 uDMA ADC)时、uDMA 会像在上面一样在初始化指令处停止。

    即使我删除了 SDK 8.6.0.43和9.2.0.50并从 CCS (Resource Explorer)中重新安装、但没有效果。

    所以这很奇怪、上次我在测试时讲过、在将 EVM 项目导入到 IDE 时、这应该会起作用。

    我将在今天晚些时候在另一台 PC 上尝试。

    此致、

    Khoa

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

    您好、Khoa

    请在您完成测试后告诉我结果。

    此致、

    Anil。