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.

[参考译文] LAUNCHXL-F28P55X:首次触发后无法重新初始化 MCAN 中断

Guru**** 2613765 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1573317/launchxl-f28p55x-fails-to-re-initialize-the-mcan-interrupt-after-first-trigger

器件型号:LAUNCHXL-F28P55X
Thread 中讨论的其他器件:SysConfigC2000WARE

工具/软件:

您好:

我们已使用 SysConfig 配置了 MCAN [传统配置、速率为 125Kbps]。 [ SysConfig 版本 1.23.0 和 C2000Ware 版本 5.4.0.00]。  并成功实现了传输。 但是、我们使用 SysConfig 工具实现了部分接收器件成功。 出现故障的原因是 ISR 仅在首次触发、并且所有后续接收 CAN 消息均未能触发 ISR。 为了让 它再次被触发,我们不得不利用  CAN  的一些函数初始化在 Board.c 的 Board_init () 中调用  此外、中断清除都不能帮助重新建立 ISR。

我们已经尝试了以下主题下给出的所有上述解决方案、但没有一个是有用的  

 TMS320F280039C:MCAN 中断只会触发一次。 

 【请参阅代码片段】。

 

__interrupt void INT_PWR_CAN_0_ISR(void)
{  
    //uint32_t intrStatus;
    MCAN_RxNewDataStatus newData;


    intrStatus = MCAN_getIntrStatus(MCANA_DRIVER_BASE);
    

    //
    // Clear the interrupt Status.
    //
    MCAN_clearIntrStatus(MCANA_DRIVER_BASE, intrStatus);

    //
    //  Clearing the interrupt lineNum
    //

    MCAN_clearInterrupt(MCANA_DRIVER_BASE, 0x1); // Clear Int Line 0

   //
    //  Check to see if the interrupt is caused by a message being
    //  received in dedicated RX Buffers
    //
    if((MCAN_INTR_SRC_RX_FIFO0_NEW_MSG & intrStatus) == MCAN_INTR_SRC_RX_FIFO0_NEW_MSG)
    {
        //
        // Read the NewData registers
        //
        MCAN_getNewDataStatus(MCANA_DRIVER_BASE, &newData);
        //  If message is received in buffer element 0
        if((newData.statusLow & (1UL << 0U)) != 0)
        {
            MCAN_readMsgRam(MCANA_DRIVER_BASE, MCAN_MEM_TYPE_BUF, 0U,
                          0, &rxMsg1);        

            if((rxMsg[0].id >> 18U) == 0x40)
            {
              
            }
            else if((rxMsg[0].id >> 18U) == 0x42) 
            {
              
            }    
        }

        //
        //  Clearing the NewData registers
        //
        MCAN_clearNewDataStatus(MCANA_DRIVER_BASE, &newData);
        newData.statusLow = 0;

    }
    else
    {
        //error++;

        //
        //  Interrupt handling for other interrupt sources goes here
        //

    }
    //
    // Acknowledge this interrupt located in group 9
    //
   Interrupt_clearACKGroup(INT_PWR_CAN_0_INTERRUPT_ACK_GROUP);


//-----------------------------------------------------------------------------------
This code snippet used for re-initialising the ISR to get it to trigger subsequently
    MCAN_StdMsgIDFilterElement stdFiltelem_PWR_CAN;
    MCAN_setOpMode(PWR_CAN_BASE, MCAN_OPERATION_MODE_SW_INIT);
    while (MCAN_OPERATION_MODE_SW_INIT != MCAN_getOpMode(PWR_CAN_BASE));

    stdFiltelem_PWR_CAN.sft = MCAN_STDFILT_RANGE;
    stdFiltelem_PWR_CAN.sfec = MCAN_STDFILTEC_RXBUFF;
    stdFiltelem_PWR_CAN.sfid1 = 64;
    stdFiltelem_PWR_CAN.sfid2 = 0;    
    MCAN_addStdMsgIDFilter(PWR_CAN_BASE, 0U, &stdFiltelem_PWR_CAN);

    stdFiltelem_PWR_CAN.sft = MCAN_STDFILT_RANGE;
    stdFiltelem_PWR_CAN.sfec = MCAN_STDFILTEC_RXBUFF;
    stdFiltelem_PWR_CAN.sfid1 = 66;
    stdFiltelem_PWR_CAN.sfid2 = 0;
    MCAN_addStdMsgIDFilter(PWR_CAN_BASE, 1U, &stdFiltelem_PWR_CAN);

    MCAN_lpbkModeEnable(PWR_CAN_BASE, MCAN_LPBK_MODE_EXTERNAL, false);
    MCAN_setOpMode(PWR_CAN_BASE, MCAN_OPERATION_MODE_NORMAL);
    while (MCAN_OPERATION_MODE_NORMAL != MCAN_getOpMode(PWR_CAN_BASE));
//-----------------------------------------------------------------------------------

}

