/* * Copyright (c) 2015, Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_flexio_uart.h" #include "fsl_debug_console.h" /******************************************************************************* * Definitions ******************************************************************************/ #define BOARD_FLEXIO_BASE FLEXIO1 #define FLEXIO_UART_TX_PIN 6U #define FLEXIO_UART_RX_PIN 7U /* Select USB1 PLL (480 MHz) as flexio clock source */ #define FLEXIO_CLOCK_SELECT (3U) /* Clock pre divider for flexio clock source */ #define FLEXIO_CLOCK_PRE_DIVIDER (4U) /* Clock divider for flexio clock source */ #define FLEXIO_CLOCK_DIVIDER (7U) #define FLEXIO_CLOCK_FREQUENCY \ (CLOCK_GetFreq(kCLOCK_Usb1PllClk) / (FLEXIO_CLOCK_PRE_DIVIDER + 1U) / (FLEXIO_CLOCK_DIVIDER + 1U)) #define ECHO_BUFFER_LENGTH 24 /******************************************************************************* * Prototypes ******************************************************************************/ /* UART user callback */ void FLEXIO_UART_UserCallback(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, status_t status, void *userData); /******************************************************************************* * Variables ******************************************************************************/ flexio_uart_handle_t g_uartHandle; FLEXIO_UART_Type uartDev; uint8_t g_tipString[] = "Flexio uart interrupt example\r\nBoard receives 8 characters then sends them out\r\nNow please input:\r\n"; uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0}; uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0}; volatile bool rxBufferEmpty = true; volatile bool txBufferFull = false; volatile bool txOnGoing = false; volatile bool rxOnGoing = false; /******************************************************************************* * Code ******************************************************************************/ /* UART user callback */ void FLEXIO_UART_UserCallback(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, status_t status, void *userData) { userData = userData; if (kStatus_FLEXIO_UART_TxIdle == status) { txBufferFull = false; txOnGoing = false; } if (kStatus_FLEXIO_UART_RxIdle == status) { rxBufferEmpty = false; rxOnGoing = false; } } /* Receiver Buffer */ #define BUF_SIZE 50 unsigned char RX_BUFF[BUF_SIZE] = {0}; // Maximum message size, Note: this is legacy value, may be changed #define DEF_MAX_SIZE_OF_MSG_LENGTH 768 // Maximum buffer size, Note: this is legacy value, may be changed #define DEF_MAX_SIZE_OF_MSG_BUFF (DEF_MAX_SIZE_OF_MSG_LENGTH - 4 * sizeof(uint32_t)) // MSG_FORMAT - TODO: this is legacy format, kept for compatibility with existing AC code typedef struct MSG_FORMAT { uint32_t msgID; uint32_t msgLen; char Buffer[DEF_MAX_SIZE_OF_MSG_BUFF]; uint32_t crc32; }__attribute__((packed)) MSG_FORMAT; // TX Buffer MSG_FORMAT *m_ptrTxBuff; // RX Buffer MSG_FORMAT *m_ptrRxBuff; /*! * @brief Main function */ int main(void) { unsigned int iLen = 0; uint32_t iMsgId; flexio_uart_config_t config; flexio_uart_transfer_t xfer; flexio_uart_transfer_t sendXfer; flexio_uart_transfer_t receiveXfer; status_t result = kStatus_Success; BOARD_ConfigMPU(); BOARD_InitBootPins(); BOARD_InitBootClocks(); /*For console only uart 1 which is default*/ BOARD_InitDebugConsole(); /* Clock setting for Flexio */ CLOCK_SetMux(kCLOCK_Flexio1Mux, FLEXIO_CLOCK_SELECT); CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, FLEXIO_CLOCK_PRE_DIVIDER); CLOCK_SetDiv(kCLOCK_Flexio1Div, FLEXIO_CLOCK_DIVIDER); /* * config.enableUart = true; * config.enableInDoze = false; * config.enableInDebug = true; * config.enableFastAccess = false; * config.baudRate_Bps = 115200U; * config.bitCountPerChar = kFLEXIO_UART_8BitsPerChar; */ /*uart2 */ FLEXIO_UART_GetDefaultConfig(&config); config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE; config.enableUart = true; uartDev.flexioBase = BOARD_FLEXIO_BASE; uartDev.TxPinIndex = FLEXIO_UART_TX_PIN; uartDev.RxPinIndex = FLEXIO_UART_RX_PIN; uartDev.shifterIndex[0] = 0U; uartDev.shifterIndex[1] = 1U; uartDev.timerIndex[0] = 0U; uartDev.timerIndex[1] = 1U; result = FLEXIO_UART_Init(&uartDev, &config, FLEXIO_CLOCK_FREQUENCY); if (result != kStatus_Success) { return -1; } FLEXIO_UART_TransferCreateHandle(&uartDev, &g_uartHandle, FLEXIO_UART_UserCallback, NULL); /* Send g_tipString out. */ xfer.data = g_tipString; xfer.dataSize = sizeof(g_tipString) - 1; txOnGoing = true; FLEXIO_UART_TransferSendNonBlocking(&uartDev, &g_uartHandle, &xfer); /* Wait send finished */ while (txOnGoing) { } /* Start to echo. */ sendXfer.data = g_txBuffer; sendXfer.dataSize = ECHO_BUFFER_LENGTH; receiveXfer.data = g_rxBuffer; receiveXfer.dataSize = ECHO_BUFFER_LENGTH; while (1) { // /* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */ if ((!rxOnGoing) && rxBufferEmpty) { rxOnGoing = true; FLEXIO_UART_TransferReceiveNonBlocking(&uartDev, &g_uartHandle, &receiveXfer, NULL); // PRINTF("\r\%d \r\n",(uint32_t)receiveXfer.rxData); } /* If TX is idle and g_txBuffer is full, start to send data. */ if ((!txOnGoing) && txBufferFull) { txOnGoing = true; FLEXIO_UART_TransferSendNonBlocking(&uartDev, &g_uartHandle, &sendXfer); } /* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */ if ((!rxBufferEmpty) && (!txBufferFull)) { memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH); PRINTF("\r\n iLen %d\r\n",sizeof(g_txBuffer)); rxBufferEmpty = true; txBufferFull = true; } } }