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.

[参考译文] TMDS64EVM:MCSPI_TRANfer 导致的中断延迟

Guru**** 2442090 points
Other Parts Discussed in Thread: SYSCONFIG, AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1543369/tmds64evm-interrupt-delay-due-to-mcspi_tranfer

器件型号:TMDS64EVM
主题中讨论的其他器件:SysConfig

工具/软件:

您好、TI 支持团队。

SDK 为 MCU_PLUS_SDK_am64x_08_06_00_45。
我想问一个有关 CR5 中断和 MCSPI_TRANSFER 的问题。

通过 PRU_ICSSG1_PR1_HOST_INTR_PEND_0 以 20kHz 的频率向 CR5 生成来自 PRU 的中断。
此外、在 CR5 中、使用 MCSPI_transfe 函数和计时器中断 (1kHz) 来执行 20 字节 SPI 传输。
在本例中、20kHz 处理程序的中断优先级为 1、1kHz 中断优先级为 5。

如果只有 20kHz 中断、20kHz 中断处理程序将定期调用。
然而、如果执行 1kHz 计时器中断的 SPI 传输、则 20kHz 中断发生的时序将移位。 请参阅下图。

这可能是因为通过 MCSPI_TRANfer 禁用了中断。

我想在 SPI 传输期间定期调用 20kHz 中断处理程序、而不会禁用中断。


此外、MCSPI_TRANfer 的处理时间很长。
从上图可以看出、大约需要 30 μ s。


请告诉我如何解决这个问题。

此致、

