From f0d75b883e0743b76f67de813a66c9dd60762366 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Tue, 28 Jun 2016 15:20:13 +0200 Subject: can: FlexCAN initialization --- source/main.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/source/main.c b/source/main.c index 64f5bcc..d7e10e4 100644 --- a/source/main.c +++ b/source/main.c @@ -39,6 +39,7 @@ #include "clock_config.h" #include "fsl_debug_console.h" #include "fsl_mpu.h" +#include "fsl_flexcan.h" #include "usb_host_config.h" #include "usb.h" #include "usb_host.h" @@ -177,18 +178,204 @@ static void USB_HostTask(void *param) } } + +#define RX_MESSAGE_BUFFER_NUM (9) +#define TX_MESSAGE_BUFFER_NUM (8) +#define RX_MESSAGE_BUFFER_NUM1 (7) +#define TX_MESSAGE_BUFFER_NUM1 (6) + +flexcan_handle_t flexcanHandle[2]; +uint32_t txIdentifier[2]; +uint32_t rxIdentifier[2]; +volatile bool txComplete[2] = {false, false}; +volatile bool rxComplete[2] = {false, false}; + +static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData) +{ + switch (status) + { + case kStatus_FLEXCAN_RxIdle: + if (RX_MESSAGE_BUFFER_NUM == result) + { + rxComplete[0] = true; + } + break; + + case kStatus_FLEXCAN_TxIdle: + if (TX_MESSAGE_BUFFER_NUM == result) + { + txComplete[0] = true; + } + break; + + default: + break; + } +} + +static void flexcan_callback1(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData) +{ + switch (status) + { + case kStatus_FLEXCAN_RxIdle: + if (RX_MESSAGE_BUFFER_NUM1 == result) + { + rxComplete[1] = true; + } + break; + + case kStatus_FLEXCAN_TxIdle: + if (TX_MESSAGE_BUFFER_NUM1 == result) + { + txComplete[1] = true; + } + break; + + default: + break; + } +} + +void CAN_Init() +{ + flexcan_config_t flexcanConfig; + flexcan_rx_mb_config_t mbConfig; + + txIdentifier[0] = 0x321; + rxIdentifier[0] = 0x123; + txIdentifier[1] = 0x123; + rxIdentifier[1] = 0x321; + + /* Get FlexCAN module default Configuration. */ + /* + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc; + * flexcanConfig.baudRate = 125000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.enableDoze = false; + */ + FLEXCAN_GetDefaultConfig(&flexcanConfig); + + /* Init FlexCAN module. */ + flexcanConfig.clkSrc = kFLEXCAN_ClkSrcPeri; + FLEXCAN_Init(CAN0, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk)); + + /* Create FlexCAN handle structure and set call back function. */ + FLEXCAN_TransferCreateHandle(CAN0, &flexcanHandle[0], flexcan_callback0, NULL); + + /* Set Rx Masking mechanism. */ + FLEXCAN_SetRxMbGlobalMask(CAN0, FLEXCAN_RX_MB_STD_MASK(rxIdentifier[0], 0, 0)); + + /* Setup Rx Message Buffer. */ + mbConfig.format = kFLEXCAN_FrameFormatStandard; + mbConfig.type = kFLEXCAN_FrameTypeData; + mbConfig.id = FLEXCAN_ID_STD(rxIdentifier[0]); + FLEXCAN_SetRxMbConfig(CAN0, RX_MESSAGE_BUFFER_NUM, &mbConfig, true); + + /* Setup Tx Message Buffer. */ + FLEXCAN_SetTxMbConfig(CAN0, TX_MESSAGE_BUFFER_NUM, true); + + /* Get FlexCAN module default Configuration. */ + /* + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc; + * flexcanConfig.baudRate = 125000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.enableDoze = false; + */ + FLEXCAN_GetDefaultConfig(&flexcanConfig); + + /* Init FlexCAN module. */ + flexcanConfig.clkSrc = kFLEXCAN_ClkSrcPeri; + FLEXCAN_Init(CAN1, &flexcanConfig, CLOCK_GetFreq(kCLOCK_BusClk)); + + /* Create FlexCAN handle structure and set call back function. */ + FLEXCAN_TransferCreateHandle(CAN1, &flexcanHandle[1], flexcan_callback1, NULL); + + /* Set Rx Masking mechanism. */ + FLEXCAN_SetRxMbGlobalMask(CAN1, FLEXCAN_RX_MB_STD_MASK(rxIdentifier[1], 0, 0)); + + /* Setup Rx Message Buffer. */ + mbConfig.format = kFLEXCAN_FrameFormatStandard; + mbConfig.type = kFLEXCAN_FrameTypeData; + mbConfig.id = FLEXCAN_ID_STD(rxIdentifier[1]); + FLEXCAN_SetRxMbConfig(CAN1, RX_MESSAGE_BUFFER_NUM1, &mbConfig, true); + + /* Setup Tx Message Buffer. */ + FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM1, true); + PRINTF("CAN init done \r\n"); +} + /*! * @brief Application entry point. */ int main(void) { + flexcan_frame_t txFrame, rxFrame; + flexcan_mb_transfer_t txXfer, rxXfer; /* Init board hardware. */ BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); PRINTF("Hello!\r\n"); USB_HostApplicationInit(); + CAN_Init(); /* Add your code here */ + rxXfer.frame = &rxFrame; + rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM1; + FLEXCAN_TransferReceiveNonBlocking(CAN1, &flexcanHandle[1], &rxXfer); + + txFrame.format = kFLEXCAN_FrameFormatStandard; + txFrame.type = kFLEXCAN_FrameTypeData; + txFrame.id = FLEXCAN_ID_STD(0x321); + txFrame.length = 8; + txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) | + CAN_WORD0_DATA_BYTE_3(0x44); + txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) | + CAN_WORD1_DATA_BYTE_7(0x88); + txXfer.frame = &txFrame; + txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM; + + PRINTF("tx word0 = 0x%x\r\n", txFrame.dataWord0); + PRINTF("tx word1 = 0x%x\r\n", txFrame.dataWord1); + PRINTF("CAN0->CAN1\r\n"); + + FLEXCAN_TransferSendNonBlocking(CAN0, &flexcanHandle[0], &txXfer); + while (!rxComplete[1]) + { + } + PRINTF("rx word0 = 0x%x\r\n", rxFrame.dataWord0); + PRINTF("rx word1 = 0x%x\r\n", rxFrame.dataWord1); + + rxXfer.frame = &rxFrame; + rxXfer.mbIdx = RX_MESSAGE_BUFFER_NUM; + FLEXCAN_TransferReceiveNonBlocking(CAN0, &flexcanHandle[0], &rxXfer); + + txFrame.format = kFLEXCAN_FrameFormatStandard; + txFrame.type = kFLEXCAN_FrameTypeData; + txFrame.id = FLEXCAN_ID_STD(0x123); + txFrame.length = 8; + txFrame.dataWord0 = CAN_WORD0_DATA_BYTE_0(0x11) | CAN_WORD0_DATA_BYTE_1(0x22) | CAN_WORD0_DATA_BYTE_2(0x33) | + CAN_WORD0_DATA_BYTE_3(0x44); + txFrame.dataWord1 = CAN_WORD1_DATA_BYTE_4(0x55) | CAN_WORD1_DATA_BYTE_5(0x66) | CAN_WORD1_DATA_BYTE_6(0x77) | + CAN_WORD1_DATA_BYTE_7(0x88); + txXfer.frame = &txFrame; + txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM1; + + PRINTF("tx word0 = 0x%x\r\n", txFrame.dataWord0); + PRINTF("tx word1 = 0x%x\r\n", txFrame.dataWord1); + PRINTF("CAN1->CAN0\r\n"); + + FLEXCAN_TransferSendNonBlocking(CAN1, &flexcanHandle[1], &txXfer); + while (!rxComplete[0]) + { + } + PRINTF("rx word0 = 0x%x\r\n", rxFrame.dataWord0); + PRINTF("rx word1 = 0x%x\r\n", rxFrame.dataWord1); /* Create RTOS task */ if (xTaskCreate(USB_HostTask, "usb host task", 2000L / sizeof(portSTACK_TYPE), g_HostHandle, 4, NULL) != pdPASS) -- cgit v1.2.3