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.

[参考译文] MCU-PLUS-SDK-AM263X:多 CAN 消息的 MCAN RX ISR 延迟问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126700/mcu-plus-sdk-am263x-mcan-rx-isr-delay-issue-with-multi-can-message

器件型号:MCU-PLUS-SDK-AM263X

您好、TI 专家

我们在    AM263x SDK V8.2中遇到了多 CAN 消息的 MCAN RX ISR 延迟问题

(1)当我们仅为 用  1ms 时间触发任务的 CAN0启用 MCAN_ProcessCanIntraISR (0)时

 当接收到200ms 周期消息时、MCAN_ProcessCanIntrISR (0)触发器有延迟问题(200~1000ms)

(2) CAN 总线负载(~4%)如下 :

CAN0发送的 CAN ID:0x228和0x504 (CAN 工具中显示 RX)  

CAN0接收的其它 CAN ID (TX 显示在 CAN 工具中)、

是否有任何关于 MCAN_ProcessCanIntraISR 用于多 CAN 消息的建议?

BR

Jay

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

    您好、Jay、

    我们将对此进行研究、并很快与您联系。

    此致、
    弗兰克

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

    您好、 TI 专家

    请按以下方式检查 MCAN 功能

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*******************************************************************************/
    /* Function name: HHCAN_Init()*/
    /* Description : Initialize HH CAN Module Data*/
    /* Parameters : N.A */
    /* Returns : N.A*/
    /* Remark : N.A*/
    /*******************************************************************************/
    void HHCAN_Init(void)
    {
    for(int i=0;i < APP_MCAN_CHANNEL_CNT; i++)
    {
    Mcan_Init(i);
    }
    HHCANPar_Init();
    }
    void HHCAN_CheckCanISRStatus(void)
    {
    Mcan_ProcessCanIntrISR(0);
    /* for(int i = 0;i < 4; i++)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    BR

    Jay

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

    您好、Jay

    对迟交的答复表示歉意。

    您能否告诉我这个问题是仅在 SBL 还是在应用程序中发生?

    此致

    Sri Vidya

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

    你(们)好,Sri Vidya

    在 SBL 中或在应用中、当 MCAN RX ISR 同时发送多个 CAN 消息时、这个问题是相同的  

    BR

    Jay

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

    您好、Jay

    我将介绍您共享的代码。 看起来 MCAN_ProcessCanIntraISR 是客户创建的 API。

    在此 API 中、使用 ApiCan_ReceiveFIFOMessage 接收消息。 这是导致您指定的延迟的原因吗?

    如果是、您是否还可以共享 在 ApiCan_ReceiveFIFOMessage 中执行的操作?

    此致

    Sri Vidya

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

    你(们)好,Sri Vidya

    ApiCan_ReceiveFIFOMessag 和 ApiCan_ProcessRxFIFOEVENT

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int8_t ApiCan_ReceiveFIFOMessage(TICan_Channel canChannel,uint8_t fifo_num, MCAN_RxBufElement* rxBuff)
    {
    int8_t testStatus = 0;
    MCAN_ErrCntStatus errCounter;
    uint32_t Rx_id;
    uint32_t baseAddr;
    baseAddr = getCanBaseAddr(canChannel);
    /* Checking for Errors */
    MCAN_getErrCounters(baseAddr, &errCounter);
    if ((0U == errCounter.recErrCnt) &&
    (0U == errCounter.canErrLogCnt))
    {
    MCAN_readMsgRam(baseAddr,
    MCAN_MEM_TYPE_FIFO,//MCAN_MEM_TYPE_BUF,
    0U,//not use
    fifo_num,
    rxBuff);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    ApiCan_SendMessage

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int8_t ApiCan_SendMessage(TICan_Channel canChannel, uint32_t id, uint8_t extFrame, uint8_t datalength, uint8_t* data)
    {
    int8_t configStatus = 0, i;
    MCAN_ProtocolStatus protStatus;
    MCAN_TxBufElement txCanMsg;
    SemaphoreP_Object *TxDoneSem;
    uint32_t baseAddr;
    baseAddr = getCanBaseAddr(canChannel);
    TxDoneSem = getCanTxDoneSem(canChannel);
    /* Initialize message to transmit */
    if (1 == extFrame)
    {
    txCanMsg.id = (uint32_t)(id);
    txCanMsg.xtd = 1U;
    }
    else
    {
    txCanMsg.id = (uint32_t)((uint32_t)(id) << 18U);
    txCanMsg.xtd = 0U;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    BR

    Jay

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

    您好、Jay

    我需要更多时间来查看此代码。 将与内部团队联系、并尽快回复您

    此致

    Sri Vidya

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

    您好、Jay

    在  MCAN_ProcessCanIntrISR -> ApiCAN_ReceiveFIFOMessage 中、此 API 能否调用 ApiCAN_SendMessage。

    因为 ApiCan_SendMessage 有一个 SemaphoreP_pend (TxDoneSem、0)被调用。

    我怀疑 ISR 中的 Pend 操作可能会导致等待时间。 可以确认吗? 同时、我将探讨其他可能性。

    此致

    Sri Vidya。

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

    你(们)好,Sri Vidya

    对于 mcan 示例、mCAN_loopback _interrupt_main 有一个 SemaphoreP_pend (&gMcanRxDoneSem、SystemP_WAIT_FOREVER)正在被调用。

    (1)该过程将在 SemaphoreP_pend (&gMcanRxDoneSem、SystemP_WAIT_FOREVY)上挂起、而不具有 CAN 节点 ACK 响应(am263x mcan 仅作为发送器、而其他 CAN 节点作为接收器)。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void mcan_loopback_interrupt_main(void *args)
    {
    int32_t status = SystemP_SUCCESS;
    HwiP_Params hwiPrms;
    MCAN_TxBufElement txMsg;
    MCAN_ProtocolStatus protStatus;
    MCAN_RxBufElement rxMsg;
    MCAN_RxNewDataStatus newDataStatus;
    MCAN_ErrCntStatus errCounter;
    uint32_t i, bufNum, fifoNum, bitPos = 0U;
    /* Open drivers to open the UART driver for console */
    Drivers_open();
    Board_driversOpen();
    DebugP_log("[MCAN] Loopback Interrupt mode, application started ...\r\n");
    /* Construct Tx/Rx Semaphore objects */
    status = SemaphoreP_constructBinary(&gMcanTxDoneSem, 0);
    DebugP_assert(SystemP_SUCCESS == status);
    status = SemaphoreP_constructBinary(&gMcanRxDoneSem, 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    因此、我们修改了一个 SemaphoreP_pend (TxDoneSem、0)=>每当没有 CAN 应答的 CAN TX 消息时、该过程就会继续

    实际上、我们将 MCAN_ProcessCanIntraISR (0)修改  为 MCAN_IntraISR 中断函数、如下所示。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*******************************************************************************/
    /* Function name: HHCAN_Init()*/
    /* Description : Initialize HH CAN Module Data*/
    /* Parameters : N.A */
    /* Returns : N.A*/
    /* Remark : N.A*/
    /*******************************************************************************/
    void HHCAN_Init(void)
    {
    for(int i=0;i < APP_MCAN_CHANNEL_CNT; i++)
    {
    Mcan_Init(i);
    }
    HHCANPar_Init();
    }
    void HHCAN_CheckCanISRStatus(void)
    {
    for(int i = 0;i < 4; i++)
    {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    修改后、 收到200ms 周期消息时、可以_ProcessCanIntISR(0)触发器有延迟问题(200~400ms)

    是否有任何关于 MCAN_ProcessCanIntraISR 用于多 CAN 消息的建议?

    BR

    Jay

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

    您好、Jay

    此项目是否处于内置发布模式以启用优化? 如果不是、您可以更改为"发布"模式并检查其是否解决了您的问题?

    您能否共享您的项目、以便我可以在我的结尾复制并检查它。

    此致

    Sri Vidya

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

    你(们)好,Sri Vidya

    项目是在“发布”模式下构建的, 并且未启用优化。

    我们发现根本原因是具有错误帧的 CAN 总线。   

    我们将尝试通过检查 BUSOFF 标志来解决此问题。

    BR

    Jay

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

    好的、将等待您的结果。

    此致

    Sri Vidya