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**** 1963285 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:

Fullscreen
1
2
3
4
#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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我注释掉了 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 掩码:

    Fullscreen
    1
    2
    3
    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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //
    // 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;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    现在中断按预期触发。

    谢谢!

    Diane

x 出现错误。请重试或与管理员联系。