今泉清正。

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

    您好、

    如需参考、请浏览以下常见问题解答:  【常见问题解答】SK-AM64B:MCSPI 集成指南 

    现在、来回答您的问题。

    我们必须注意的事项很少。

    使用 MCSPI_transfe 函数和计时器中断 (1kHz) 来执行 20 字节的 SPI 传输。

    从该语句中可以看出、MCSPI 传输将每 1kHz 调用一次。 我们需要确保 MCSPI 传输所需的理论时间(这个计算可以牢记要传输的 MCSPI 数据长度/字节以及 MCSPI 的工作频率)小于计时器中断数、因为我们需要确保在调用另一个 MCSPI 传输之前完成电流传输。  

    此外、MCSPI_tranfer 的处理时间很长。
    从上图可以看出、它需要将近 30 μ s。

    为了解决这个问题、我想让您看看 MCSPI 的不同工作模式、即中断、轮询和 DMA、以及它们的性能数字。

    可以在以下目录下找到不同的模式: sdk_install_path/examples/drivers/mcspi

    不同模式的性能数据可在以下位置找到: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/11_01_00_17/exports/docs/api_guide_am64x/DATASHEET_AM243X_EVM.html#autotoc_md554

    谢谢、

    Vaibhav

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

    您好 Vaibhav Kumar。

    感谢您的答复。

    MCSPI 用于 DMA 模式。
    该时钟为 1.5MHz、并传输 20 个字节。

    因此、数据传输时间为 107us (=20*8/1.5e6)、小于 1ms。

    我调查了 DMA 设置。
    在 UDMA_eventConfig 中调用 HwiP_construct、但设置了优先级=1。
    20kHz 中断优先级为 1。
    这会导致调用 20kHz 中断处理程序时延迟。

    因此、有必要降低 MCSPI 中的 DMA 中断优先级。
    我在 MCSPI DMA 模式下更改了 DMA 中断优先级、如下所示。
    这是正确的吗?
    如果还有其他方法、请告诉我。

    -----

    uint32_t intNum = 75;// DMASS0_INTAGGR_0_INTAGGR_VINTR_PEND_51
    uint32_t 优先级= 5;//与 1kHz 中断相同
    HwiP_disableInt (intNum);
    HwiP_clearInt (intNum);
    HwiP_setPri (intNum、priority);//更改中断优先级
    HwiP_enableInt (intNum);
    -----

    此致、
    今泉清正。

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

    您好 Vaibhav Kumar。

    其他说明:
    我看了不同模式下的性能数字。
    根据报告、DMA 模式下的吞吐量很慢。 中断模式速度最快、那么 DMA 模式为什么会更慢?

    此致、
    今泉清正。

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

    您好、

    时钟为 1.5MHz

    我建议使用此处显示的列表中的一个受支持的时钟频率:  关于:【常见问题解答】SK-AM64B:MCSPI 集成指南 

    在 SysConfig 设置中、我看到您已配置 3 引脚模式、请将其设置为 4 引脚模式、以确保使用所有 4 线时钟、MISO、MOSI 和 CS。

    因此、有必要降低 MCSPI 中的 DMA 中断优先级。
    我在 MCSPI DMA 模式下更改了 DMA 中断优先级、如下所示。
    这是正确的吗?
    请告诉我是否有其他方法。

    我正在测试一个示例应用、以了解分配中断优先级的理想方法。 请允许我在这方面的某个时候、我等待你对我的上述评论采取行动。

    谢谢、

    Vaibhav

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

    您好、

    我已经观察到我的中断优先级也设置为 1。

    调用/设置的位置如上面的屏幕截图所示。 您可能还会注意到、我在 AM243 EVM 中运行了上述程序、但这不会是问题、因为在本例中、该流程几乎与 AM64x-EVM 类似。 对于我来说、中断号也是 75、优先级显示为 1。

    因此、根据您分享的信息、我们基于相同的理由。

    我想说的是、设置中断优先级的理想方法是在 UDMA_event.c 文件中将该值硬编码为自定义值(在本例中为 5)。

    基本上是对该值进行硬编码

    hwiPrms.Priority = 5

    然后重新构建库以确保更改已保存、然后您需要重新构建正在使用的应用程序。

    希望这有所帮助。

    谢谢、

    Vaibhav

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

    您好 Vaibhav Kumar。

    感谢您的答复。

    关于 1.5MHz (1500000Hz)、这是否意味着应将其设置为 1.5625MHz (1562500Hz)

    我不使用 CS 引脚、因此我特意使用 3 引脚模式。

    我不想重建库、因此想使用上面的 HwiP_setPri 更改优先级。
    是否可以如上所述使用 HwiP_setPri 更改优先级?


    此致、
    今泉清正。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不想重建库、所以我想使用上面的 HwiP_setPri 更改优先级。
    是否可以如上所述使用 HwiP_setPri 更改优先级?

    使用 hwi_setPri 会产生误差?

    请告诉我。

    谢谢、

    Vaibhav

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

    您好 Vaibhav Kumar。


    HwiP_setPri 未导致错误。 可以正确更改优先级。
    但是、SDK API 参考未包含 HwiP_setPri 函数、因此我无法确定是否可以使用它。
    我意识到使用它是可以的。

    我还有两个问题。

    1.请详细介绍 MCSPI 传输模式。
    我不理解中断模式和 DMA 模式之间的区别。
    您能详细解释一下吗?
    DRIVERS_MCSPI_HLD_PAGE.html 中提供了 SDK 的说明、但不包含任何详细信息。


    2.另外,请告诉我为什么 DMA 模式和中断模式之间的速度不同。
    在 DMA 模式下、传输时间非常慢。

    (不同模式下的 MCSPI 驱动器性能:software-dl.ti.com/.../DATASHEET_AM243X_EVM.html

    此致、

    今泉清正。

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

    您好、

    HwiP_setPri 不会导致错误。 可以正确更改优先级。
    但是、SDK API 参考未包含 HwiP_setPri 函数、因此我无法确定是否可以使用它。
    我意识到使用它是可以的。

    感谢您的调查结果并测试该 API 的工作情况。

    [引述 userid=“574260" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1543369/tmds64evm-interrupt-delay-due-to-mcspi_tranfer/5945434

    1.请详细介绍 MCSPI 传输模式。
    我不理解中断模式和 DMA 模式之间的区别。
    您能详细解释一下吗?
    DRIVERS_MCSPI_HLD_PAGE.html 中提供了 SDK 的说明、但不包含任何详细信息。


    2.另外,请告诉我为什么 DMA 模式和中断模式之间的速度不同。
    在 DMA 模式下、传输时间非常慢。

    [/报价]

    我参与了一些高优先级问题、因此请期待对此问题的答复有所延迟。

    感谢您的耐心。

    此致、

    Vaibhav

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

    您好、

    1. 请详细介绍 MCSPI 传输模式。
    我不理解中断模式和 DMA 模式之间的区别。
    您能详细解释一下吗?
    DRIVERS_MCSPI_HLD_PAGE.html 中提供了 SDK 的说明、但不包含任何详细信息。

    有 3 种传输模式(轮询,中断和 DMA)、要了解它们、请通读 AM64x TRM 的以下部分: 12.1.4.4.8

    TRM 链接: https://www.ti.com/lit/ug/spruim2h/spruim2h.pdf?ts = 1753872061045&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FAM6442

    2. 此外、请告诉我 DMA 模式和中断模式之间的速度为什么存在差异。
    在 DMA 模式下、传输时间非常慢。

    我将通过 MCSPI 环回和 MCSPI DMA 应用(随 SDK 一起提供)浏览它们、分享最新 SDK 的更新数字。

    谢谢、

    Vaibhav

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

    对于 128 字节传输:

    EOC 中断

    轮询

    DMA

    对于 1024 字节传输:我看到轮询与 DMA 相比有所改进。

    轮询

    DMA

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

    您好 Vaibhav Kumar。

    感谢您的详细回答。

    我想知道的是在下图中、在 DMA 模式下吞吐量会降低的原因。

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

    请同时回答以下问题:
    关于 1.5MHz、这是否意味着我应该在 SysConfig 中将其设置为 1562500Hz、而不是 1500000Hz?

    此致、

    今泉清正。

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

    您好、

    是否应该在 SysConfig 中将其设置为 1562500Hz、而不是 1500000Hz?

    是 1562500 应该是理想值、因为在 50MHz 上作用为 32 的分频器值将产生 1562500。 由于分频器为 2 的幂、因此我们无法实现 1.5MHz。

    请告诉我、在设置 1.5MHz 时、您是否看到波形上的确切频率? 这将是一个很好的方法来决定是使用 1.5 还是 1.56。

    关于吞吐量、我认为为 DMA 写入的时间不正确、我将建议在下一个版本中修复此问题。

    目前使用性能数据表链接中提到的设置、这就是我看到的内容。

    请注意、以下是按照中断顺序轮询、然后是 DMA。

    谢谢、

    Vaibhav

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

    您好、

    我想知道的是为什么 DMA 模式下的吞吐量在下面的吞吐量图中会降低。

    我已经提交了一个文档错误来修复这些数字,谢谢。

    此致、

    Vaibhav

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

    您好 Vaibhav Kumar。

    当 I 将 SysConfig 中的“Clock Frequency (Hz)“设置为 1500000 时、实际测量的时钟值为 1.449MHz。
    但是、当我将其设置为 1562500 或 1562000 时、根本不会出现时钟波形。
    为什么没有显示时钟?
    设置为 1500000 时显示 1.449MHz 是否正确?
    我本来期待 1.56MHz、但事实似乎并非如此。
    SDK 是 8.6.0.45。

    此致、
    今泉清正。

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

    尊敬的 Kiyomasa:

    SDK 为 8.6.0.45。

    MCSPI 驱动程序随着 MCU+ SDK 的 8 个新版本进行了改进、我想您查看版本说明: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/11_01_00_17/exports/docs/api_guide_am64x/RELEASE_NOTES_PAGE.html

    如果您可以在最新的 SDK 上测试它、并告诉我一些有用的值。

    谢谢、

    Vaibhav

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

    您好 Vaibhav Kumar。

    我更改为最新的 SDK (11_01_00_17)。
    接下来、我还升级了 CCS (12.50 -> 12.81) 和 SysConfig (1.14.0 -> 1.23.0)。

    我导入了工程 (SDK 08_06_00_45)、并将属性设置为最新的 SDK 和 SysConfig 版本。
    然后、我打开 example.syscfg。
    我收到以下警告:
    我应该选择哪种型号?
    我不知道 AM6442 与 D、E 和 F 之间的差异


    我还确认 MCSPI 正在使用 UDMA (PKTDMA)。
    它似乎导致了如下所示的错误。

    我的工程已经将 UDMA (PKTDMA) 用于 UART、因此不能用于 MCSPI。

    似乎很难使用最新的 SDK 进行构建。

    请告诉我是否可以正确导入工程。

    此致、
    今泉清正。

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

    附加说明。
    我在工程中使用了 IPC_RPMSG、但在新环境中构建 ti_drivers_config.c 时、发生了以下错误。

    ——

    SYSCFG/ti_drivers_config.c:601:88:Error:expression
    601 | rpmsgParams.vringTxBaseAddr[CSL_CORE_ID_A53SS0_0]=(uintptr_t)(&gIpcSharedMem[]);
    |^
    生成 1 个错误。

    ——

    TI_drivers_config.c

    /* Total Shared memory size used for IPC */
    #define IPC_SHARED_MEM_SIZE               (0U)
    
    /* Shared Memory Used for IPC.
    *
    * IMPORTANT: Make sure of below,
    * - The section defined below should be placed at the exact same location in memory for all the CPUs
    * - The memory should be marked as non-cached for all the CPUs
    * - The section should be marked as NOLOAD in all the CPUs linker command file
    */
    uint8_t gIpcSharedMem[IPC_SHARED_MEM_SIZE] __attribute__((aligned(128), section(".bss.ipc_vring_mem")));
    

    为什么 IPC_SHARED_MEM_SIZE 为 0?

    我认为这是导致错误的原因。

    此致、

    今泉清正。

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

    附加说明。

    找到了有关 ipc_rpmsg 错误的以下信息:

    e2e.ti.com/.../5031502

    我的工程使用 ipc_rpmsg 在 CR5 和 CA53 之间进行通信。
    但是、CA53 项目是在不同的环境中构建的、而不是在 CCS 中构建的。
    请告诉我如何解决 CCS 中的编译错误。

    此致、

    今泉清正。

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

    您好、

    我还确认了 MCSPI 正在使用 UDMA (PKTDMA)。
    它似乎导致如下所示的错误。

    在我的设置中、错误不可重现、因为我添加了使用 DMA 工作模式的 UART 和多个 MCSPI 实例。

    对于构建问题、我想再提出一个 e2e、请让我知道在您创建另一个 e2e 后、我会将此 IPC 构建问题分配给相关专家。

    [引述 userid=“574260" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1543369/tmds64evm-interrupt-delay-due-to-mcspi_tranfer/5956540

    我在工程中使用了 IPC_RPMSG、但在新环境中构建 ti_drivers_config.c 时、发生了以下错误。

    ——

    SYSCFG/ti_drivers_config.c:601:88:Error:expression
    601 | rpmsgParams.vringTxBaseAddr[CSL_CORE_ID_A53SS0_0]=(uintptr_t)(&gIpcSharedMem[]);
    |^
    生成 1 个错误。

    ——

    TI_drivers_config.c

    全屏
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    /*用于 IPC 的总共享存储器大小*/
    #define IPC_SHARED_MEM_SIZE (0U)
    /*用于 IPC 的共享内存。
    *
    *重要:确保以下,
    *-对于所有 CPU、下面定义的部分应放置在内存中的完全相同位置
    *-所有 CPU 的内存应标记为非缓存
    *-该段应在所有 CPU 链接器命令文件中标记为“NoLoad"</s>“
    */
    Uint8_t gIpcSharedMem[ipc_shared_MEM_size]__attribute__((aligned (128)、section(“.bss.ipc_vring_mem")“)));
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    为什么 IPC_SHARED_MEM_SIZE 为 0?

    我认为这是导致错误的原因。

    [/报价]

    谢谢、

    Vaibhav

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

    您好 Vaibhav Kumar。

    关于 MCSPI 构建错误、我通过删除 SysConfig 中的 MCSPI 实例、然后重新配置它来解决该问题。

    对于构建问题、我再提出一个 e2e。
    请检查它。
    TMDS64EVM:如何使用最新的 SDK (11_01_00_17) 构建通过 SDK 08_06_00_45 创建的工程

    此致、

    今见清正。

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

    您好、

    我希望您能够在另一个问题得到解决后继续访问。

    一些待处理的操作包括:  

    [引用 userid=“531612" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1543369/tmds64evm-interrupt-delay-due-to-mcspi_tranfer/5954655

    MCSPI 驱动程序随着 MCU+ SDK 的 8 个新版本进行了改进、我想您查看版本说明: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/11_01_00_17/exports/docs/api_guide_am64x/RELEASE_NOTES_PAGE.html

    如果您可以在最新的 SDK 上测试它、并告诉我一些有用的值。

    [/报价]

    谢谢、

    Vaibhav