你(们)好、
到目前为止、从 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 进行中断切换。