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 中断/中断的正确方法。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1475287/tms320f280025c-correct-way-to-disable-can-interrupt-interrupts

你(们)好、

到目前为止、从 F280025C 到 UART 屏幕的 UART 通信非常稳定、使用 TX FIFO 模式和16个缓冲器。

我们还在中断模式下顺利使用 CAN。 我们的器件一直在尝试每隔几毫秒发送一次 CAN 数据、但没有连接辅助 CAN 器件、并且这些 CAN TX 中断未引起任何问题。

我们首次连接了辅助 CAN 器件、该器件现在已开始导致 UART 通信出现问题。 CAN 中断(可能是 RX) 与 UART TX 同时发生、这会导致消息损坏(大概是时序受到影响)。

我尝试的做法未成功、是在 UART TX 完成之前关闭 CAN 中断、并在 UART TX 完成后重新启用 CAN 中断、但我仍然看到在 UART 消息传输期间发生 CAN 中断。 我通过在 CAN 中断开始时切换 GPIO 来验证了这一点、而在 UART TX 期间切换。  


您可以帮助查看我的代码并检查我的方法是否正确吗?  有数据要发送到屏幕时调用的函数(READY_TX_INTERRUPT)如下所示:

void ready_TX_interrupt (void)

while (msg_length < 17 && 16 - SCI_getTxFIFOStatus (SCIA_BASE)< msg_length)//new2025
{}


INTERRUPT_DISABLE (INT_CANA0);

// SCI_INTERRUPT_ENABLE ();

SCI_INTERRUPT_ACTIVE = true;//ss
SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXFF);
INTERRUPT_ENABLE (INT_SCIA_TX);

while (sci_interrupt_active=true)//块

//等待数据发送
}

if (can_renable_oken == true)


INTERRUPT_ENABLE (INT_CANA0);
}

}

在上述代码中、将等待  SCI_INTERRUPT_ACTIVE 变为 TRUE、这是在 UART 中断过程中完成的。  UART 中断过程如下所示:

_interrupt void sciaTXFIFOISR (void)

//写入一些数据
interrupt_count++;// block

SCI_writeCharArray (SCIA_BASE、(uint16_t*) msg、msg_length);//i 是大小

INTERRUPT_DISABLE (INT_SCIA_TX);

SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);

//
//发出 PIE ACK
//
interrupt_clearACKGroup (interrupt_ACK_group9);


SCI_INTERRUPT_ACTIVE = FALSE;

}

请注意、如果不使用、我的代码根本不起作用  INTERRUPT_DISABLE (INT_SCIA_TX);  在上述函数中实现共模抑制。  

如前所述、即使我在该 TX 过程中禁用了 CAN 中断、它们仍然会发生。 但是、如果我  在任何时候都将 can_renable_Okay 设置为 false (通常设置为 true)、我会看到 CAN 中断消失-不知道为什么会出现这种情况? IE 为什么他们只会在  CAN_REENABLE_OOK  被设置为 FALSE 的一段时间后失望?  

提前感谢您的帮助。

黄色表示 UART、蓝色表示可通过 GPIO 进行中断切换。

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

    没关系、我已经通过完全禁用 CAN 中断并只使用轮询来管理一种权变措施-似乎可以做到这一点。