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.

[参考译文] TMS320F28.0048万C-Q1:DCAN:如何同时使用CANINT0和CANINT1?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1099537/tms320f280048c-q1-dcan-how-can-i-use-both-canint0-and-canint1-at-the-same-time

部件号:TMS320F28.0048万C-Q1

各位专家,您好!

根据我链接到的线程,如何同时使用两个中断行?
在我的代码中,CANINT0用于检查传输数据包的TxOk状态,以便我知道我的消息是否成功传输。 我还想在CANINT1的全局中断接收到数据包时获取中断。 但是,当接收到消息对象时,我不会得到任何中断。 如何解决此问题?
下面是我的代码的几个部分:

void CAN_init(void)
{
    //CAN initialization
    CAN_initModule(CAN_BASE);

    // Refer to the Driver Library User Guide for information on how to set
    // tighter timing control. Additionally, consult the device data sheet
    // for more information about the CAN module clocking.
    //
    CAN_setBitRate(CAN_BASE, DEVICE_SYSCLK_FREQ, 100000, 20);

    // Enable CAN Interrupts
    CAN_enableInterrupt(CAN_BASE, CAN_INT_IE1|CAN_INT_STATUS);

    CAN_enableGlobalInterrupt(CAN_BASE, CAN_GLOBAL_INT_CANINT1);
    
    // Initialize the transmit message object used for sending CAN messages.
    // Message Object Parameters:
    //      Message Object ID Number: 1
    //      Message Identifier: 1
    //      Message Frame: CAN_MSG_FRAME_STD
    //      Message Type: CAN_MSG_OBJ_TYPE_RX
    //      Message ID Mask: 0
    //      Message Object Flags: CAN_MSG_OBJ_RX_INT_ENABLE
    //      Message Data Length: 8 Bytes
    //
    CAN_setupMessageObject(CAN_BASE, 1, 1, CAN_MSG_FRAME_STD,CAN_MSG_OBJ_TYPE_RX, 0, CAN_MSG_OBJ_RX_INT_ENABLE,8);
    // Initialize the transmit message object used for sending CAN messages.
    // Message Object Parameters:
    //      Message Object ID Number: 2
    //      Message Identifier: 2
    //      Message Frame: CAN_MSG_FRAME_STD
    //      Message Type: CAN_MSG_OBJ_TYPE_TX
    //      Message ID Mask: 0
    //      Message Object Flags: CAN_MSG_OBJ_TX_INT_ENABLE
    //      Message Data Length: 8 Bytes
    //
    CAN_setupMessageObject(CAN_BASE, 2, 2, CAN_MSG_FRAME_STD,CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_TX_INT_ENABLE,8);
    
    CAN_setInterruptMux(CAN_BASE, 2);       <-----------to use CANINT1 for msg obj 1
    //
    // Start CAN module operations
    //
    CAN_startModule(CAN_BASE);
};

CANINT1是我唯一启用的中断:

    //
    // This registers the interrupt handler in PIE vector table.
    //
    Interrupt_register(INT_CANB1, &ISR_can1);
    
    //
    // Enable the CAN-B interrupt signal
    //
    Interrupt_enable(INT_CANB1);

我使用以下代码验证传输是否成功:

bool canGetTxOkStatus(void)
{
    uint16_t status;
    status = CAN_getStatus(CAN_BASE);
    if ( (status & CAN_STATUS_TXOK) == CAN_STATUS_TXOK)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

    您好,Mina:

    感谢您的提问! 深入其中:

        // Enable CAN Interrupts
        CAN_enableInterrupt(CAN_BASE, CAN_INT_IE1|CAN_INT_STATUS);

    INT1实际上不能在状态源或错误源上中断,只能在RX/TX中断上中断。 有关中断拓扑之间的差异,请参见TRM的下图。 顶部是 可以检测到SIE (状态更改中断)和EIE (错误中断)的位置。 请注意它们如何仅适用于CAN0INT,而不适用于CAN1INT。

    因此,为了让RxIE通过CAN1INT (从下图),您需要执行以下操作。

    1.首先,仅启用CAN_INT_IE1:

        // Enable CAN Interrupts
        CAN_enableInterrupt(CAN_BASE, CAN_INT_IE1);

    编辑:原始响应中提供的mux更新代码对于消息对象1是正确的。

    更新的请求:

    2.请提供接收期间RX引脚的范围/逻辑分析仪捕获,以确保接收的波特率符合预期。 此外,请提供任何错误状态值,以确保数据包可能被“错误”接收,但不会触发ISR。

    此致,

    文斯

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

    您好,Vince,

    感谢您的回复。 遗憾的是,我无法提供任何捕获,但是如果我禁用了SIE,我的CAN传输工作正常。

    目前,我已禁用了SIE,我的代码正在工作。