summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2016-06-28 15:20:13 +0200
committerDominik Sliwa <dominik.sliwa@toradex.com>2016-06-28 16:38:29 +0200
commitf0d75b883e0743b76f67de813a66c9dd60762366 (patch)
treed483f028f125f10da91c845060628918aceac9b4
parentfa209ec01431327fcd0ea9684e35b15f0e755d0e (diff)
can: FlexCAN initialization
-rw-r--r--source/main.c187
1 files changed, 187 insertions, 0 deletions
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)