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.

[参考译文] MSPM0G3107:CANFD:收到的消息不触发回调函数

Guru**** 2396165 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1421753/mspm0g3107-canfd-received-messages-does-not-trigger-callback-function

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

工具与软件:

你好

我将把一个应用程序移植到 MSPM03107 MCU、并将 CAN 驱动程序移植到其中。
我已经验证驱动程序可以传输、但当我收到消息时不会触发。

我通过从 SDK 中构建 mcan_message_rx 演示代码进行了验证、并且回调函数可以正常工作。

我可以看到、当我在总线上发送消息时、MCAN_IR_RF0N 和 MCAN_IR_RF0F 变为1、因此它接收到发送到 FIFO0的消息。
但永远不会调用回调函数。 我尝试使用 DL_Interrupt_registerInterrupt 注册回调、但没有成功。

从这里可以采取哪些好的步骤?


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

    您好!  

    您能否启用 RX FIFO 新消息中断并检查您是否可以正确进入该中断例程。 对于回叫、您是指在收到某条消息时发回消息?

    此致、

    Cash Hao

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

    您好!

    我可以确认我启用了 RX FIFO 新消息中断、但它没有进入中断例程、也就是说、回调函数是在 ti_msp_dl_config.h 中指定的、称为 MCAN0_INST_IRQHandler  

    因此、在这种情况下、回调函数不是处理传入消息的函数

    这是 CANFD 的 init 函数

    SYSCONFIG_WEAK void SYSCFG_DL_MCAN0_init(void) {
        DL_MCAN_RevisionId revid_MCAN0;
    
        DL_MCAN_enableModuleClock(MCAN0_INST);
    
        DL_MCAN_setClockConfig(MCAN0_INST, (DL_MCAN_ClockConfig *) &gMCAN0ClockConf);
    
        /* Get MCANSS Revision ID. */
        DL_MCAN_getRevisionId(MCAN0_INST, &revid_MCAN0);
    
        /* Wait for Memory initialization to be completed. */
        while(false == DL_MCAN_isMemInitDone(MCAN0_INST));
    
        /* Put MCAN in SW initialization mode. */
    
        DL_MCAN_setOpMode(MCAN0_INST, DL_MCAN_OPERATION_MODE_SW_INIT);
    
        /* Wait till MCAN is not initialized. */
        while (DL_MCAN_OPERATION_MODE_SW_INIT != DL_MCAN_getOpMode(MCAN0_INST));
    
        /* Initialize MCAN module. */
        DL_MCAN_init(MCAN0_INST, (DL_MCAN_InitParams *) &gMCAN0InitParams);
    
        /* Configure MCAN module. */
        DL_MCAN_config(MCAN0_INST, (DL_MCAN_ConfigParams*) &gMCAN0ConfigParams);
    
        /* Configure Bit timings. */
        DL_MCAN_setBitTime(MCAN0_INST, (DL_MCAN_BitTimingParams*) &gMCAN0BitTimes);
    
        /* Configure Message RAM Sections */
        DL_MCAN_msgRAMConfig(MCAN0_INST, (DL_MCAN_MsgRAMConfigParams*) &gMCAN0MsgRAMConfigParams);
    
    
    
        /* Set Extended ID Mask. */
        DL_MCAN_setExtIDAndMask(MCAN0_INST, MCAN0_INST_MCAN_EXT_ID_AND_MASK );
    
        /* Loopback mode */
    
        /* Take MCAN out of the SW initialization mode */
        DL_MCAN_setOpMode(MCAN0_INST, DL_MCAN_OPERATION_MODE_NORMAL);
    
        while (DL_MCAN_OPERATION_MODE_NORMAL != DL_MCAN_getOpMode(MCAN0_INST));
    
        /* Enable MCAN mopdule Interrupts */
        DL_MCAN_enableIntr(MCAN0_INST, MCAN0_INST_MCAN_INTERRUPTS, 1U);
    
        DL_MCAN_selectIntrLine(MCAN0_INST, DL_MCAN_INTERRUPT_BO|DL_MCAN_INTERRUPT_RF0N|DL_MCAN_INTERRUPT_RF1N|DL_MCAN_INTERRUPT_TFE, DL_MCAN_INTR_LINE_NUM_0);
        DL_MCAN_enableIntrLine(MCAN0_INST, DL_MCAN_INTR_LINE_NUM_0, 1U);
        DL_MCAN_selectIntrLine(MCAN0_INST, DL_MCAN_INTERRUPT_RF0N|DL_MCAN_INTERRUPT_RF1N, DL_MCAN_INTR_LINE_NUM_1);
        DL_MCAN_enableIntrLine(MCAN0_INST, DL_MCAN_INTR_LINE_NUM_1, 1U);
    
        /* Enable MSPM0 MCAN interrupt */
        DL_MCAN_clearInterruptStatus(MCAN0_INST,(DL_MCAN_MSP_INTERRUPT_LINE0
    		 | DL_MCAN_MSP_INTERRUPT_LINE1));
        DL_MCAN_enableInterrupt(MCAN0_INST,(DL_MCAN_MSP_INTERRUPT_LINE0
    		 | DL_MCAN_MSP_INTERRUPT_LINE1));
    
    }

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

    您好!

    我正在检查您的 init 函数代码。 为什么要  同时在中断线路0和1上映射 DL_MCAN_INTERRUPT_RF0N 和 DL_MCAN_INTERRUPT_RF1N? 它只能映射到这里的一个中断线路。  

    代码的另一部分看起来不错。 演示代码可以在您的电路板上正常工作、因此您对应用进行了哪些更改?

    此致、

    Cash Hao

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

    你(们)好

    很奇怪、这是 SysConfig 自动生成的代码

    我发现了这个问题
     在此之后、在调用 DL_Interrupt_registerInterrupt 之前、我忘记调用 NVIC_EnableIRQ 、  
    它现在运行得很好!

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

    很高兴知道您解决了问题!