工具与软件:
您好!
我有关于 从 中断处理程序接收 CAN RX 帧的一些问题。 (完整的 处理程序代码 包含在底部)。
该软件基于 CAN RX 的示例项目实施、它 在 FIFO 模式下运行。
我想在您的帮助下澄清一些有点令人困惑的时刻。
首先、以下是在检查是否必要时进行的(我在 CAN Rx 的示例项目中看到过它)吗?
执行{
DL_MCAN_getRxFIFOStatus (CANFD0、&Rx_FS);
} while (Rx_fs.filllv)=0);
我想如果我们收到 Rx 事件、则 Rx FIFO 中已经存在消息、我无需轮询该消息。
其次。 如果 FIFO 中有多条消息被缓存、那么正确的读取方式是什么?
目前我只是这样做:
执行{
DL_MCAN_readMsgRam (CANFD0、DL_MCAN_MEM_TYPE_FIFO、0U、rx_fs.num、&rx_msg);
DL_MCAN_writeRxFIFOAck (CANFD0、Rx_fs.num、Rx_fs.getIdx);
对于(int i = 0;i < rx_msg.dlc;i++){
FRAME[i]= rx_msg.data[i];
}
can_rx_handler (rx_msg.id、frame、rx_msg.dlc);//处理接收的帧
DL_MCAN_getRxFIFOStatus (CANFD0、&Rx_FS);
} while (RX_FS.LVL fill>0);
下面是处理程序的完整代码片段:
void CANFD0_IRQHandler (void){
uint32_t intr_status;
DL_MCAN_RxFIFOStatus Rx_FS;
DL_MCAN_RxBufElement Rx_msg;
uint8_t FRAME[8];
开关(DL_MCAN_getPendingInterrupt (CANFD0)){
案例 DL_MCAN_IIDX_LINE0:
INTR_STATUS = DL_MCAN_getIntrStatus (CANFD0);
DL_MCAN_clearIntrStatus (CANFD0、intr_status、DL_MCAN_INTR_SRC_MCAN_LINE_0);
if ((intr_status 和 MCAN_IR_RF0N_MASK){
RX_FS.num = DL_MCAN_RX_FIFO_NUM_0;
//等待消息位于 FIFO 中
执行{
DL_MCAN_getRxFIFOStatus (CANFD0、&Rx_FS);
} while (Rx_fs.filllv)=0);
//读取 FIFO 为空
执行{
DL_MCAN_readMsgRam (CANFD0、DL_MCAN_MEM_TYPE_FIFO、0U、rx_fs.num、&rx_msg);
DL_MCAN_writeRxFIFOAck (CANFD0、Rx_fs.num、Rx_fs.getIdx);
对于(int i = 0;i < rx_msg.dlc;i++){
FRAME[i]= rx_msg.data[i];
}
can_rx_handler (rx_msg.id、frame、rx_msg.dlc);//处理接收的帧
DL_MCAN_getRxFIFOStatus (CANFD0、&Rx_FS);
} while (RX_FS.LVL fill>0);
}
if (intr_status 和 MCAN_IR_BO_MASK){
DL_MCAN_setOpMode (CANFD0、DL_MCAN_OPERATION_MODE_NORMAL);
}
休息;
默认值:
休息;
}
}