JAJA859 April 2025 MSPM0G3506 , MSPM0G3507 , MSPM0G3518 , MSPM0G3519
RX は、SDK の現在のデモ プロジェクトにおいて 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);
RX バッファ モードは、フィルタ素子がRx バッファにストアとして、またはデバッグ メッセージとして構成されている場合に有効化されます。まず、.sfecfeca.a.0x7 のフィルタを追加します。.sft は .sfec が 0x7 として設定されている場合は関係ありません。.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 メッセージは 0 ~ 63 個の RX バッファに格納されます。まず、新しいデータ ステータスを取得します。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() を呼び出して新しいデータ ステータスをクリアします。