主题中讨论的其他器件: SysConfig
工具与软件:
嗨、
我修改了示例工程 mcan_message_rx_lp_MSPM0G3507_nortos_ticlang 以接收 CAN 消息。
如果我从 PC 发送 CAN 消息 CAN 软件狗(PCAN 视图)、MSPM0G3507会触发 CAN-RX 中断并接收和处理接收到的消息。
不时一条消息不会触发并中断。
但当我在第一条消息被处理之前发送第二条消息时、第二条消息没有被处理。
当我在短时间内发送多条消息时、可能会显示的消息似乎完全被卡住了。 即使我等待一段时间、新的 CAN 消息也不会触发新的中断。
我需要重新启动调试会话才能再次接收 CAN 消息。
我在"gInterruptLine1Status"上做了一个"watch expression"。
当接收停止时、它会变为0x0002000C 或0x00020004。
从技术参考手册中、我发现这似乎是(原始或屏蔽的)中断状态寄存器值。 并且会设置 SEC (单错校正)和/或 DED (双错检测)位。
我向 SysConfig 添加/编辑了以下配置、以某种方式触发中断或其他任何操作、从而能够处理"卡住"。
MCAN1.m0interrupts = ["DL_MCAN_MSP_INTERRUPT_DOUBLE_ERROR_DETECTION","DL_MCAN_MSP_INTERRUPT_LINE0","DL_MCAN_MSP_INTERRUPT_LINE1","DL_MCAN_MSP_INTERRUPT_SINGLE_ERROR_CORRECTION "]; MCAN1.interruptLine = ["DL_MCAN_INTR_LINE_NUM_0","DL_MCAN_INTR_LINE_NUM_1"]; MCAN1.rxFIFO0size = 10; MCAN1.rxFIFO0waterMark = 8; MCAN1.interruptFlags = ["DL_MCAN_INTERRUPT_RF0F","DL_MCAN_INTERRUPT_RF0N","DL_MCAN_INTERRUPT_RF0W"]; MCAN1.interruptLine0Flag = ["DL_MCAN_INTERRUPT_RF0F","DL_MCAN_INTERRUPT_RF0W"];
但除了 Rx 中断外、所有中断案例都不会被触发。 这是我的 CAN 中断处理程序:
void MCAN0_INST_IRQHandler(void)
{
printf("\nCAN_IRQ_handler");
switch (DL_MCAN_getPendingInterrupt(MCAN0_INST)) {
case DL_MCAN_IIDX_LINE0: // RX FIFO 0 Full - interrupt
__BKPT(0);
/* Check MCAN interrupts fired during TX/RX of CAN package */
gInterruptLine0Status |= DL_MCAN_getIntrStatus(MCAN0_INST);
DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine0Status,
DL_MCAN_INTR_SRC_MCAN_LINE_0);
printf("\nCAN_IRQ_Line0");
gServiceInt0 = true;
break;
case DL_MCAN_IIDX_LINE1: // RX FIFO 0 New Message - interrupt
/* Check MCAN interrupts fired during TX/RX of CAN package */
gInterruptLine1Status |= DL_MCAN_getIntrStatus(MCAN0_INST);
DL_MCAN_clearIntrStatus(MCAN0_INST, gInterruptLine1Status,
DL_MCAN_INTR_SRC_MCAN_LINE_1);
printf("\nCAN_IRQ_Line1");
gServiceInt1 = true;
break;
case DL_MCAN_IIDX_SINGLE_ERROR_CORRECTION:
__BKPT(0);
break;
case DL_MCAN_IIDX_DOUBLE_ERROR_DETECTION:
__BKPT(0);
break;
default:
__BKPT(0);
break;
}
}
有人可以帮我吗?
如果您需要更多信息,请告诉我;)
提前感谢!
Matze

