Hi kerryzhou,
I am using mcu xpresso ide and folder is SDK_2.3.0_LPCXpresso54608\boards\lpcxpresso54608\driver_examples\mcan\loopback.
I am not using loopback mode and I have Can Transceiver.
Here you can see the code :
#include "fsl_debug_console.h"
#include "fsl_mcan.h"
#include "board.h"
#include "pin_mux.h"
#include <stdbool.h>
#include <canbus.h>
volatile bool txComplete = false;
volatile bool rxComplete = false;
mcan_tx_buffer_config_t txBuffer;
mcan_tx_buffer_frame_t txFrame;
mcan_rx_buffer_frame_t rxFrame;
uint8_t rcv_data[8];
uint16_t MSG[4];
uint32_t Can_get_ID;
mcan_config_t mcanConfig;
mcan_frame_filter_config_t rxFilter;
mcan_std_filter_element_config_t stdFilter;
mcan_rx_fifo_config_t rxFifo0;
mcan_buffer_transfer_t txXfer;
mcan_handle_t mcanHandle;
uint8_t count = 0;
void CAN0_IRQ0_IRQHandler(void)
{
MCAN_ClearStatusFlag(CAN0, CAN_IR_RF0N_MASK);
MCAN_ReadRxFifo(CAN0, 0, &rxFrame);
rxComplete = true;
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
void Can_Init(void)
{
CLOCK_SetClkDiv(kCLOCK_DivCan0Clk, 22U, true);
MCAN_GetDefaultConfig(&mcanConfig);
MCAN_Init(CAN0, &mcanConfig, CLOCK_GetFreq(kCLOCK_MCAN0));
/* Create MCAN handle structure and set call back function. */
MCAN_TransferCreateHandle(CAN0, &mcanHandle, mcan_callback, NULL);
MCAN_SetMsgRAMBase(CAN0, MSG_RAM_BASE);
uint32_t *p=(uint32_t *)(MSG_RAM_BASE);
memset(p, 0, TX_BUFFER_OFS + 0x10U);
rxFilter.address = 0x0;
rxFilter.idFormat = kMCAN_FrameIDStandard;
rxFilter.listSize = 1U;
rxFilter.nmFrame = kMCAN_reject0;
rxFilter.remFrame = kMCAN_rejectFrame;
MCAN_SetFilterConfig(CAN0, &rxFilter);
stdFilter.sfec = kMCAN_storeinFifo0;
stdFilter.sft = kMCAN_dual;
stdFilter.sfid1 = 0x000U;
stdFilter.sfid2 = 0x002U;
MCAN_SetSTDFilterElement(CAN0, &rxFilter, &stdFilter, 0);
rxFifo0.address = RX_FIFO0_OFS;
rxFifo0.elementSize = 1U;
rxFifo0.watermark = 0;
rxFifo0.opmode = kMCAN_FifoBlocking;
rxFifo0.datafieldSize = kMCAN_8ByteDatafield;
MCAN_SetRxFifo0Config(CAN0, &rxFifo0);
MCAN_EnableInterrupts(CAN0, 0, CAN_IE_RF0NE_MASK);
EnableIRQ(CAN0_IRQ0_IRQn);
MCAN_EnterNormalMode(CAN0);
}
void CAN_getmsg(void)
{
for(int a=0;a<8;a++) {rcv_data[a] = *(rxFrame.data + a);}
Can_get_ID = rxFrame.id>>18U;
PRINTF("GET_ID: %x", Can_get_ID);
PRINTF(" DATA: ");
{PRINTF(" %x %x",rcv_data[0],rcv_data[1]);}
PRINTF("\r\n");
}
int main(void)
{
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitPins();
BOARD_BootClockPLL180M();
BOARD_InitDebugConsole();
Can_Init();
while (1)
{
CAN_getmsg();
}
}