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.

[参考译文] J721EXCPXEVM:SPI TX 将截断发送的消息。

Guru**** 2430620 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1534243/j721excpxevm-spi-tx-will-truncate-the-transmitted-message

器件型号:J721EXCPXEVM


工具/软件:

1.DUT:使用的器件是具有 GESI 板扩展板的 Jacinto J721e EVM 载板。

2.处理器内核:我正在 MCU2_1 R5F 内核上进行开发。

3.操作系统:我为操作系统运行 RTOS。

4. SDK 版本: 我目前仅使用 SDK/PDK (ti-processor-sdk-rtos-j721e-evm-10_01_00_04) 进行库和调用。

5、硬件设置:GESI 板上的 SPI3 引脚 (J16 #13 - CLK;J5 #12 - D0、#4 - CS1) 连接到示波器。

6、 软件:我附加了一个示例源代码,我可以用它来生成问题。 这个.c 文件包含 SPI 设置和说明;其中包含一个 CMakeLists.txt 文件、用于显示构建配置。

除了在 MCU2_1 R5F 上运行外、mcu1_0 上还设置了 sci 服务器。

e2e.ti.com/.../6835.main.ce2e.ti.com/.../6835.CMakeLists.txt

7.预期行为:它应该传输我传递到 transaction.count 的字节数。

8.会发生什么:它不会。 在这种情况下、它会将消息截断一个字节。 其他代码获取最后五个或更长的消息、最后十五个被截断。

9、其他主板:我还没有在其他主板上测试过。

10.频率:每次加载新映像时发生。

11、诊断/调试:我已经尝试了改变消息的大小,截断发生在任何大小。 更改 transaction.count 会增加它、但如果我发送一条 64 字节的消息、似乎很愚蠢地告诉它实际上是 65 字节。 在其他代码中、这(大小)并不总是可预测的(发送整个 128 字节缓冲区的结果是仅发送 113 个字节)。

12.日志等

以下情况的 O 型示波器输出:

SPI3 寄存器:

e2e.ti.com/.../mcspi3.txt

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

    您好:

    线程中的线程  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1526811/j721exsomxevm-transmitting-data-over-spi3-and-spi6-only-transmits-one-byte

    您提到 SPI3 和 SPI6 的所有 Tx 相关问题均已解决。 对吗? 现在发生了什么变化?

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您提到了 SPI3 和 SPI6 的所有 Tx 相关问题均已解决。 正确?

    针对传输多个字节已解决、但还有其他几个问题未得到解答。

    • 为什么启用 FIFO 即使我们有合适的芯片选择、也只发送一个字节?
    • 仍然有某种事件、中断或类似的事件会切断消息。 这是什么操作?
    • 为什么在回调模式下不调用回调?

    我没有回答这些问题、而是继续前进。

    现在发生了什么变化?

    我现在要传输更多字节、并注意到短时间的变化。 我也使用 CS1 移到了通道 1、因为片选确实是必要的。

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

    我观察到了以下情况:我已经开始调试、重新编译库以进行调试(使用-O0 进行修改后的优化)、否则会优化大量资源。 我通过在 spi_v1.c 的第 901 行放置断点 (ti-processor-sdk-rtos-j721e-evm-10_01_00_04/pdk_jacinto_10_01_00_25/packages/ti/drv/spi/v1/spi_v1.c src)

            if ((SPI_MASTER      == chObj->spiParams.mode) &&
                (MCSPI_SINGLE_CH == hwAttrs->chMode))
            {
                /* Force SPIEN line to the inactive state.*/
                McSPICSDeAssert(hwAttrs->baseAddr, chNum);
            }

    无论是否启用 FIFO、“Continue"都“都将打印整个消息。 我修改了此代码并注释掉了“McSPICSDeAssert"行“行并尝试不带断点、然后打印出整个消息。

    将 SPIEN 置于非活动状态的事情会截断这些消息! 为什么这会截断消息、是否有解决方法?

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

    您好:

    您可以使用中断模式、对吧?

    在中断模式下、主驱动程序启用 TX 为空、RX 已满和字末计数中断。  从驱动器启用 RX 完全中断。 TX/RX 数据在 ISR 中处理。
    在轮询模式下、主驱动器连续向 TX FIFO 写入 1 字节的 TX 数据 、然后从 RX FIFO 读取 1 字节的 RX 数据、直到所有数据都传输完毕。 从驱动器从  RX FIFO 中持续读取 1 字节数据、然后向 TX  FIFO 写入 1 字节 TX 数据、直到所有数据都传输完毕。
    某些将 SPIEN 置于非活动状态的操作正在截断这些消息! [/报价]

    显然、如果您处于非活动状态 SPIEN、则传输不会在此时发生、这是基本 SPI 协议。 在完全传输后、只会调用此置为无效。

    在中断模式下、它将确保在 ISR 中调用“置为无效“、并且仅在完成传输后调用此项、而不会截断数据。  
    [引述 userid=“652899" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1534243/j721excpxevm-spi-tx-will-truncate-the-transmitted-message/5901917 #5901917“]

    无论是否启用 FIFO、“Continue"都“都将打印整个消息。 我修改了此代码并注释掉了“McSPICSDeAssert"行“行并尝试不带断点、然后打印出整个消息。

    将 SPIEN 置于非活动状态的事情会截断这些消息! 为什么这会截断消息、是否有解决方法?

    [/报价]
    这强调了您正面临计时问题、并且在成功完成传输之前正在发生“取消置位“。因此、请确保在传输整个消息后发生“取消置位“。
    此致
    Tarun Mukesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在中断模式下、它将确保在 ISR 中调用 Deassert、并且在完成传输后、仅调用该函数而不会截断数据。  [/报价]

    好的、这是有道理的。 奇怪的是、启用中断会导致一种复杂情况...我无法使中断正常工作。 所有信息。

        SPI_HWAttrs spi_cfg;
        SPI_socGetInitCfg(domain, instance, &spi_cfg);
        spi_cfg.enableIntr = BTRUE;
        spi_cfg.edmaHandle = NULL;
        spi_cfg.dmaMode    = BFALSE;
        // spi_cfg.intNum     = CSLR_COMPUTE_CLUSTER0_GIC500SS_SPI_MCSPI3_INTR_SPI_0;
        // spi_cfg.intNum     = CSLR_R5FSS0_INTROUTER0_IN_MCSPI3_INTR_SPI_0;
        // What should the intNum be??
    
    
        /* Set the SPI init configurations */
        spi_cfg.chNum = 0;
        spi_cfg.chnCfg[0].dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_6;
        spi_cfg.chnCfg[0].tcs = MCSPI_CS_TCS_0PNT5_CLK;
        spi_cfg.chnCfg[0].trMode = MCSPI_TX_ONLY_MODE; 
        spi_cfg.chnCfg[0].enableFIFO = 1; // Tried both 0 and 1; neither affects the interrupt
    
        /* Set interrupt path */
        if(CSL_PASS != MCSPI_configSocIntrPath(instance, &spi_cfg, BTRUE))
        {
            UART_printf("\n Set interrupt path failed! Interrupt number %d\n", spi_cfg.intNum);
        }
        else
        {
            UART_printf("\n The interrupt path has been set with interrupt number %d\n", spi_cfg.intNum);
        }

    我知道,在我的前一个职位 ,我认为我理解,但我不认为我是。 尝试了如上所示的各种中断号。  

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

    您好:

    与之前的情况相比不应有任何变化。

    好的、这很有道理。 奇怪的是、启用中断会导致一种复杂情况...我无法使中断正常工作。 再次。

    与以前相比又发生了什么变化?

    如果有相同的结果、即使是 1 个字节、也应该继续处理其他字节。

    您还可以检查在 MCU2_1 上配置的 MCSPI3 的 MCAL 示例。它们使用 258 IRQ 编号

    for (idx = 0U; idx < cfgPtr->maxHwUnit; idx++)
        {
            if (cfgPtr->hwUnitCfg[idx].enabledmaMode == FALSE)
            {
                rmIrqReq.valid_params           = TISCI_MSG_VALUE_RM_DST_ID_VALID;
                rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
                rmIrqReq.src_id                 = TISCI_DEV_MCSPI3;
                rmIrqReq.global_event           = 0U;
                rmIrqReq.src_index              = 0U;
                rmIrqReq.dst_id                 = TISCI_DEV_R5FSS0_CORE1;
                rmIrqReq.dst_host_irq           = APP_SPI_3_INT;
                rmIrqReq.ia_id                  = 0U;
                rmIrqReq.vint                   = 0U;
                rmIrqReq.vint_status_bit_index  = 0U;
                rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
                retVal = Sciclient_rmIrqSet(
                             &rmIrqReq, &rmIrqResp, APP_SCICLIENT_TIMEOUT);
                if(LLD_PASS != retVal)
                {
                    AppUtils_Printf(APP_UTILS_PRINT_MSG_NORMAL,
                        "Error in SciClient Interrupt Params Configuration!!!\n");
                }
                Osal_RegisterInterrupt_initParams(&intrPrms);
            #if (STD_ON == SPI_UNIT_MCSPI3_ACTIVE)
            #if (SPI_ISR_TYPE == SPI_ISR_CAT1 || SPI_ISR_TYPE == SPI_ISR_VOID)
                intrPrms.corepacConfig.arg          = (uintptr_t)Spi_IrqUnitMcspi3TxRx;
            #endif
            #endif
                intrPrms.corepacConfig.isrRoutine   = &SpiApp_SpiXIsr;
                intrPrms.corepacConfig.priority     = 1U;
                intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */
                intrPrms.corepacConfig.intVecNum        = APP_SPI_3_INT;
    
                osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
                if(OSAL_INT_SUCCESS != osalRetVal)
                {
                    AppUtils_Printf(APP_UTILS_PRINT_MSG_NORMAL,
                                      ": Error %d !!!\n");
                }
            }

    此致

    Tarun Mukesh

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

    所以得到这个:没有代码更改、但我重置了每个内核、而不仅仅是我正在处理的 MCU2_1 内核。 它突然工作。

    我想知道 sciserver 是否处于不良状态、任何注册或取消注册中断的进一步请求都将不起作用。 我不能说我理解它的工作原理。

    但如果中断设置正确、我目前可以看到整个消息都通过了。 我将在这里用一条更大的消息进行测试。

    编辑:尝试了一条 43 字节的消息,我也将 TRANSITION.count 设置为这个大小。 我没有得到中断。 反复尝试、确保每次都重新启动 sciserver。

    24 字节:有效。

    31 字节:有效。

    32 字节:正常工作。

    33 字节:不起作用。

    40(或高于 32 字节的任何内容):不起作用。

    有意思。 因此、发送大于 32 字节的内容是不可行的;这是因为 MCSPI_RX_TX_FIFO_SIZE 吗? 我想、如果我们使用仅 Tx 模式、它会使用 MCSPI_FULL_FIFO_SIZE。 而且、不使用 FIFO 在任何情况下都不起作用。 那么这 32 字节限制的原因是什么?

    如果我在接下来的几天内回复速度慢、这是因为我将离开办公室、直到星期一。

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

    您好:

    我想知道 sciserver 是否处于不良状态、任何注册或取消注册中断的进一步请求都将不起作用。 我不能说我理解它的工作原理。

    但如果中断设置正确、我目前可以看到整个消息都通过了。 我将在这里用一条更大的消息进行测试。

    [/报价]

    安全侦听调用会通过 M3/M4 内核、如果您不重置 soc、仅重置 MCU2_1 内核、并尝试执行中断路由、则会失败。

    您了解中断路由是正确的、但您不知道这是系统流程。

    尝试针对不同的事务长度进行 soc 复位。  

    现在、我们需要检查以下寄存器详细信息

    R MCSPI3_CFG_MCSPI_XFERLEVEL  

    使用 McSPIFOTrigLvlSet API、我们将设置触发电平、然后设置字计数。

    如果使用的是 TX_ONLY_mode、则 AEL 的触发电平应设置为 (64-1)

    然后 由 McSPIWordCountSet API 将事务计数转换为字计数。

    此致

    Tarun Mukesh

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

    嗯、奇数。 当我检查一条 32 字节消息时、AEL 被设置为 0x17。 不确定它的计算方式。

    我回到 spi_v1.c 中跟踪 43 字节消息的逻辑。 查看在何处使用这些 API 调用来设置触发和字数。 如果我将字大小设置为 16 位、我可以看到 XFERLEVEL 设置为 0x0A 的最后一个字节、我认为这是合理的(43 字节消息 — 32 FIFO size(?) - 1)。 使用该字大小、整个 43 个字节都能完成。

    是的、我不确定触发电平是否设置为 64、我会稍微详细地了解为什么没有这样做。

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

    您好:

    嗯、奇数。 当我检查一条 32 字节消息时、AEL 被设置为 0x17。 不确定它的计算方式。

    我回到 spi_v1.c 中跟踪 43 字节消息的逻辑。 查看在何处使用这些 API 调用来设置触发和字数。 如果我将字大小设置为 16 位、我可以看到 XFERLEVEL 设置为 0x0A 的最后一个字节、我认为这是合理的(43 字节消息 — 32 FIFO size(?) - 1)。 使用该字大小、整个 43 个字节都能完成。

    是的、我不确定触发电平是否设置为 64、我会稍微详细地了解为什么没有这样做。

    [/报价]

    是的、请检查。 除非您正确设置了触发级别 AEL、否则您可能会错过一些字节。

    此致

    Tarun Mukesh

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

    好的、对于这个 43 字节的消息、我可以将 txTrigLvl 设置为较高的数字、例如 48、它将发送数据大小为 8U 的整个消息。  我用一条 23 字节的消息进行测试、不需要更改配置、就能正常工作。 7 字节消息、似乎正常工作。

    当我尝试使用 SPI6 将其集成到另一个应用中时、情况就变得复杂了。 我明白了、要问的问题是 两者之间有什么不同? 例如、除非在 RX 中断之前设置 TX、否则我无法让 TX 中断在应用上工作。  

    很有趣,我最近决定全面深入到我正在研究的项目,使用两个 SPI ,虽然不是传统的使用. 我震惊的是它突然多么完美的工作,而我的头脑不知道这一切是如何更好地作为非常规使用 SPI 当我努力使设备作为 SPI 工作在这些简单的演示的第一个地方. 哦、好吧。

    我不知道驱动程序中最初是什么强制 txTrigLvl 为 32、但如果您强制它大于 32(48、64……) 它似乎很有用。

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

    您好、Tyler、

    [报价 userid=“652899" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1534243/j721excpxevm-spi-tx-will-truncate-the-transmitted-message/5925345

    很有趣,我最近决定全面深入到我正在研究的项目,使用两个 SPI ,虽然不是传统的使用. 我震惊的是它突然多么完美的工作,而我的头脑不知道这一切是如何更好地作为非常规使用 SPI 当我努力使设备作为 SPI 工作在这些简单的演示的第一个地方. 哦、好吧。

    我不知道驱动程序中最初是什么强制 txTrigLvl 为 32、但如果您强制它大于 32(48、64……) 它似乎很有用。

    [/报价]

    我认为驱动程序中没有任何缺陷,这可能是由于一些其他问题。 如果驱动程序可以自由运行而没有停止和损坏、则它将正确分配 txTrigLvl、并且不会有任何问题。

    当我尝试使用 SPI6 以及 RX 将其集成到另一个应用中时、就会出现问题。 我明白了、要问的问题是 两者之间有什么不同? 例如、除非在 RX 中断之前设置 TX、否则我无法让 TX 中断在应用上工作。  [/报价]

    启用 SPI TX 和 RX 中断的顺序会影响应用程序的行为、尤其是在 TX 中断无法正常工作时遇到问题。  

    如果在 TX 中断设置完成之前启用并触发了 RX 中断、则可能会导致数据损坏或意外行为 。  

    确保在 RX 中断之前完全配置和启用 TX 中断对于正确的 SPI 通信至关重要、尤其是在涉及同时双向通信的情况下或从器件需要发送数据来响应主器件请求时。

    此致

    Tarun Mukesh