请参阅 MCAN 配置的快照

此致、

Sharath

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

    嗨、Sharath、

    在查看您分享的代码时、我注意到的一件事是、您的两个标准范围过滤器相互重叠。 STDFLT1 = 0-64 和 STDFLT2 = 0-66。 您应该将 STDFLT2 更新为 65-66、或者将其从范围过滤器更改为单 ID 过滤器、以防止任何重叠。 这些滤波器的顺序很重要 、会影响消息处理和相关中断生成的顺序。

    您还将标准滤波器配置为存储在 RX 缓冲器中、但您的中断配置为新的 RX FIFO MSG、这意味着当 STDFLTID = 0-66 时、不会触发此中断。

    您还应确保使用“Use Calculatedd Starting addresses“复选框、以便在自动生成的代码中应用正确的消息 RAM 大小和配置。

    请查看该反馈以及有关 RX 滤波器配置和 RX 缓冲器/FIFO[0:1]配置的相关 TRM 一章内容。

    此致、

    Zackary Fleenor

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

    您好:

    我们已根据建议更改了设置、现在我们看到每次消息接收时都会调用 ISR。 但现在滤波器功能似乎无法正常工作。 我们已经尝试了所有过滤器设置、但无论 ID 如何、都将收到所有消息(即针对所有消息 ID 触发 ISR)。  

    ISR 工作代码(与第一封跟踪邮件相比更改)如下所示:

    __interrupt void INT_PWR_CAN_0_ISR(void)
    {
        uint32_t intrStatus;
    
        intrStatus = MCAN_getIntrStatus(MCANA_DRIVER_BASE);
        
        //
        // Clear the interrupt Status.
        //
        MCAN_clearIntrStatus(MCANA_DRIVER_BASE, intrStatus);
    
        //
        //  Clearing the interrupt lineNum
        //
    
        MCAN_clearInterrupt(MCANA_DRIVER_BASE, 0x1); // Clear Int Line 0
    
        //
        //  Check to see if the interrupt is caused by a new message being
        //  received in RX FIFO 1
        //
        
        if(((MCAN_INTR_SRC_RX_FIFO0_NEW_MSG) & intrStatus) == (MCAN_INTR_SRC_RX_FIFO0_NEW_MSG))
        {
                MCAN_readMsgRam(MCANA_DRIVER_BASE, MCAN_MEM_TYPE_FIFO, 0U, MCAN_RX_FIFO_NUM_0, &rxMsg1);
                if(rxMsg1.data[0] == 0x50) {
                  GPIO_writePin(FaultLED_Output,0);
                }
                else {
                  GPIO_writePin(FaultLED_Output,1);
                }
                RxFS.num = MCAN_RX_FIFO_NUM_0;
    
                MCAN_writeRxFIFOAck(MCANA_DRIVER_BASE, MCAN_RX_FIFO_NUM_0, RxFS.getIdx);
        }
        else
        {
            //error++;
    
            //
            //  Interrupt handling for other interrupt sources goes here
            //
    
        }
        //
        // Acknowledge this interrupt located in group 9
        //
       Interrupt_clearACKGroup(INT_PWR_CAN_0_INTERRUPT_ACK_GROUP);
    
    }

    SYS config 文件设置如下所提供的快照所示  

    最初、未选中“Enable Additional Core Configurations“、并且无论过滤器设置如何、都接受所有 CAN ID。 因此启用了“Enable Additional Core Configurations“(启用额外的核心配置)、并且突出显示的字段接受“不匹配帧“到“ Rx FIFO 0 “。 当更改为'时 拒绝 '、即使过滤器中设置的 ID 匹配、也不会触发 ISR。  

    PS:我们使用标准的 11 位消息标识符、并尝试接受 ID 介于 0x40 和 0x42 之间的消息。

    此致、

    Sharath

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

    请回复

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

    您好 Sharath、

    对延迟的回复表示歉意。 您能否提供托管 MCAN 配置/功能以供查看的.syscfg 文件和关联的.c 文件?

    仅从屏幕截图就很难掌握真正的配置。

    此致、

    Zackary Fleenor

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

    e2e.ti.com/.../Ref.zip

    您好:

    让 CAN 按所需要求工作。 感谢您的友好帮助和支持。 此外、我还在 Ref.zip 中附加了工作代码片段和 syscfg 文件以供参考。

    PFA 使用