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.

[参考译文] MSPM0G3507:当传入多条消息时、CAN RX 会卡住

Guru**** 2465890 points
Other Parts Discussed in Thread: MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming

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

工具与软件:

嗨、

我修改了示例工程 mcan_message_rx_lp_MSPM0G3507_nortos_ticlang 以接收 CAN 消息。

如果我从 PC 发送 CAN 消息 CAN 软件狗(PCAN 视图)、MSPM0G3507会触发 CAN-RX 中断并接收和处理接收到的消息。

不时一条消息不会触发并中断。

但当我在第一条消息被处理之前发送第二条消息时、第二条消息没有被处理。

当我在短时间内发送多条消息时、可能会显示的消息似乎完全被卡住了。 即使我等待一段时间、新的 CAN 消息也不会触发新的中断。

我需要重新启动调试会话才能再次接收 CAN 消息。

我在"gInterruptLine1Status"上做了一个"watch expression"。

当接收停止时、它会变为0x0002000C 或0x00020004。

从技术参考手册中、我发现这似乎是(原始或屏蔽的)中断状态寄存器值。 并且会设置 SEC (单错校正)和/或 DED (双错检测)位。

我向 SysConfig 添加/编辑了以下配置、以某种方式触发中断或其他任何操作、从而能够处理"卡住"。

MCAN1.m0interrupts              = ["DL_MCAN_MSP_INTERRUPT_DOUBLE_ERROR_DETECTION","DL_MCAN_MSP_INTERRUPT_LINE0","DL_MCAN_MSP_INTERRUPT_LINE1","DL_MCAN_MSP_INTERRUPT_SINGLE_ERROR_CORRECTION "];
MCAN1.interruptLine             = ["DL_MCAN_INTR_LINE_NUM_0","DL_MCAN_INTR_LINE_NUM_1"];
MCAN1.rxFIFO0size               = 10;
MCAN1.rxFIFO0waterMark          = 8;
MCAN1.interruptFlags            = ["DL_MCAN_INTERRUPT_RF0F","DL_MCAN_INTERRUPT_RF0N","DL_MCAN_INTERRUPT_RF0W"];
MCAN1.interruptLine0Flag        = ["DL_MCAN_INTERRUPT_RF0F","DL_MCAN_INTERRUPT_RF0W"];

但除了 Rx 中断外、所有中断案例都不会被触发。 这是我的 CAN 中断处理程序:

void MCAN0_INST_IRQHandler(void)
{
    printf("\nCAN_IRQ_handler");


    switch (DL_MCAN_getPendingInterrupt(MCAN0_INST)) {

        case DL_MCAN_IIDX_LINE0:                                                    // RX FIFO 0 Full - interrupt
            __BKPT(0);
            /* Check MCAN interrupts fired during TX/RX of CAN package */
            gInterruptLine0Status |= DL_MCAN_getIntrStatus(MCAN0_INST);
            DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine0Status,
                DL_MCAN_INTR_SRC_MCAN_LINE_0);

            printf("\nCAN_IRQ_Line0");


            gServiceInt0 = true;
            break;

        case DL_MCAN_IIDX_LINE1:                                                    // RX FIFO 0 New Message - interrupt
            /* Check MCAN interrupts fired during TX/RX of CAN package */
            gInterruptLine1Status |= DL_MCAN_getIntrStatus(MCAN0_INST);
            DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine1Status,
                DL_MCAN_INTR_SRC_MCAN_LINE_1);

            printf("\nCAN_IRQ_Line1");

            gServiceInt1 = true;
            break;
            
        case DL_MCAN_IIDX_SINGLE_ERROR_CORRECTION:
            __BKPT(0);
            break;

        case DL_MCAN_IIDX_DOUBLE_ERROR_DETECTION:
            __BKPT(0);
            break;

        default:
            __BKPT(0);
            break;
    }
}

有人可以帮我吗?

如果您需要更多信息,请告诉我;)

提前感谢!

