ZHCAF96 April 2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519
在 SDK 中的当前演示项目中,将 RX 配置为 FIFO 模式。下一节介绍了如何在缓冲模式下使用 RX。
static const DL_MCAN_StdMsgIDFilterElement gMCAN0StdFiltelem = {
.sfec = 0x7,
.sft = 0x0,
.sfid1 = 3,
.sfid2 = 0x0,
};
/* Configure Standard ID filter element */
DL_MCAN_addStdMsgIDFilter(MCAN0_INST, 0U, (DL_MCAN_StdMsgIDFilterElement *) &gMCAN0StdFiltelem);
当滤波器元素配置为 Store into Rx buffer 或调试消息时,将启用 RX 缓冲区模式。首先,添加一个 .sfec 为 0x7 的滤波器。将 .sfec 设置为 0x7 时,.sft 无关紧要。sfid1 是滤波器 ID,接收消息 ID 必须与该 ID 相匹配才能接收。sfid2 能配置使用哪个 Rx 缓冲器来存储已接收的消息。
/* New message received by Rx Buffer (Filter matched) */
if(gInterruptLineStatus & DL_MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG){
gInterruptLine1Status |= DL_MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG;
DL_MCAN_getNewDataStatus(MCAN0_INST, &newDataStatus);
if(newDataStatus.statusLow) {
/* Check Rx Buffer0 status */
if(newDataStatus.statusLow & 0x1){
DL_MCAN_readMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, MCAN_RX_MSG_BUFFER_INDEX, 0U, &rxMsg);
ProcessCanRxMsg(&rxMsg);
}
/* Check remaining Rx Buffer */
}
if(newDataStatus.statusHigh) {
; /* 32-63, not applicable in demo */
}
/* Clear all new data status */
DL_MCAN_clearNewDataStatus(MCAN0_INST, &newDataStatus);
}
当接收到一条与滤波器配置匹配的消息时,该 RX 消息被存储到 RX 缓冲区 0 到 63 的范围。首先,获取新的数据状态。如果 RX 缓冲区 0 至 RX 缓冲区 31 中接收到新消息,则 newDataStatus.statusLow 的相应位将设置为 1。如果 RX 缓冲区 32 到 RX 缓冲区 63 中接收到新消息,则 newDataStatus.statusHigh 的相应位将设置为 1。然后,检查 RX 缓冲区 0 中是否接收到新消息。如果是,则使用 MCAN_RX_MSG_BUFFER_INDEX 值调用 DL_MCAN_readMsgRam() 来读取 RX 消息。在本例中,RX 缓冲区 0 的索引值为 0。最后,在处理消息后,调用 DL_MCAN_clearNewDataStatus() 清除新数据状态。