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.

[参考译文] TMS320F280025C:CAN RX 中断不会触发

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1371625/tms320f280025c-can-rx-interrupt-doesn-t-fire

器件型号:TMS320F280025C

工具与软件:

我试图让示例"can_ex2_loopback_interrupts"在非测试模式下工作。

我引用了 sprace5a、但我仍然不知道自己做错了什么。

我有2个物理 CAN 节点、它们通过 T 连接连接连接到 LaunchPad 的 J14 H/L 引脚。  我将可以布线 S4切换到"XCVR"。

我更新了示例项目以使用默认的 CAN GPIO 引脚32/33:

#define DEVICE_GPIO_PIN_CANTXA      32U             // GPIO number for CANTXA
#define DEVICE_GPIO_PIN_CANRXA      33U             // GPIO number for CANRXA
#define DEVICE_GPIO_CFG_CANTXA      GPIO_32_CANA_TX  // "pinConfig" for CANA TX
#define DEVICE_GPIO_CFG_CANRXA      GPIO_33_CANA_RX  // "pinConfig" for CANA RX

我注释掉了 can_enableTestMode ()调用。

我将所有时钟设置保持原样、使用默认值。

我可以通过轮询方式发送/接收 CAN 消息。  但 CAN 中断只会以状态= CAN_INT_INT0ID_STATUS 和 TX_MSG_OBJ_ID 触发、而不会以 RX_MSG_OBJ_ID 触发。

谢谢!

Diane

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

    当我尝试在接收模式下运行"CAN_Ex5_Transmit_receive"时、我会看到类似的行为。

    我使用外部第三方工具(ESD CANreal)生成 CAN 流量。

    ISR 仅会以 STATUS = CAN_INT_INT0ID_STATUS 触发。

    在 ISR 内部、我可以看到 CAN_ES 寄存器指示一个 RxOk:

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

    您好!

    看起来您的两次测试都已收到 CAN 帧、即您可以监控 ISR 中的"status"变量。  您能否在主机上将消息 ID 匹配到0x1并查看是否可以接收该帧?

    此致、

    约瑟夫

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

    作者:Joseph、

    似乎我遇到了2个不同的问题。  在"can_ex5_transmit_receive"和"can_ex2_loopback_interrupts"中、我忘记添加 RX msg 掩码:

        CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID, 0x15555555,
                               CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0xFFFFFFFF,
                               CAN_MSG_OBJ_RX_INT_ENABLE | CAN_MSG_OBJ_USE_ID_FILTER, MSG_DATA_LENGTH);

    但在我的实际应用(太长而无法连接)中、我像这样设置 RX_INT_ENABLE 标志、这似乎不起作用:

        //
        // Enable receive interrupts if they should be enabled.
        //
        msgCtrl |= (flags & CAN_MSG_OBJ_RX_INT_ENABLE);
        
        //
        // Set the Control, Arb, and Mask bit so that they get transferred to the
        // Message object.
        //
        cmdMaskReg |= CAN_IF1CMD_ARB;
        cmdMaskReg |= CAN_IF1CMD_CONTROL;
        cmdMaskReg |= CAN_IF1CMD_MASK;
        cmdMaskReg |= CAN_IF1CMD_DIR;
    
        //
        // Write out the registers to program the message object.
        //
        HWREG_BP(base + CAN_O_IF1MSK) = maskReg;
        HWREG_BP(base + CAN_O_IF1ARB) = arbReg;
        HWREG_BP(base + CAN_O_IF1MCTL) = msgCtrl;
        
        //
        // Transfer data to message object RAM
        //
        HWREG_BP(base + CAN_O_IF1CMD) =
        cmdMaskReg | (objID & CAN_IF1CMD_MSG_NUM_M);

    相反,通过 can_setupMessageObject()设置它的作用是:

        // Setup mbox 2 for RX
        CAN_setupMessageObject(CANA_BASE,
                               2,
                               0x80,
                               CAN_MSG_FRAME_STD,
                               CAN_MSG_OBJ_TYPE_RX,
                               0x1FFC0000,                       // msg id mask to accept all msg ids
                               CAN_MSG_OBJ_RX_INT_ENABLE | CAN_MSG_OBJ_USE_ID_FILTER,        // enable RX msg mask
                               8);

    现在中断按预期触发。

    谢谢!

    Diane