Matze

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

    您好、 

    尝试以下操作:

    e2e.ti.com/.../mcan.zip

    此致、

    Helic

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

    谢谢!

    1.

    我看到"MCAN"-"Advanced Configuration"-"Additional Core Configuration"已启用和配置。

    我目前尚未使用此设置。 这可能是我遇到这些问题的原因吗?

    我真的不明白使用这些"高级配置设置"可以实现什么。 关于这些设置、是否有任何帮助、建议记录器文档? 或者有人能向我解释一下,这是什么?

    2.

    在示例中、我找到了注释:

    /* New message received by Rx FIFO 0 (Filter matched) */
    听起来传入的消息已被过滤、只有匹配的 sid / Eid 消息会触发中断?
    我是对吗? "预"滤波的设置在哪里?
    在"mcan_message_rx_lp_MSPM0G3507_nortos_ticlang"中、Rx 中断后的每个消息首先必须逐步完成、并在代码中进行"手动"筛选、从而确定它是否是正确的 sid 或 Eid。
    请告诉我魔法在哪里发生!
    提前感谢!
    Matze

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

    您好、 

    [报价用户 id="353832" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5628830 #5628830"]我看到"MCAN"-"高级配置"-"其他核心配置"已启用并配置。[/QUOT]

    如果您不使用本节中的功能、则可以禁用该功能~但将其保留为默认值是可以的。

    [报价 userid="353832" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5628830 #5628830"]目前尚未使用此设置。 这可能是我遇到这些问题的原因吗?

    有许多原因可能会导致卡滞、但我不认为高级配置会导致此问题。

    关于这些设置是否有任何帮助、建议或文档? 或者有人能向我解释什么?

    点击此处可找到一些功能: TRM 中的20.4 MCAN 功能说明。

    似乎传入的消息已被过滤、只有匹配的 sid / Eid 消息才会触发中断?

    有。

    该"预过滤"的设置在哪里?

    在 syscfg、CAN RAM 设置、滤波器设置。

    [报价 userid="353832" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5628830 #5628830"]
    在"mcan_message_rx_lp_MSPM0G3507_nortos_ticlang"中、Rx 中断后的每个消息首先必须逐步完成、并在代码中进行"手动"筛选、从而确定它是否是正确的 sid 或 Eid。
    请告诉我魔法在哪里发生!
    [报价]

    这是 MCAN 双 ID 设置、您可以在 syscfg 中找到它:

    在某些用例中、可以将 ID1设置为 Filter ID、将 ID2设置为 Mask。

    [报价 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5618817 #5618817"]

    尝试以下操作:

    mcan.zip

    [报价]

    最后、请参阅我上传到此主题的演示作为 MCAN 参考、此演示通过了压力测试。

    此致、

    Helic

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

    您好、 

    我定义了以下筛选器:

    滤波器设置为正确~

    但需要等待 MCAN RAM 初始化完成、可以设置滤波器。

    无需进入 初始化模式即可设置滤波器。

    -------

    请尝试根据我的项目测试 MCAN。

    设置正确的滤波器将正常工作。

    -------

    检查是否启用 RXFIFO1中断、这也会导致触发 MCAN 中断。

    此外、中断需要检查您启用的每个中断以确认触发了哪个中断。

    不要在中断中放置 printf 函数、printf 会花费大量时间来处理 printf 字符串。

    此致、

    Helic

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

    您好!

    虽然需要等待 MCAN RAM 初始化完成、但您可以设置过滤器。

    我将我的 SYSCFG_DL_MCAN0_init ()与 mcan_multi_MSPMCAN_Interrupt_45MSPM0G3507_nortos_ticlang Msg_Rx 示例工程中的 SYSCFG_DL_MCAN0_init ()进行了比较。

    这两个函数完全相同。

    MCAN RAM 初始化(

    /*等待内存初始化完成。 */
      while (false == DL_MCAN_isMemInitDone (MCAN0_INST));

    )等待完成后才能添加过滤器。

    这是您希望我确定的吗?

    ____________________________________________

    [报价 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5643601 #5643601"]

    请尝试根据我的项目测试 MCAN。

    设置正确的滤波器将正常工作。

    [报价]

    是的、我会检查一下。

    ____________________________________________

    检查是否启用 RXFIFO1中断

    我在 int main (void)开头启用了 FIFO 0新消息中断。

    DL_MCAN_enableIntr (MCAN0_INST、DL_MCAN_INTERRUPT_RF0N、1U);  // Rx FIFO 0新消息中断

    而不是

    DL_MCAN_INTERRUPT_RF0N

    我本可以选择这些选项

    DL_MCAN_INTR_SRC_RX_FIFO0_NEW_MSG

    我是对吗?

    我的源代码中没有针对 FIFO1的相应激活/启用中断。

    ____________________________________________

    此外、中断还需要检查您启用的每个中断以确认触发了哪个中断。

    我想要检查是什么触发了我的 IRQ、如下所示:

    void MCAN0_INST_IRQHandler(void)
    {
        switch (DL_MCAN_getPendingInterrupt(MCAN0_INST)) {
        
            case DL_MCAN_IIDX_LINE1:                                                    // RX FIFO 0 New Message - interrupt
    
                /* Check MCAN interrupts fired during RX of CAN package */
                gInterruptLine1Status |= DL_MCAN_getIntrStatus(MCAN0_INST);
    
                /* New message received by Rx FIFO 0 (Filter matched) */
                if(gInterruptLine1Status & DL_MCAN_INTERRUPT_RF0N) 
                {
                    ...
                }

    编辑:

    此外、我对我的代码进行调试、并且在"gInterruptLine1Status"上添加了观察表达式、结果表明每次 IRQ 被触发时、"gInterruptLine1Status"(gInterruptLine1Status)保存值0x20001。 因此设置了"消息 RAM 访问失败位"(MCAN_IR_MRAF_MASK)和"RX FIFO 0新消息位"(DL_MCAN_INTERRUPT_RF0N)。

    真的是每次设置两个位时。 无论我接收的是过滤器匹配还是非过滤器匹配的 CAN 消息 ID。

    什么可能导致出现"消息 RAM 访问失败"?

    在 hw_mcan.h 中、它指出:  

    The
    flag is set, when the Rx Handler:   -
    has not completed acceptance
    filtering or storage of an accepted
    message until the arbitration field
    of the following message has been
    received. In this case acceptance
    filtering or message storage is
    aborted and the Rx Handler starts
    processing of the following message.
    - was not able to write a message to
    the Message RAM. In this case message
    storage is aborted.   In both cases
    the FIFO put index is not updated
    resp. the New Data flag for a
    dedicated Rx Buffer is not set, a
    partly stored message is overwritten
    when the next message is stored to
    this location.   The flag is also set
    when the Tx Handler was not able to
    read a message from the Message RAM
    in time. In this case message
    transmission is aborted. In case of a
    Tx Handler access failure the MCAN is
    switched into Restricted Operation
    Mode. To leave Restricted Operation
    Mode, the Host CPU has to reset
    CCCR.ASM.   0  No Message RAM access
    failure occurred   1  Message RAM
    access failure occurred */

    但不幸的是,我不能做很多解释。

    ____________________________________________

    EDIT2:如果我在调试期间将接收到的消息视为"观察表达式"、我可以看到下面的设置位:

    amnf = 1:接受的不匹配帧-接收的帧与任何 Rx 过滤器元素不匹配

    过滤器索引(fidx)也很高(为"127")、以至于它似乎已尝试所有过滤器、并且它们都不匹配。

    因此、必须有一种方法可以为接收实际只接受过滤器匹配消息 ID 的 CAN 消息设置过滤器。
    因此、仅当接收到 ID 匹配(已过滤)的 CAN 消息时才会触发中断。

    ____________________________________________

    请勿将 printf 函数置于中断模式、printf 需要花费大量时间处理 printf 字符串。

    是的、当然。。。 我只将其用于调试。

    但这不会导致我的滤波问题、对吗?

    提前感谢!

    Matze

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

    您好、 

    您希望我确定这是什么吗?

    是的、看起来不错。

    我检查触发我的 IRQ 的原因如下:

    另外、记住手动清除中断。

    什么可能导致此"消息 RAM 访问失败"?

    RAM 初始化尚未完成、或者过滤器未成功写入 CAN RAM。

    请尝试该演示、本次演示可以从 CAN RAM 读取滤波器、您需要验证滤波器配置。

    e2e.ti.com/.../4174.mcan_5F00_multi_5F00_Filter_5F00_Control_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang.zip

    但这不会导致我的过滤问题、是不是?

    不太可能、但存在风险。

    此致、

    Helic

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

    您好!

    此外、请记住手动清除中断

    我通过以下代码行手动清除 IRQ 用例开始时的中断状态:

    DL_MCAN_clearIntrStatus (MCAN0_INST、gInterruptLine1Status、DL_MCAN_INTR_SRC_MCAN_LINE_1);

    根据在中断状态寄存器以及 gInterruptLine1Status I 中设置的位、在处理 IRQ 中的相应问题之后、通过以下方式清除这些位:

    gInterruptLine1Status &=μ~(MCAN_IR_RF0N_MASK);

    和/或

    gInterruptLine1Status 并且=μ~(MCAN_IR_MRAF_MASK);

    当我在 IRQ 之后检查 gInterruptLine1Status 时、它保持预期的值0x00。

    我必须纠正自己:

    当一个传入消息(无论 ID 是什么)触发该中断时、只有 RF0N 位被置位。

    但是、当传入消息不触发中断时(在这里、ID 是否包含在过滤器配置中也没有区别)、之后一条新消息会触发中断、RF0N 和 MRAF 两个位都被置位。

    [报价 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464722/mspm0g3507-can-rx-gets-stuck-when-multiple-messages-are-incoming/5646035 #5646035"]

    RAM 初始化尚未完成、或者过滤器未成功写入 CAN RAM。

    请尝试该演示、本次演示可以从 CAN RAM 读取滤波器、您需要验证滤波器配置。

    4174.mcan_multi_mcan_ Filter_Control_LP_MSPM0G3507_nortos_ticlang.zip

    [报价]

    谢谢、我将尝试此示例!

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

    您好、 

    但是当传入消息未触发中断时(此处同样也是如此)、ID 是否包含在我的过滤器配置中没有区别)、并且在这之后一条新消息触发中断、将设置 RF0N 位和 MRAF 位。

    这有点奇怪。 ID 过滤器似乎无法正常工作。 两条消息将导致 MRAF。

    此外、还请检查 MCAN RAM 配置、所有过滤器和消息 RAM 都共享 SAM 1024bytes MCAN RAM 区域、请确保 这些器件在使用 RAM 时不重叠。

    下面我们举例说明:

    谢谢、我将尝试此示例!

    等待您的反馈。

    此致、

    Helic