NXP's driver library for LPC17xx, ported to mbed's online compiler. Not tested! I had to fix a lot of warings and found a couple of pretty obvious bugs, so the chances are there are more. Original: http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip

Dependencies:   mbed

Committer:
igorsk
Date:
Wed Feb 17 16:22:39 2010 +0000
Revision:
0:1063a091a062

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:1063a091a062 1 /**
igorsk 0:1063a091a062 2 * @file : lpc17xx_uart.c
igorsk 0:1063a091a062 3 * @brief : Contains all functions support for UART firmware library on LPC17xx
igorsk 0:1063a091a062 4 * @version : 1.0
igorsk 0:1063a091a062 5 * @date : 18. Mar. 2009
igorsk 0:1063a091a062 6 * @author : HieuNguyen
igorsk 0:1063a091a062 7 **************************************************************************
igorsk 0:1063a091a062 8 * Software that is described herein is for illustrative purposes only
igorsk 0:1063a091a062 9 * which provides customers with programming information regarding the
igorsk 0:1063a091a062 10 * products. This software is supplied "AS IS" without any warranties.
igorsk 0:1063a091a062 11 * NXP Semiconductors assumes no responsibility or liability for the
igorsk 0:1063a091a062 12 * use of the software, conveys no license or title under any patent,
igorsk 0:1063a091a062 13 * copyright, or mask work right to the product. NXP Semiconductors
igorsk 0:1063a091a062 14 * reserves the right to make changes in the software without
igorsk 0:1063a091a062 15 * notification. NXP Semiconductors also make no representation or
igorsk 0:1063a091a062 16 * warranty that such application will be suitable for the specified
igorsk 0:1063a091a062 17 * use without further testing or modification.
igorsk 0:1063a091a062 18 **********************************************************************/
igorsk 0:1063a091a062 19
igorsk 0:1063a091a062 20 /* Peripheral group ----------------------------------------------------------- */
igorsk 0:1063a091a062 21 /** @addtogroup UART
igorsk 0:1063a091a062 22 * @{
igorsk 0:1063a091a062 23 */
igorsk 0:1063a091a062 24
igorsk 0:1063a091a062 25 /* Includes ------------------------------------------------------------------- */
igorsk 0:1063a091a062 26 #include "lpc17xx_uart.h"
igorsk 0:1063a091a062 27 #include "lpc17xx_clkpwr.h"
igorsk 0:1063a091a062 28
igorsk 0:1063a091a062 29 /* If this source file built with example, the LPC17xx FW library configuration
igorsk 0:1063a091a062 30 * file in each example directory ("lpc17xx_libcfg.h") must be included,
igorsk 0:1063a091a062 31 * otherwise the default FW library configuration file must be included instead
igorsk 0:1063a091a062 32 */
igorsk 0:1063a091a062 33 #ifdef __BUILD_WITH_EXAMPLE__
igorsk 0:1063a091a062 34 #include "lpc17xx_libcfg.h"
igorsk 0:1063a091a062 35 #else
igorsk 0:1063a091a062 36 #include "lpc17xx_libcfg_default.h"
igorsk 0:1063a091a062 37 #endif /* __BUILD_WITH_EXAMPLE__ */
igorsk 0:1063a091a062 38
igorsk 0:1063a091a062 39
igorsk 0:1063a091a062 40 #ifdef _UART
igorsk 0:1063a091a062 41
igorsk 0:1063a091a062 42 /* Private Types -------------------------------------------------------------- */
igorsk 0:1063a091a062 43 /** @defgroup UART_Private_Types
igorsk 0:1063a091a062 44 * @{
igorsk 0:1063a091a062 45 */
igorsk 0:1063a091a062 46
igorsk 0:1063a091a062 47 /**
igorsk 0:1063a091a062 48 * @brief UART call-back function type definitions
igorsk 0:1063a091a062 49 */
igorsk 0:1063a091a062 50 typedef struct {
igorsk 0:1063a091a062 51 fnTxCbs_Type *pfnTxCbs; // Transmit callback
igorsk 0:1063a091a062 52 fnRxCbs_Type *pfnRxCbs; // Receive callback
igorsk 0:1063a091a062 53 fnABCbs_Type *pfnABCbs; // Auto-Baudrate callback
igorsk 0:1063a091a062 54 fnErrCbs_Type *pfnErrCbs; // Error callback
igorsk 0:1063a091a062 55 } UART_CBS_Type;
igorsk 0:1063a091a062 56
igorsk 0:1063a091a062 57 /**
igorsk 0:1063a091a062 58 * @}
igorsk 0:1063a091a062 59 */
igorsk 0:1063a091a062 60
igorsk 0:1063a091a062 61
igorsk 0:1063a091a062 62 /* Private Variables ---------------------------------------------------------- */
igorsk 0:1063a091a062 63 /** @defgroup UART_Private_Variables
igorsk 0:1063a091a062 64 * @{
igorsk 0:1063a091a062 65 */
igorsk 0:1063a091a062 66
igorsk 0:1063a091a062 67
igorsk 0:1063a091a062 68 /** Call-back function pointer data */
igorsk 0:1063a091a062 69 UART_CBS_Type uartCbsDat[4] = {
igorsk 0:1063a091a062 70 {NULL, NULL, NULL, NULL},
igorsk 0:1063a091a062 71 {NULL, NULL, NULL, NULL},
igorsk 0:1063a091a062 72 {NULL, NULL, NULL, NULL},
igorsk 0:1063a091a062 73 {NULL, NULL, NULL, NULL},
igorsk 0:1063a091a062 74 };
igorsk 0:1063a091a062 75
igorsk 0:1063a091a062 76 /** UART1 modem status interrupt callback pointer data */
igorsk 0:1063a091a062 77 fnModemCbs_Type *pfnModemCbs = NULL;
igorsk 0:1063a091a062 78
igorsk 0:1063a091a062 79 /**
igorsk 0:1063a091a062 80 * @}
igorsk 0:1063a091a062 81 */
igorsk 0:1063a091a062 82
igorsk 0:1063a091a062 83
igorsk 0:1063a091a062 84 /* Private Functions ---------------------------------------------------------- */
igorsk 0:1063a091a062 85 /** @defgroup UART_Private_Functions
igorsk 0:1063a091a062 86 * @{
igorsk 0:1063a091a062 87 */
igorsk 0:1063a091a062 88
igorsk 0:1063a091a062 89 /**
igorsk 0:1063a091a062 90 * @brief Get UART number due to UART peripheral pointer
igorsk 0:1063a091a062 91 * @param[in] UARTx UART pointer
igorsk 0:1063a091a062 92 * @return UART number
igorsk 0:1063a091a062 93 */
igorsk 0:1063a091a062 94 uint8_t getUartNum(LPC_UART_TypeDef *UARTx) {
igorsk 0:1063a091a062 95 if (UARTx == (LPC_UART_TypeDef *)LPC_UART0) return (0);
igorsk 0:1063a091a062 96 else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1) return (1);
igorsk 0:1063a091a062 97 else if (UARTx == LPC_UART2) return (2);
igorsk 0:1063a091a062 98 else return (3);
igorsk 0:1063a091a062 99 }
igorsk 0:1063a091a062 100
igorsk 0:1063a091a062 101 /*********************************************************************//**
igorsk 0:1063a091a062 102 * @brief Determines best dividers to get a target clock rate
igorsk 0:1063a091a062 103 * @param[in] UARTx Pointer to selected UART peripheral, should be
igorsk 0:1063a091a062 104 * UART0, UART1, UART2 or UART3.
igorsk 0:1063a091a062 105 * @param[in] baudrate Desired UART baud rate.
igorsk 0:1063a091a062 106 * @return Error status.
igorsk 0:1063a091a062 107 **********************************************************************/
igorsk 0:1063a091a062 108
igorsk 0:1063a091a062 109 Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate)
igorsk 0:1063a091a062 110 {
igorsk 0:1063a091a062 111 Status errorStatus = ERROR;
igorsk 0:1063a091a062 112
igorsk 0:1063a091a062 113 uint32_t uClk=0;
igorsk 0:1063a091a062 114 uint32_t calcBaudrate = 0;
igorsk 0:1063a091a062 115 uint32_t temp = 0;
igorsk 0:1063a091a062 116
igorsk 0:1063a091a062 117 uint32_t mulFracDiv, dividerAddFracDiv;
igorsk 0:1063a091a062 118 uint32_t diviser = 0 ;
igorsk 0:1063a091a062 119 uint32_t mulFracDivOptimal = 1;
igorsk 0:1063a091a062 120 uint32_t dividerAddOptimal = 0;
igorsk 0:1063a091a062 121 uint32_t diviserOptimal = 0;
igorsk 0:1063a091a062 122
igorsk 0:1063a091a062 123 uint32_t relativeError = 0;
igorsk 0:1063a091a062 124 uint32_t relativeOptimalError = 100000;
igorsk 0:1063a091a062 125
igorsk 0:1063a091a062 126 /* get UART block clock */
igorsk 0:1063a091a062 127 if (UARTx == (LPC_UART_TypeDef *)LPC_UART0)
igorsk 0:1063a091a062 128 {
igorsk 0:1063a091a062 129 uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART0);
igorsk 0:1063a091a062 130 }
igorsk 0:1063a091a062 131 else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1)
igorsk 0:1063a091a062 132 {
igorsk 0:1063a091a062 133 uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART1);
igorsk 0:1063a091a062 134 }
igorsk 0:1063a091a062 135 else if (UARTx == LPC_UART2)
igorsk 0:1063a091a062 136 {
igorsk 0:1063a091a062 137 uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART2);
igorsk 0:1063a091a062 138 }
igorsk 0:1063a091a062 139 else if (UARTx == LPC_UART3)
igorsk 0:1063a091a062 140 {
igorsk 0:1063a091a062 141 uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART3);
igorsk 0:1063a091a062 142 }
igorsk 0:1063a091a062 143
igorsk 0:1063a091a062 144
igorsk 0:1063a091a062 145 uClk = uClk >> 4; /* div by 16 */
igorsk 0:1063a091a062 146 /* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers
igorsk 0:1063a091a062 147 * The formula is :
igorsk 0:1063a091a062 148 * BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL)
igorsk 0:1063a091a062 149 * It involves floating point calculations. That's the reason the formulae are adjusted with
igorsk 0:1063a091a062 150 * Multiply and divide method.*/
igorsk 0:1063a091a062 151 /* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions:
igorsk 0:1063a091a062 152 * 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */
igorsk 0:1063a091a062 153 for (mulFracDiv = 1 ; mulFracDiv <= 15 ;mulFracDiv++)
igorsk 0:1063a091a062 154 {
igorsk 0:1063a091a062 155 for (dividerAddFracDiv = 0 ; dividerAddFracDiv <= 15 ;dividerAddFracDiv++)
igorsk 0:1063a091a062 156 {
igorsk 0:1063a091a062 157 temp = (mulFracDiv * uClk) / ((mulFracDiv + dividerAddFracDiv));
igorsk 0:1063a091a062 158
igorsk 0:1063a091a062 159 diviser = temp / baudrate;
igorsk 0:1063a091a062 160 if ((temp % baudrate) > (baudrate / 2))
igorsk 0:1063a091a062 161 diviser++;
igorsk 0:1063a091a062 162
igorsk 0:1063a091a062 163 if (diviser > 2 && diviser < 65536)
igorsk 0:1063a091a062 164 {
igorsk 0:1063a091a062 165 calcBaudrate = temp / diviser;
igorsk 0:1063a091a062 166
igorsk 0:1063a091a062 167 if (calcBaudrate <= baudrate)
igorsk 0:1063a091a062 168 relativeError = baudrate - calcBaudrate;
igorsk 0:1063a091a062 169 else
igorsk 0:1063a091a062 170 relativeError = calcBaudrate - baudrate;
igorsk 0:1063a091a062 171
igorsk 0:1063a091a062 172 if ((relativeError < relativeOptimalError))
igorsk 0:1063a091a062 173 {
igorsk 0:1063a091a062 174 mulFracDivOptimal = mulFracDiv ;
igorsk 0:1063a091a062 175 dividerAddOptimal = dividerAddFracDiv;
igorsk 0:1063a091a062 176 diviserOptimal = diviser;
igorsk 0:1063a091a062 177 relativeOptimalError = relativeError;
igorsk 0:1063a091a062 178 if (relativeError == 0)
igorsk 0:1063a091a062 179 break;
igorsk 0:1063a091a062 180 }
igorsk 0:1063a091a062 181 } /* End of if */
igorsk 0:1063a091a062 182 } /* end of inner for loop */
igorsk 0:1063a091a062 183 if (relativeError == 0)
igorsk 0:1063a091a062 184 break;
igorsk 0:1063a091a062 185 } /* end of outer for loop */
igorsk 0:1063a091a062 186
igorsk 0:1063a091a062 187 if (relativeOptimalError < ((baudrate * UART_ACCEPTED_BAUDRATE_ERROR)/100))
igorsk 0:1063a091a062 188 {
igorsk 0:1063a091a062 189 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 190 {
igorsk 0:1063a091a062 191 ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 192 ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);
igorsk 0:1063a091a062 193 ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);
igorsk 0:1063a091a062 194 /* Then reset DLAB bit */
igorsk 0:1063a091a062 195 ((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
igorsk 0:1063a091a062 196 ((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \
igorsk 0:1063a091a062 197 | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;
igorsk 0:1063a091a062 198 }
igorsk 0:1063a091a062 199 else
igorsk 0:1063a091a062 200 {
igorsk 0:1063a091a062 201 UARTx->LCR |= UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 202 UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);
igorsk 0:1063a091a062 203 UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);
igorsk 0:1063a091a062 204 /* Then reset DLAB bit */
igorsk 0:1063a091a062 205 UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
igorsk 0:1063a091a062 206 UARTx->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \
igorsk 0:1063a091a062 207 | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;
igorsk 0:1063a091a062 208 }
igorsk 0:1063a091a062 209 errorStatus = SUCCESS;
igorsk 0:1063a091a062 210 }
igorsk 0:1063a091a062 211
igorsk 0:1063a091a062 212 return errorStatus;
igorsk 0:1063a091a062 213 }
igorsk 0:1063a091a062 214
igorsk 0:1063a091a062 215 /*********************************************************************//**
igorsk 0:1063a091a062 216 * @brief General UART interrupt handler and router
igorsk 0:1063a091a062 217 * @param[in] UARTx Selected UART peripheral, should be UART0..3
igorsk 0:1063a091a062 218 * @return None
igorsk 0:1063a091a062 219 *
igorsk 0:1063a091a062 220 * Note:
igorsk 0:1063a091a062 221 * - Handles transmit, receive, and status interrupts for the UART.
igorsk 0:1063a091a062 222 * Based on the interrupt status, routes the interrupt to the
igorsk 0:1063a091a062 223 * respective call-back to be handled by the user application using
igorsk 0:1063a091a062 224 * this driver.
igorsk 0:1063a091a062 225 * - If callback is not installed, corresponding interrupt will be disabled
igorsk 0:1063a091a062 226 * - All these interrupt source below will be checked:
igorsk 0:1063a091a062 227 * - Transmit Holding Register Empty.
igorsk 0:1063a091a062 228 * - Received Data Available and Character Time Out.
igorsk 0:1063a091a062 229 * - Receive Line Status (not implemented)
igorsk 0:1063a091a062 230 * - End of auto-baud interrupt (not implemented)
igorsk 0:1063a091a062 231 * - Auto-Baudrate Time-Out interrupt (not implemented)
igorsk 0:1063a091a062 232 * - Modem Status interrupt (UART0 Modem functionality)
igorsk 0:1063a091a062 233 * - CTS signal transition interrupt (UART0 Modem functionality)
igorsk 0:1063a091a062 234 **********************************************************************/
igorsk 0:1063a091a062 235 void UART_GenIntHandler(LPC_UART_TypeDef *UARTx)
igorsk 0:1063a091a062 236 {
igorsk 0:1063a091a062 237 uint8_t pUart, modemsts;
igorsk 0:1063a091a062 238 uint32_t intsrc, tmp, tmp1;
igorsk 0:1063a091a062 239
igorsk 0:1063a091a062 240 pUart = getUartNum(UARTx);
igorsk 0:1063a091a062 241
igorsk 0:1063a091a062 242 /* Determine the interrupt source */
igorsk 0:1063a091a062 243 intsrc = UARTx->IIR;
igorsk 0:1063a091a062 244 tmp = intsrc & UART_IIR_INTID_MASK;
igorsk 0:1063a091a062 245
igorsk 0:1063a091a062 246 /*
igorsk 0:1063a091a062 247 * In case of using UART1 with full modem,
igorsk 0:1063a091a062 248 * interrupt ID = 0 that means modem status interrupt has been detected
igorsk 0:1063a091a062 249 */
igorsk 0:1063a091a062 250 if (pUart == 1) {
igorsk 0:1063a091a062 251 if (tmp == 0){
igorsk 0:1063a091a062 252 // Check Modem status
igorsk 0:1063a091a062 253 modemsts = LPC_UART1->MSR & UART1_MSR_BITMASK;
igorsk 0:1063a091a062 254 // Call modem status call-back
igorsk 0:1063a091a062 255 if (pfnModemCbs != NULL){
igorsk 0:1063a091a062 256 pfnModemCbs(modemsts);
igorsk 0:1063a091a062 257 }
igorsk 0:1063a091a062 258 // disable modem status interrupt and CTS status change interrupt
igorsk 0:1063a091a062 259 // if its callback is not installed
igorsk 0:1063a091a062 260 else {
igorsk 0:1063a091a062 261 LPC_UART1->IER &= ~(UART1_IER_MSINT_EN | UART1_IER_CTSINT_EN);
igorsk 0:1063a091a062 262 }
igorsk 0:1063a091a062 263 }
igorsk 0:1063a091a062 264 }
igorsk 0:1063a091a062 265
igorsk 0:1063a091a062 266 // Receive Line Status
igorsk 0:1063a091a062 267 if (tmp == UART_IIR_INTID_RLS){
igorsk 0:1063a091a062 268 // Check line status
igorsk 0:1063a091a062 269 tmp1 = UARTx->LSR;
igorsk 0:1063a091a062 270 // Mask out the Receive Ready and Transmit Holding empty status
igorsk 0:1063a091a062 271 tmp1 &= (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE \
igorsk 0:1063a091a062 272 | UART_LSR_BI | UART_LSR_RXFE);
igorsk 0:1063a091a062 273 // If any error exist
igorsk 0:1063a091a062 274 if (tmp1) {
igorsk 0:1063a091a062 275 // Call Call-back function with error input value
igorsk 0:1063a091a062 276 if (uartCbsDat[pUart].pfnErrCbs != NULL) {
igorsk 0:1063a091a062 277 uartCbsDat[pUart].pfnErrCbs(tmp1);
igorsk 0:1063a091a062 278 }
igorsk 0:1063a091a062 279 // Disable interrupt if its call-back is not install
igorsk 0:1063a091a062 280 else {
igorsk 0:1063a091a062 281 UARTx->IER &= ~(UART_IER_RLSINT_EN);
igorsk 0:1063a091a062 282 }
igorsk 0:1063a091a062 283 }
igorsk 0:1063a091a062 284 }
igorsk 0:1063a091a062 285
igorsk 0:1063a091a062 286 // Receive Data Available or Character time-out
igorsk 0:1063a091a062 287 if ((tmp == UART_IIR_INTID_RDA) || (tmp == UART_IIR_INTID_CTI)){
igorsk 0:1063a091a062 288 // Call Rx call back function
igorsk 0:1063a091a062 289 if (uartCbsDat[pUart].pfnRxCbs != NULL) {
igorsk 0:1063a091a062 290 uartCbsDat[pUart].pfnRxCbs();
igorsk 0:1063a091a062 291 }
igorsk 0:1063a091a062 292 // Disable interrupt if its call-back is not install
igorsk 0:1063a091a062 293 else {
igorsk 0:1063a091a062 294 UARTx->IER &= ~(UART_IER_RBRINT_EN);
igorsk 0:1063a091a062 295 }
igorsk 0:1063a091a062 296 }
igorsk 0:1063a091a062 297
igorsk 0:1063a091a062 298 // Transmit Holding Empty
igorsk 0:1063a091a062 299 if (tmp == UART_IIR_INTID_THRE){
igorsk 0:1063a091a062 300 // Call Tx call back function
igorsk 0:1063a091a062 301 if (uartCbsDat[pUart].pfnTxCbs != NULL) {
igorsk 0:1063a091a062 302 uartCbsDat[pUart].pfnTxCbs();
igorsk 0:1063a091a062 303 }
igorsk 0:1063a091a062 304 // Disable interrupt if its call-back is not install
igorsk 0:1063a091a062 305 else {
igorsk 0:1063a091a062 306 UARTx->IER &= ~(UART_IER_THREINT_EN);
igorsk 0:1063a091a062 307 }
igorsk 0:1063a091a062 308 }
igorsk 0:1063a091a062 309
igorsk 0:1063a091a062 310 intsrc &= (UART_IIR_ABEO_INT | UART_IIR_ABTO_INT);
igorsk 0:1063a091a062 311 // Check if End of auto-baudrate interrupt or Auto baudrate time out
igorsk 0:1063a091a062 312 if (intsrc){
igorsk 0:1063a091a062 313 // Clear interrupt pending
igorsk 0:1063a091a062 314 UARTx->ACR |= ((intsrc & UART_IIR_ABEO_INT) ? UART_ACR_ABEOINT_CLR : 0) \
igorsk 0:1063a091a062 315 | ((intsrc & UART_IIR_ABTO_INT) ? UART_ACR_ABTOINT_CLR : 0);
igorsk 0:1063a091a062 316 if (uartCbsDat[pUart].pfnABCbs != NULL) {
igorsk 0:1063a091a062 317 uartCbsDat[pUart].pfnABCbs(intsrc);
igorsk 0:1063a091a062 318 } else {
igorsk 0:1063a091a062 319 // Disable End of AB interrupt
igorsk 0:1063a091a062 320 UARTx->IER &= ~(UART_IER_ABEOINT_EN | UART_IER_ABTOINT_EN);
igorsk 0:1063a091a062 321 }
igorsk 0:1063a091a062 322 }
igorsk 0:1063a091a062 323 }
igorsk 0:1063a091a062 324
igorsk 0:1063a091a062 325 /**
igorsk 0:1063a091a062 326 * @}
igorsk 0:1063a091a062 327 */
igorsk 0:1063a091a062 328
igorsk 0:1063a091a062 329
igorsk 0:1063a091a062 330 /* Public Functions ----------------------------------------------------------- */
igorsk 0:1063a091a062 331 /** @addtogroup UART_Public_Functions
igorsk 0:1063a091a062 332 * @{
igorsk 0:1063a091a062 333 */
igorsk 0:1063a091a062 334
igorsk 0:1063a091a062 335 /*********************************************************************//**
igorsk 0:1063a091a062 336 * @brief De-initializes the UARTx peripheral registers to their
igorsk 0:1063a091a062 337 * default reset values.
igorsk 0:1063a091a062 338 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 339 * UART2 or UART3.
igorsk 0:1063a091a062 340 * @return None
igorsk 0:1063a091a062 341 **********************************************************************/
igorsk 0:1063a091a062 342 void UART_DeInit(LPC_UART_TypeDef* UARTx)
igorsk 0:1063a091a062 343 {
igorsk 0:1063a091a062 344 // For debug mode
igorsk 0:1063a091a062 345 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 346
igorsk 0:1063a091a062 347 UART_TxCmd(UARTx, DISABLE);
igorsk 0:1063a091a062 348
igorsk 0:1063a091a062 349 #ifdef _UART0
igorsk 0:1063a091a062 350 if (UARTx == (LPC_UART_TypeDef *)LPC_UART0)
igorsk 0:1063a091a062 351 {
igorsk 0:1063a091a062 352 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 353 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, DISABLE);
igorsk 0:1063a091a062 354 }
igorsk 0:1063a091a062 355 #endif
igorsk 0:1063a091a062 356
igorsk 0:1063a091a062 357 #ifdef _UART1
igorsk 0:1063a091a062 358 if (UARTx == (LPC_UART_TypeDef *)LPC_UART1)
igorsk 0:1063a091a062 359 {
igorsk 0:1063a091a062 360 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 361 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, DISABLE);
igorsk 0:1063a091a062 362 }
igorsk 0:1063a091a062 363 #endif
igorsk 0:1063a091a062 364
igorsk 0:1063a091a062 365 #ifdef _UART2
igorsk 0:1063a091a062 366 if (UARTx == LPC_UART2)
igorsk 0:1063a091a062 367 {
igorsk 0:1063a091a062 368 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 369 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, DISABLE);
igorsk 0:1063a091a062 370 }
igorsk 0:1063a091a062 371 #endif
igorsk 0:1063a091a062 372
igorsk 0:1063a091a062 373 #ifdef _UART3
igorsk 0:1063a091a062 374 if (UARTx == LPC_UART3)
igorsk 0:1063a091a062 375 {
igorsk 0:1063a091a062 376 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 377 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, DISABLE);
igorsk 0:1063a091a062 378 }
igorsk 0:1063a091a062 379 #endif
igorsk 0:1063a091a062 380 }
igorsk 0:1063a091a062 381
igorsk 0:1063a091a062 382 /********************************************************************//**
igorsk 0:1063a091a062 383 * @brief Initializes the UARTx peripheral according to the specified
igorsk 0:1063a091a062 384 * parameters in the UART_ConfigStruct.
igorsk 0:1063a091a062 385 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 386 * UART2 or UART3.
igorsk 0:1063a091a062 387 * @param[in] UART_ConfigStruct Pointer to a UART_CFG_Type structure
igorsk 0:1063a091a062 388 * that contains the configuration information for the
igorsk 0:1063a091a062 389 * specified UART peripheral.
igorsk 0:1063a091a062 390 * @return None
igorsk 0:1063a091a062 391 *********************************************************************/
igorsk 0:1063a091a062 392 void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct)
igorsk 0:1063a091a062 393 {
igorsk 0:1063a091a062 394 uint32_t tmp;
igorsk 0:1063a091a062 395
igorsk 0:1063a091a062 396 // For debug mode
igorsk 0:1063a091a062 397 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 398 CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits));
igorsk 0:1063a091a062 399 CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits));
igorsk 0:1063a091a062 400 CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity));
igorsk 0:1063a091a062 401
igorsk 0:1063a091a062 402 #ifdef _UART0
igorsk 0:1063a091a062 403 if(UARTx == (LPC_UART_TypeDef *)LPC_UART0)
igorsk 0:1063a091a062 404 {
igorsk 0:1063a091a062 405 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 406 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, ENABLE);
igorsk 0:1063a091a062 407 }
igorsk 0:1063a091a062 408 #endif
igorsk 0:1063a091a062 409
igorsk 0:1063a091a062 410 #ifdef _UART1
igorsk 0:1063a091a062 411 if(UARTx == (LPC_UART_TypeDef *)LPC_UART1)
igorsk 0:1063a091a062 412 {
igorsk 0:1063a091a062 413 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 414 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, ENABLE);
igorsk 0:1063a091a062 415 }
igorsk 0:1063a091a062 416 #endif
igorsk 0:1063a091a062 417
igorsk 0:1063a091a062 418 #ifdef _UART2
igorsk 0:1063a091a062 419 if(UARTx == LPC_UART2)
igorsk 0:1063a091a062 420 {
igorsk 0:1063a091a062 421 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 422 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE);
igorsk 0:1063a091a062 423 }
igorsk 0:1063a091a062 424 #endif
igorsk 0:1063a091a062 425
igorsk 0:1063a091a062 426 #ifdef _UART3
igorsk 0:1063a091a062 427 if(UARTx == LPC_UART3)
igorsk 0:1063a091a062 428 {
igorsk 0:1063a091a062 429 /* Set up clock and power for UART module */
igorsk 0:1063a091a062 430 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, ENABLE);
igorsk 0:1063a091a062 431 }
igorsk 0:1063a091a062 432 #endif
igorsk 0:1063a091a062 433
igorsk 0:1063a091a062 434 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 435 {
igorsk 0:1063a091a062 436 /* FIFOs are empty */
igorsk 0:1063a091a062 437 ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN \
igorsk 0:1063a091a062 438 | UART_FCR_RX_RS | UART_FCR_TX_RS);
igorsk 0:1063a091a062 439 // Disable FIFO
igorsk 0:1063a091a062 440 ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = 0;
igorsk 0:1063a091a062 441
igorsk 0:1063a091a062 442 // Dummy reading
igorsk 0:1063a091a062 443 while (((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_RDR)
igorsk 0:1063a091a062 444 {
igorsk 0:1063a091a062 445 tmp = ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR;
igorsk 0:1063a091a062 446 }
igorsk 0:1063a091a062 447
igorsk 0:1063a091a062 448 ((LPC_UART1_TypeDef *)UARTx)->TER = UART_TER_TXEN;
igorsk 0:1063a091a062 449 // Wait for current transmit complete
igorsk 0:1063a091a062 450 while (!(((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_THRE));
igorsk 0:1063a091a062 451 // Disable Tx
igorsk 0:1063a091a062 452 ((LPC_UART1_TypeDef *)UARTx)->TER = 0;
igorsk 0:1063a091a062 453
igorsk 0:1063a091a062 454 // Disable interrupt
igorsk 0:1063a091a062 455 ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER = 0;
igorsk 0:1063a091a062 456 // Set LCR to default state
igorsk 0:1063a091a062 457 ((LPC_UART1_TypeDef *)UARTx)->LCR = 0;
igorsk 0:1063a091a062 458 // Set ACR to default state
igorsk 0:1063a091a062 459 ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;
igorsk 0:1063a091a062 460 // Set Modem Control to default state
igorsk 0:1063a091a062 461 ((LPC_UART1_TypeDef *)UARTx)->MCR = 0;
igorsk 0:1063a091a062 462 // Set RS485 control to default state
igorsk 0:1063a091a062 463 ((LPC_UART1_TypeDef *)UARTx)->RS485CTRL = 0;
igorsk 0:1063a091a062 464 // Set RS485 delay timer to default state
igorsk 0:1063a091a062 465 ((LPC_UART1_TypeDef *)UARTx)->RS485DLY = 0;
igorsk 0:1063a091a062 466 // Set RS485 addr match to default state
igorsk 0:1063a091a062 467 ((LPC_UART1_TypeDef *)UARTx)->ADRMATCH = 0;
igorsk 0:1063a091a062 468 //Dummy Reading to Clear Status
igorsk 0:1063a091a062 469 tmp = ((LPC_UART1_TypeDef *)UARTx)->MSR;
igorsk 0:1063a091a062 470 tmp = ((LPC_UART1_TypeDef *)UARTx)->LSR;
igorsk 0:1063a091a062 471 }
igorsk 0:1063a091a062 472 else
igorsk 0:1063a091a062 473 {
igorsk 0:1063a091a062 474 /* FIFOs are empty */
igorsk 0:1063a091a062 475 UARTx->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS);
igorsk 0:1063a091a062 476 // Disable FIFO
igorsk 0:1063a091a062 477 UARTx->/*IIFCR.*/FCR = 0;
igorsk 0:1063a091a062 478
igorsk 0:1063a091a062 479 // Dummy reading
igorsk 0:1063a091a062 480 while (UARTx->LSR & UART_LSR_RDR)
igorsk 0:1063a091a062 481 {
igorsk 0:1063a091a062 482 tmp = UARTx->/*RBTHDLR.*/RBR;
igorsk 0:1063a091a062 483 }
igorsk 0:1063a091a062 484
igorsk 0:1063a091a062 485 UARTx->TER = UART_TER_TXEN;
igorsk 0:1063a091a062 486 // Wait for current transmit complete
igorsk 0:1063a091a062 487 while (!(UARTx->LSR & UART_LSR_THRE));
igorsk 0:1063a091a062 488 // Disable Tx
igorsk 0:1063a091a062 489 UARTx->TER = 0;
igorsk 0:1063a091a062 490
igorsk 0:1063a091a062 491 // Disable interrupt
igorsk 0:1063a091a062 492 UARTx->/*DLIER.*/IER = 0;
igorsk 0:1063a091a062 493 // Set LCR to default state
igorsk 0:1063a091a062 494 UARTx->LCR = 0;
igorsk 0:1063a091a062 495 // Set ACR to default state
igorsk 0:1063a091a062 496 UARTx->ACR = 0;
igorsk 0:1063a091a062 497 // Dummy reading
igorsk 0:1063a091a062 498 tmp = UARTx->LSR;
igorsk 0:1063a091a062 499 }
igorsk 0:1063a091a062 500
igorsk 0:1063a091a062 501 if (UARTx == LPC_UART3)
igorsk 0:1063a091a062 502 {
igorsk 0:1063a091a062 503 // Set IrDA to default state
igorsk 0:1063a091a062 504 UARTx->ICR = 0;
igorsk 0:1063a091a062 505 }
igorsk 0:1063a091a062 506
igorsk 0:1063a091a062 507 // Set Line Control register ----------------------------
igorsk 0:1063a091a062 508
igorsk 0:1063a091a062 509 uart_set_divisors(UARTx, (UART_ConfigStruct->Baud_rate));
igorsk 0:1063a091a062 510
igorsk 0:1063a091a062 511 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 512 {
igorsk 0:1063a091a062 513 tmp = (((LPC_UART1_TypeDef *)UARTx)->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) \
igorsk 0:1063a091a062 514 & UART_LCR_BITMASK;
igorsk 0:1063a091a062 515 }
igorsk 0:1063a091a062 516 else
igorsk 0:1063a091a062 517 {
igorsk 0:1063a091a062 518 tmp = (UARTx->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) & UART_LCR_BITMASK;
igorsk 0:1063a091a062 519 }
igorsk 0:1063a091a062 520
igorsk 0:1063a091a062 521 switch (UART_ConfigStruct->Databits){
igorsk 0:1063a091a062 522 case UART_DATABIT_5:
igorsk 0:1063a091a062 523 tmp |= UART_LCR_WLEN5;
igorsk 0:1063a091a062 524 break;
igorsk 0:1063a091a062 525 case UART_DATABIT_6:
igorsk 0:1063a091a062 526 tmp |= UART_LCR_WLEN6;
igorsk 0:1063a091a062 527 break;
igorsk 0:1063a091a062 528 case UART_DATABIT_7:
igorsk 0:1063a091a062 529 tmp |= UART_LCR_WLEN7;
igorsk 0:1063a091a062 530 break;
igorsk 0:1063a091a062 531 case UART_DATABIT_8:
igorsk 0:1063a091a062 532 default:
igorsk 0:1063a091a062 533 tmp |= UART_LCR_WLEN8;
igorsk 0:1063a091a062 534 break;
igorsk 0:1063a091a062 535 }
igorsk 0:1063a091a062 536
igorsk 0:1063a091a062 537 if (UART_ConfigStruct->Parity == UART_PARITY_NONE)
igorsk 0:1063a091a062 538 {
igorsk 0:1063a091a062 539 // Do nothing...
igorsk 0:1063a091a062 540 }
igorsk 0:1063a091a062 541 else
igorsk 0:1063a091a062 542 {
igorsk 0:1063a091a062 543 tmp |= UART_LCR_PARITY_EN;
igorsk 0:1063a091a062 544 switch (UART_ConfigStruct->Parity)
igorsk 0:1063a091a062 545 {
igorsk 0:1063a091a062 546 case UART_PARITY_ODD:
igorsk 0:1063a091a062 547 tmp |= UART_LCR_PARITY_ODD;
igorsk 0:1063a091a062 548 break;
igorsk 0:1063a091a062 549
igorsk 0:1063a091a062 550 case UART_PARITY_EVEN:
igorsk 0:1063a091a062 551 tmp |= UART_LCR_PARITY_EVEN;
igorsk 0:1063a091a062 552 break;
igorsk 0:1063a091a062 553
igorsk 0:1063a091a062 554 case UART_PARITY_SP_1:
igorsk 0:1063a091a062 555 tmp |= UART_LCR_PARITY_F_1;
igorsk 0:1063a091a062 556 break;
igorsk 0:1063a091a062 557
igorsk 0:1063a091a062 558 case UART_PARITY_SP_0:
igorsk 0:1063a091a062 559 tmp |= UART_LCR_PARITY_F_0;
igorsk 0:1063a091a062 560 break;
igorsk 0:1063a091a062 561 default:
igorsk 0:1063a091a062 562 break;
igorsk 0:1063a091a062 563 }
igorsk 0:1063a091a062 564 }
igorsk 0:1063a091a062 565
igorsk 0:1063a091a062 566 switch (UART_ConfigStruct->Stopbits){
igorsk 0:1063a091a062 567 case UART_STOPBIT_2:
igorsk 0:1063a091a062 568 tmp |= UART_LCR_STOPBIT_SEL;
igorsk 0:1063a091a062 569 break;
igorsk 0:1063a091a062 570 case UART_STOPBIT_1:
igorsk 0:1063a091a062 571 default:
igorsk 0:1063a091a062 572 // Do no thing
igorsk 0:1063a091a062 573 break;
igorsk 0:1063a091a062 574 }
igorsk 0:1063a091a062 575
igorsk 0:1063a091a062 576
igorsk 0:1063a091a062 577 // Write back to LCR, configure FIFO and Disable Tx
igorsk 0:1063a091a062 578 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 579 {
igorsk 0:1063a091a062 580 ((LPC_UART1_TypeDef *)UARTx)->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);
igorsk 0:1063a091a062 581 }
igorsk 0:1063a091a062 582 else
igorsk 0:1063a091a062 583 {
igorsk 0:1063a091a062 584 UARTx->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);
igorsk 0:1063a091a062 585 }
igorsk 0:1063a091a062 586 }
igorsk 0:1063a091a062 587
igorsk 0:1063a091a062 588
igorsk 0:1063a091a062 589 /*****************************************************************************//**
igorsk 0:1063a091a062 590 * @brief Fills each UART_InitStruct member with its default value:
igorsk 0:1063a091a062 591 * 9600 bps
igorsk 0:1063a091a062 592 * 8-bit data
igorsk 0:1063a091a062 593 * 1 Stopbit
igorsk 0:1063a091a062 594 * None Parity
igorsk 0:1063a091a062 595 * @param[in] UART_InitStruct Pointer to a UART_CFG_Type structure
igorsk 0:1063a091a062 596 * which will be initialized.
igorsk 0:1063a091a062 597 * @return None
igorsk 0:1063a091a062 598 *******************************************************************************/
igorsk 0:1063a091a062 599 void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct)
igorsk 0:1063a091a062 600 {
igorsk 0:1063a091a062 601 UART_InitStruct->Baud_rate = 9600;
igorsk 0:1063a091a062 602 UART_InitStruct->Databits = UART_DATABIT_8;
igorsk 0:1063a091a062 603 UART_InitStruct->Parity = UART_PARITY_NONE;
igorsk 0:1063a091a062 604 UART_InitStruct->Stopbits = UART_STOPBIT_1;
igorsk 0:1063a091a062 605 }
igorsk 0:1063a091a062 606
igorsk 0:1063a091a062 607
igorsk 0:1063a091a062 608 /*********************************************************************//**
igorsk 0:1063a091a062 609 * @brief Transmit a single data through UART peripheral
igorsk 0:1063a091a062 610 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 611 * UART2 or UART3.
igorsk 0:1063a091a062 612 * @param[in] Data Data to transmit (must be 8-bit long)
igorsk 0:1063a091a062 613 * @return none
igorsk 0:1063a091a062 614 **********************************************************************/
igorsk 0:1063a091a062 615 void UART_SendData(LPC_UART_TypeDef* UARTx, uint8_t Data)
igorsk 0:1063a091a062 616 {
igorsk 0:1063a091a062 617 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 618
igorsk 0:1063a091a062 619 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 620 {
igorsk 0:1063a091a062 621 ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;
igorsk 0:1063a091a062 622 }
igorsk 0:1063a091a062 623 else
igorsk 0:1063a091a062 624 {
igorsk 0:1063a091a062 625 UARTx->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;
igorsk 0:1063a091a062 626 }
igorsk 0:1063a091a062 627
igorsk 0:1063a091a062 628 }
igorsk 0:1063a091a062 629
igorsk 0:1063a091a062 630
igorsk 0:1063a091a062 631 /*********************************************************************//**
igorsk 0:1063a091a062 632 * @brief Receive a single data from UART peripheral
igorsk 0:1063a091a062 633 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 634 * UART2 or UART3.
igorsk 0:1063a091a062 635 * @return Data received
igorsk 0:1063a091a062 636 **********************************************************************/
igorsk 0:1063a091a062 637 uint8_t UART_ReceiveData(LPC_UART_TypeDef* UARTx)
igorsk 0:1063a091a062 638 {
igorsk 0:1063a091a062 639 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 640
igorsk 0:1063a091a062 641 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 642 {
igorsk 0:1063a091a062 643 return (((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);
igorsk 0:1063a091a062 644 }
igorsk 0:1063a091a062 645 else
igorsk 0:1063a091a062 646 {
igorsk 0:1063a091a062 647 return (UARTx->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);
igorsk 0:1063a091a062 648 }
igorsk 0:1063a091a062 649 }
igorsk 0:1063a091a062 650
igorsk 0:1063a091a062 651
igorsk 0:1063a091a062 652 /*********************************************************************//**
igorsk 0:1063a091a062 653 * @brief Force BREAK character on UART line, output pin UARTx TXD is
igorsk 0:1063a091a062 654 forced to logic 0.
igorsk 0:1063a091a062 655 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 656 * UART2 or UART3.
igorsk 0:1063a091a062 657 * @return none
igorsk 0:1063a091a062 658 **********************************************************************/
igorsk 0:1063a091a062 659 void UART_ForceBreak(LPC_UART_TypeDef* UARTx)
igorsk 0:1063a091a062 660 {
igorsk 0:1063a091a062 661 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 662
igorsk 0:1063a091a062 663 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 664 {
igorsk 0:1063a091a062 665 ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_BREAK_EN;
igorsk 0:1063a091a062 666 }
igorsk 0:1063a091a062 667 else
igorsk 0:1063a091a062 668 {
igorsk 0:1063a091a062 669 UARTx->LCR |= UART_LCR_BREAK_EN;
igorsk 0:1063a091a062 670 }
igorsk 0:1063a091a062 671 }
igorsk 0:1063a091a062 672
igorsk 0:1063a091a062 673
igorsk 0:1063a091a062 674 #ifdef _UART3
igorsk 0:1063a091a062 675
igorsk 0:1063a091a062 676 /*********************************************************************//**
igorsk 0:1063a091a062 677 * @brief Enable or disable inverting serial input function of IrDA
igorsk 0:1063a091a062 678 * on UART peripheral.
igorsk 0:1063a091a062 679 * @param[in] UARTx UART peripheral selected, should be UART3 (only)
igorsk 0:1063a091a062 680 * @param[in] NewState New state of inverting serial input, should be:
igorsk 0:1063a091a062 681 * - ENABLE: Enable this function.
igorsk 0:1063a091a062 682 * - DISABLE: Disable this function.
igorsk 0:1063a091a062 683 * @return none
igorsk 0:1063a091a062 684 **********************************************************************/
igorsk 0:1063a091a062 685 void UART_IrDAInvtInputCmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState)
igorsk 0:1063a091a062 686 {
igorsk 0:1063a091a062 687 CHECK_PARAM(PARAM_UART_IrDA(UARTx));
igorsk 0:1063a091a062 688 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 689
igorsk 0:1063a091a062 690 if (NewState == ENABLE)
igorsk 0:1063a091a062 691 {
igorsk 0:1063a091a062 692 UARTx->ICR |= UART_ICR_IRDAINV;
igorsk 0:1063a091a062 693 }
igorsk 0:1063a091a062 694 else if (NewState == DISABLE)
igorsk 0:1063a091a062 695 {
igorsk 0:1063a091a062 696 UARTx->ICR &= (~UART_ICR_IRDAINV) & UART_ICR_BITMASK;
igorsk 0:1063a091a062 697 }
igorsk 0:1063a091a062 698 }
igorsk 0:1063a091a062 699
igorsk 0:1063a091a062 700
igorsk 0:1063a091a062 701 /*********************************************************************//**
igorsk 0:1063a091a062 702 * @brief Enable or disable IrDA function on UART peripheral.
igorsk 0:1063a091a062 703 * @param[in] UARTx UART peripheral selected, should be UART3 (only)
igorsk 0:1063a091a062 704 * @param[in] NewState New state of IrDA function, should be:
igorsk 0:1063a091a062 705 * - ENABLE: Enable this function.
igorsk 0:1063a091a062 706 * - DISABLE: Disable this function.
igorsk 0:1063a091a062 707 * @return none
igorsk 0:1063a091a062 708 **********************************************************************/
igorsk 0:1063a091a062 709 void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState)
igorsk 0:1063a091a062 710 {
igorsk 0:1063a091a062 711 CHECK_PARAM(PARAM_UART_IrDA(UARTx));
igorsk 0:1063a091a062 712 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 713
igorsk 0:1063a091a062 714 if (NewState == ENABLE)
igorsk 0:1063a091a062 715 {
igorsk 0:1063a091a062 716 UARTx->ICR |= UART_ICR_IRDAEN;
igorsk 0:1063a091a062 717 }
igorsk 0:1063a091a062 718 else
igorsk 0:1063a091a062 719 {
igorsk 0:1063a091a062 720 UARTx->ICR &= (~UART_ICR_IRDAEN) & UART_ICR_BITMASK;
igorsk 0:1063a091a062 721 }
igorsk 0:1063a091a062 722 }
igorsk 0:1063a091a062 723
igorsk 0:1063a091a062 724
igorsk 0:1063a091a062 725 /*********************************************************************//**
igorsk 0:1063a091a062 726 * @brief Configure Pulse divider for IrDA function on UART peripheral.
igorsk 0:1063a091a062 727 * @param[in] UARTx UART peripheral selected, should be UART3 (only)
igorsk 0:1063a091a062 728 * @param[in] PulseDiv Pulse Divider value from Peripheral clock,
igorsk 0:1063a091a062 729 * should be one of the following:
igorsk 0:1063a091a062 730 - UART_IrDA_PULSEDIV2 : Pulse width = 2 * Tpclk
igorsk 0:1063a091a062 731 - UART_IrDA_PULSEDIV4 : Pulse width = 4 * Tpclk
igorsk 0:1063a091a062 732 - UART_IrDA_PULSEDIV8 : Pulse width = 8 * Tpclk
igorsk 0:1063a091a062 733 - UART_IrDA_PULSEDIV16 : Pulse width = 16 * Tpclk
igorsk 0:1063a091a062 734 - UART_IrDA_PULSEDIV32 : Pulse width = 32 * Tpclk
igorsk 0:1063a091a062 735 - UART_IrDA_PULSEDIV64 : Pulse width = 64 * Tpclk
igorsk 0:1063a091a062 736 - UART_IrDA_PULSEDIV128 : Pulse width = 128 * Tpclk
igorsk 0:1063a091a062 737 - UART_IrDA_PULSEDIV256 : Pulse width = 256 * Tpclk
igorsk 0:1063a091a062 738
igorsk 0:1063a091a062 739 * @return none
igorsk 0:1063a091a062 740 **********************************************************************/
igorsk 0:1063a091a062 741 void UART_IrDAPulseDivConfig(LPC_UART_TypeDef *UARTx, UART_IrDA_PULSE_Type PulseDiv)
igorsk 0:1063a091a062 742 {
igorsk 0:1063a091a062 743 uint32_t tmp, tmp1;
igorsk 0:1063a091a062 744 CHECK_PARAM(PARAM_UART_IrDA(UARTx));
igorsk 0:1063a091a062 745 CHECK_PARAM(PARAM_UART_IrDA_PULSEDIV(PulseDiv));
igorsk 0:1063a091a062 746
igorsk 0:1063a091a062 747 tmp1 = UART_ICR_PULSEDIV(PulseDiv);
igorsk 0:1063a091a062 748 tmp = UARTx->ICR & (~UART_ICR_PULSEDIV(7));
igorsk 0:1063a091a062 749 tmp |= tmp1 | UART_ICR_FIXPULSE_EN;
igorsk 0:1063a091a062 750 UARTx->ICR = tmp & UART_ICR_BITMASK;
igorsk 0:1063a091a062 751 }
igorsk 0:1063a091a062 752
igorsk 0:1063a091a062 753 #endif
igorsk 0:1063a091a062 754
igorsk 0:1063a091a062 755
igorsk 0:1063a091a062 756 /********************************************************************//**
igorsk 0:1063a091a062 757 * @brief Enable or disable specified UART interrupt.
igorsk 0:1063a091a062 758 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 759 * UART2 or UART3.
igorsk 0:1063a091a062 760 * @param[in] UARTIntCfg Specifies the interrupt flag,
igorsk 0:1063a091a062 761 * should be one of the following:
igorsk 0:1063a091a062 762 - UART_INTCFG_RBR : RBR Interrupt enable
igorsk 0:1063a091a062 763 - UART_INTCFG_THRE : THR Interrupt enable
igorsk 0:1063a091a062 764 - UART_INTCFG_RLS : RX line status interrupt enable
igorsk 0:1063a091a062 765 - UART1_INTCFG_MS : Modem status interrupt enable (UART1 only)
igorsk 0:1063a091a062 766 - UART1_INTCFG_CTS : CTS1 signal transition interrupt enable (UART1 only)
igorsk 0:1063a091a062 767 - UART_INTCFG_ABEO : Enables the end of auto-baud interrupt
igorsk 0:1063a091a062 768 - UART_INTCFG_ABTO : Enables the auto-baud time-out interrupt
igorsk 0:1063a091a062 769 * @param[in] NewState New state of specified UART interrupt type,
igorsk 0:1063a091a062 770 * should be:
igorsk 0:1063a091a062 771 * - ENALBE: Enable this UART interrupt type.
igorsk 0:1063a091a062 772 * - DISALBE: Disable this UART interrupt type.
igorsk 0:1063a091a062 773 * @return None
igorsk 0:1063a091a062 774 *********************************************************************/
igorsk 0:1063a091a062 775 void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, FunctionalState NewState)
igorsk 0:1063a091a062 776 {
igorsk 0:1063a091a062 777 uint32_t tmp=0;
igorsk 0:1063a091a062 778
igorsk 0:1063a091a062 779 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 780 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 781
igorsk 0:1063a091a062 782 switch(UARTIntCfg){
igorsk 0:1063a091a062 783 case UART_INTCFG_RBR:
igorsk 0:1063a091a062 784 tmp = UART_IER_RBRINT_EN;
igorsk 0:1063a091a062 785 break;
igorsk 0:1063a091a062 786 case UART_INTCFG_THRE:
igorsk 0:1063a091a062 787 tmp = UART_IER_THREINT_EN;
igorsk 0:1063a091a062 788 break;
igorsk 0:1063a091a062 789 case UART_INTCFG_RLS:
igorsk 0:1063a091a062 790 tmp = UART_IER_RLSINT_EN;
igorsk 0:1063a091a062 791 break;
igorsk 0:1063a091a062 792 case UART1_INTCFG_MS:
igorsk 0:1063a091a062 793 tmp = UART1_IER_MSINT_EN;
igorsk 0:1063a091a062 794 break;
igorsk 0:1063a091a062 795 case UART1_INTCFG_CTS:
igorsk 0:1063a091a062 796 tmp = UART1_IER_CTSINT_EN;
igorsk 0:1063a091a062 797 break;
igorsk 0:1063a091a062 798 case UART_INTCFG_ABEO:
igorsk 0:1063a091a062 799 tmp = UART_IER_ABEOINT_EN;
igorsk 0:1063a091a062 800 break;
igorsk 0:1063a091a062 801 case UART_INTCFG_ABTO:
igorsk 0:1063a091a062 802 tmp = UART_IER_ABTOINT_EN;
igorsk 0:1063a091a062 803 break;
igorsk 0:1063a091a062 804 }
igorsk 0:1063a091a062 805
igorsk 0:1063a091a062 806 if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
igorsk 0:1063a091a062 807 {
igorsk 0:1063a091a062 808 CHECK_PARAM((PARAM_UART_INTCFG(UARTIntCfg)) || (PARAM_UART1_INTCFG(UARTIntCfg)));
igorsk 0:1063a091a062 809 }
igorsk 0:1063a091a062 810 else
igorsk 0:1063a091a062 811 {
igorsk 0:1063a091a062 812 CHECK_PARAM(PARAM_UART_INTCFG(UARTIntCfg));
igorsk 0:1063a091a062 813 }
igorsk 0:1063a091a062 814
igorsk 0:1063a091a062 815 if (NewState == ENABLE)
igorsk 0:1063a091a062 816 {
igorsk 0:1063a091a062 817 if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
igorsk 0:1063a091a062 818 {
igorsk 0:1063a091a062 819 ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER |= tmp;
igorsk 0:1063a091a062 820 }
igorsk 0:1063a091a062 821 else
igorsk 0:1063a091a062 822 {
igorsk 0:1063a091a062 823 UARTx->/*DLIER.*/IER |= tmp;
igorsk 0:1063a091a062 824 }
igorsk 0:1063a091a062 825 }
igorsk 0:1063a091a062 826 else
igorsk 0:1063a091a062 827 {
igorsk 0:1063a091a062 828 if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
igorsk 0:1063a091a062 829 {
igorsk 0:1063a091a062 830 ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER &= (~tmp) & UART1_IER_BITMASK;
igorsk 0:1063a091a062 831 }
igorsk 0:1063a091a062 832 else
igorsk 0:1063a091a062 833 {
igorsk 0:1063a091a062 834 UARTx->/*DLIER.*/IER &= (~tmp) & UART_IER_BITMASK;
igorsk 0:1063a091a062 835 }
igorsk 0:1063a091a062 836 }
igorsk 0:1063a091a062 837 }
igorsk 0:1063a091a062 838
igorsk 0:1063a091a062 839
igorsk 0:1063a091a062 840 /********************************************************************//**
igorsk 0:1063a091a062 841 * @brief Get current value of Line Status register in UART peripheral.
igorsk 0:1063a091a062 842 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 843 * UART2 or UART3.
igorsk 0:1063a091a062 844 * @return Current value of Line Status register in UART peripheral.
igorsk 0:1063a091a062 845 * Note: The return value of this function must be ANDed with each member in
igorsk 0:1063a091a062 846 * UART_LS_Type enumeration to determine current flag status
igorsk 0:1063a091a062 847 * corresponding to each Line status type. Because some flags in
igorsk 0:1063a091a062 848 * Line Status register will be cleared after reading, the next reading
igorsk 0:1063a091a062 849 * Line Status register could not be correct. So this function used to
igorsk 0:1063a091a062 850 * read Line status register in one time only, then the return value
igorsk 0:1063a091a062 851 * used to check all flags.
igorsk 0:1063a091a062 852 *********************************************************************/
igorsk 0:1063a091a062 853 uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx)
igorsk 0:1063a091a062 854 {
igorsk 0:1063a091a062 855 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 856
igorsk 0:1063a091a062 857 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 858 {
igorsk 0:1063a091a062 859 return ((((LPC_UART1_TypeDef *)LPC_UART1)->LSR) & UART_LSR_BITMASK);
igorsk 0:1063a091a062 860 }
igorsk 0:1063a091a062 861 else
igorsk 0:1063a091a062 862 {
igorsk 0:1063a091a062 863 return ((UARTx->LSR) & UART_LSR_BITMASK);
igorsk 0:1063a091a062 864 }
igorsk 0:1063a091a062 865 }
igorsk 0:1063a091a062 866
igorsk 0:1063a091a062 867 /*********************************************************************//**
igorsk 0:1063a091a062 868 * @brief Check whether if UART is busy or not
igorsk 0:1063a091a062 869 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 870 * UART2 or UART3.
igorsk 0:1063a091a062 871 * @return RESET if UART is not busy, otherwise return SET.
igorsk 0:1063a091a062 872 **********************************************************************/
igorsk 0:1063a091a062 873 FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx)
igorsk 0:1063a091a062 874 {
igorsk 0:1063a091a062 875 if (UARTx->LSR & UART_LSR_TEMT){
igorsk 0:1063a091a062 876 return RESET;
igorsk 0:1063a091a062 877 } else {
igorsk 0:1063a091a062 878 return SET;
igorsk 0:1063a091a062 879 }
igorsk 0:1063a091a062 880 }
igorsk 0:1063a091a062 881
igorsk 0:1063a091a062 882
igorsk 0:1063a091a062 883 /*********************************************************************//**
igorsk 0:1063a091a062 884 * @brief Configure FIFO function on selected UART peripheral
igorsk 0:1063a091a062 885 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 886 * UART2 or UART3.
igorsk 0:1063a091a062 887 * @param[in] FIFOCfg Pointer to a UART_FIFO_CFG_Type Structure that
igorsk 0:1063a091a062 888 * contains specified information about FIFO configuration
igorsk 0:1063a091a062 889 * @return none
igorsk 0:1063a091a062 890 **********************************************************************/
igorsk 0:1063a091a062 891 void UART_FIFOConfig(LPC_UART_TypeDef *UARTx, UART_FIFO_CFG_Type *FIFOCfg)
igorsk 0:1063a091a062 892 {
igorsk 0:1063a091a062 893 uint8_t tmp = 0;
igorsk 0:1063a091a062 894
igorsk 0:1063a091a062 895 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 896 CHECK_PARAM(PARAM_UART_FIFO_LEVEL(FIFOCfg->FIFO_Level));
igorsk 0:1063a091a062 897 CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_DMAMode));
igorsk 0:1063a091a062 898 CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetRxBuf));
igorsk 0:1063a091a062 899 CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetTxBuf));
igorsk 0:1063a091a062 900
igorsk 0:1063a091a062 901 tmp |= UART_FCR_FIFO_EN;
igorsk 0:1063a091a062 902 switch (FIFOCfg->FIFO_Level){
igorsk 0:1063a091a062 903 case UART_FIFO_TRGLEV0:
igorsk 0:1063a091a062 904 tmp |= UART_FCR_TRG_LEV0;
igorsk 0:1063a091a062 905 break;
igorsk 0:1063a091a062 906 case UART_FIFO_TRGLEV1:
igorsk 0:1063a091a062 907 tmp |= UART_FCR_TRG_LEV1;
igorsk 0:1063a091a062 908 break;
igorsk 0:1063a091a062 909 case UART_FIFO_TRGLEV2:
igorsk 0:1063a091a062 910 tmp |= UART_FCR_TRG_LEV2;
igorsk 0:1063a091a062 911 break;
igorsk 0:1063a091a062 912 case UART_FIFO_TRGLEV3:
igorsk 0:1063a091a062 913 default:
igorsk 0:1063a091a062 914 tmp |= UART_FCR_TRG_LEV3;
igorsk 0:1063a091a062 915 break;
igorsk 0:1063a091a062 916 }
igorsk 0:1063a091a062 917
igorsk 0:1063a091a062 918 if (FIFOCfg->FIFO_ResetTxBuf == ENABLE)
igorsk 0:1063a091a062 919 {
igorsk 0:1063a091a062 920 tmp |= UART_FCR_TX_RS;
igorsk 0:1063a091a062 921 }
igorsk 0:1063a091a062 922 if (FIFOCfg->FIFO_ResetRxBuf == ENABLE)
igorsk 0:1063a091a062 923 {
igorsk 0:1063a091a062 924 tmp |= UART_FCR_RX_RS;
igorsk 0:1063a091a062 925 }
igorsk 0:1063a091a062 926 if (FIFOCfg->FIFO_DMAMode == ENABLE)
igorsk 0:1063a091a062 927 {
igorsk 0:1063a091a062 928 tmp |= UART_FCR_DMAMODE_SEL;
igorsk 0:1063a091a062 929 }
igorsk 0:1063a091a062 930
igorsk 0:1063a091a062 931
igorsk 0:1063a091a062 932 //write to FIFO control register
igorsk 0:1063a091a062 933 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 934 {
igorsk 0:1063a091a062 935 ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;
igorsk 0:1063a091a062 936 }
igorsk 0:1063a091a062 937 else
igorsk 0:1063a091a062 938 {
igorsk 0:1063a091a062 939 UARTx->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;
igorsk 0:1063a091a062 940 }
igorsk 0:1063a091a062 941
igorsk 0:1063a091a062 942 }
igorsk 0:1063a091a062 943
igorsk 0:1063a091a062 944
igorsk 0:1063a091a062 945 /*****************************************************************************//**
igorsk 0:1063a091a062 946 * @brief Fills each UART_FIFOInitStruct member with its default value:
igorsk 0:1063a091a062 947 * - FIFO_DMAMode = DISABLE
igorsk 0:1063a091a062 948 * - FIFO_Level = UART_FIFO_TRGLEV0
igorsk 0:1063a091a062 949 * - FIFO_ResetRxBuf = ENABLE
igorsk 0:1063a091a062 950 * - FIFO_ResetTxBuf = ENABLE
igorsk 0:1063a091a062 951 * - FIFO_State = ENABLE
igorsk 0:1063a091a062 952
igorsk 0:1063a091a062 953 * @param[in] UART_FIFOInitStruct Pointer to a UART_FIFO_CFG_Type structure
igorsk 0:1063a091a062 954 * which will be initialized.
igorsk 0:1063a091a062 955 * @return None
igorsk 0:1063a091a062 956 *******************************************************************************/
igorsk 0:1063a091a062 957 void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct)
igorsk 0:1063a091a062 958 {
igorsk 0:1063a091a062 959 UART_FIFOInitStruct->FIFO_DMAMode = DISABLE;
igorsk 0:1063a091a062 960 UART_FIFOInitStruct->FIFO_Level = UART_FIFO_TRGLEV0;
igorsk 0:1063a091a062 961 UART_FIFOInitStruct->FIFO_ResetRxBuf = ENABLE;
igorsk 0:1063a091a062 962 UART_FIFOInitStruct->FIFO_ResetTxBuf = ENABLE;
igorsk 0:1063a091a062 963 }
igorsk 0:1063a091a062 964
igorsk 0:1063a091a062 965
igorsk 0:1063a091a062 966 /*********************************************************************//**
igorsk 0:1063a091a062 967 * @brief Start/Stop Auto Baudrate activity
igorsk 0:1063a091a062 968 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 969 * UART2 or UART3.
igorsk 0:1063a091a062 970 * @param[in] ABConfigStruct A pointer to UART_AB_CFG_Type structure that
igorsk 0:1063a091a062 971 * contains specified information about UART
igorsk 0:1063a091a062 972 * auto baudrate configuration
igorsk 0:1063a091a062 973 * @param[in] NewState New State of Auto baudrate activity, should be:
igorsk 0:1063a091a062 974 * - ENABLE: Start this activity
igorsk 0:1063a091a062 975 * - DISABLE: Stop this activity
igorsk 0:1063a091a062 976 * Note: Auto-baudrate mode enable bit will be cleared once this mode
igorsk 0:1063a091a062 977 * completed.
igorsk 0:1063a091a062 978 * @return none
igorsk 0:1063a091a062 979 **********************************************************************/
igorsk 0:1063a091a062 980 void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \
igorsk 0:1063a091a062 981 FunctionalState NewState)
igorsk 0:1063a091a062 982 {
igorsk 0:1063a091a062 983 uint32_t tmp;
igorsk 0:1063a091a062 984
igorsk 0:1063a091a062 985 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 986 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 987
igorsk 0:1063a091a062 988 tmp = 0;
igorsk 0:1063a091a062 989 if (NewState == ENABLE) {
igorsk 0:1063a091a062 990 if (ABConfigStruct->ABMode == UART_AUTOBAUD_MODE1){
igorsk 0:1063a091a062 991 tmp |= UART_ACR_MODE;
igorsk 0:1063a091a062 992 }
igorsk 0:1063a091a062 993 if (ABConfigStruct->AutoRestart == ENABLE){
igorsk 0:1063a091a062 994 tmp |= UART_ACR_AUTO_RESTART;
igorsk 0:1063a091a062 995 }
igorsk 0:1063a091a062 996 }
igorsk 0:1063a091a062 997
igorsk 0:1063a091a062 998 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 999 {
igorsk 0:1063a091a062 1000 if (NewState == ENABLE)
igorsk 0:1063a091a062 1001 {
igorsk 0:1063a091a062 1002 // Clear DLL and DLM value
igorsk 0:1063a091a062 1003 ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 1004 ((LPC_UART1_TypeDef *)UARTx)->DLL = 0;
igorsk 0:1063a091a062 1005 ((LPC_UART1_TypeDef *)UARTx)->DLM = 0;
igorsk 0:1063a091a062 1006 ((LPC_UART1_TypeDef *)UARTx)->LCR &= ~UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 1007 // FDR value must be reset to default value
igorsk 0:1063a091a062 1008 ((LPC_UART1_TypeDef *)UARTx)->FDR = 0x10;
igorsk 0:1063a091a062 1009 ((LPC_UART1_TypeDef *)UARTx)->ACR = UART_ACR_START | tmp;
igorsk 0:1063a091a062 1010 }
igorsk 0:1063a091a062 1011 else
igorsk 0:1063a091a062 1012 {
igorsk 0:1063a091a062 1013 ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;
igorsk 0:1063a091a062 1014 }
igorsk 0:1063a091a062 1015 }
igorsk 0:1063a091a062 1016 else
igorsk 0:1063a091a062 1017 {
igorsk 0:1063a091a062 1018 if (NewState == ENABLE)
igorsk 0:1063a091a062 1019 {
igorsk 0:1063a091a062 1020 // Clear DLL and DLM value
igorsk 0:1063a091a062 1021 UARTx->LCR |= UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 1022 UARTx->DLL = 0;
igorsk 0:1063a091a062 1023 UARTx->DLM = 0;
igorsk 0:1063a091a062 1024 UARTx->LCR &= ~UART_LCR_DLAB_EN;
igorsk 0:1063a091a062 1025 // FDR value must be reset to default value
igorsk 0:1063a091a062 1026 UARTx->FDR = 0x10;
igorsk 0:1063a091a062 1027 UARTx->ACR = UART_ACR_START | tmp;
igorsk 0:1063a091a062 1028 }
igorsk 0:1063a091a062 1029 else
igorsk 0:1063a091a062 1030 {
igorsk 0:1063a091a062 1031 UARTx->ACR = 0;
igorsk 0:1063a091a062 1032 }
igorsk 0:1063a091a062 1033 }
igorsk 0:1063a091a062 1034 }
igorsk 0:1063a091a062 1035
igorsk 0:1063a091a062 1036
igorsk 0:1063a091a062 1037 /*********************************************************************//**
igorsk 0:1063a091a062 1038 * @brief Enable/Disable transmission on UART TxD pin
igorsk 0:1063a091a062 1039 * @param[in] UARTx UART peripheral selected, should be UART0, UART1,
igorsk 0:1063a091a062 1040 * UART2 or UART3.
igorsk 0:1063a091a062 1041 * @param[in] NewState New State of Tx transmission function, should be:
igorsk 0:1063a091a062 1042 * - ENABLE: Enable this function
igorsk 0:1063a091a062 1043 - DISABLE: Disable this function
igorsk 0:1063a091a062 1044 * @return none
igorsk 0:1063a091a062 1045 **********************************************************************/
igorsk 0:1063a091a062 1046 void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState)
igorsk 0:1063a091a062 1047 {
igorsk 0:1063a091a062 1048 CHECK_PARAM(PARAM_UARTx(UARTx));
igorsk 0:1063a091a062 1049 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 1050
igorsk 0:1063a091a062 1051 if (NewState == ENABLE)
igorsk 0:1063a091a062 1052 {
igorsk 0:1063a091a062 1053 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 1054 {
igorsk 0:1063a091a062 1055 ((LPC_UART1_TypeDef *)UARTx)->TER |= UART_TER_TXEN;
igorsk 0:1063a091a062 1056 }
igorsk 0:1063a091a062 1057 else
igorsk 0:1063a091a062 1058 {
igorsk 0:1063a091a062 1059 UARTx->TER |= UART_TER_TXEN;
igorsk 0:1063a091a062 1060 }
igorsk 0:1063a091a062 1061 }
igorsk 0:1063a091a062 1062 else
igorsk 0:1063a091a062 1063 {
igorsk 0:1063a091a062 1064 if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
igorsk 0:1063a091a062 1065 {
igorsk 0:1063a091a062 1066 ((LPC_UART1_TypeDef *)UARTx)->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;
igorsk 0:1063a091a062 1067 }
igorsk 0:1063a091a062 1068 else
igorsk 0:1063a091a062 1069 {
igorsk 0:1063a091a062 1070 UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;
igorsk 0:1063a091a062 1071 }
igorsk 0:1063a091a062 1072 }
igorsk 0:1063a091a062 1073 }
igorsk 0:1063a091a062 1074
igorsk 0:1063a091a062 1075 #ifdef _UART1
igorsk 0:1063a091a062 1076
igorsk 0:1063a091a062 1077 /*********************************************************************//**
igorsk 0:1063a091a062 1078 * @brief Force pin DTR/RTS corresponding to given state (Full modem mode)
igorsk 0:1063a091a062 1079 * @param[in] UARTx UART1 (only)
igorsk 0:1063a091a062 1080 * @param[in] Pin Pin that NewState will be applied to, should be:
igorsk 0:1063a091a062 1081 * - UART1_MODEM_PIN_DTR: DTR pin.
igorsk 0:1063a091a062 1082 * - UART1_MODEM_PIN_RTS: RTS pin.
igorsk 0:1063a091a062 1083 * @param[in] NewState New State of DTR/RTS pin, should be:
igorsk 0:1063a091a062 1084 * - INACTIVE: Force the pin to inactive signal.
igorsk 0:1063a091a062 1085 - ACTIVE: Force the pin to active signal.
igorsk 0:1063a091a062 1086 * @return none
igorsk 0:1063a091a062 1087 **********************************************************************/
igorsk 0:1063a091a062 1088 void UART_FullModemForcePinState(LPC_UART1_TypeDef *UARTx, UART_MODEM_PIN_Type Pin, \
igorsk 0:1063a091a062 1089 UART1_SignalState NewState)
igorsk 0:1063a091a062 1090 {
igorsk 0:1063a091a062 1091 uint8_t tmp = 0;
igorsk 0:1063a091a062 1092
igorsk 0:1063a091a062 1093 CHECK_PARAM(PARAM_UART1_MODEM(UARTx));
igorsk 0:1063a091a062 1094 CHECK_PARAM(PARAM_UART1_MODEM_PIN(Pin));
igorsk 0:1063a091a062 1095 CHECK_PARAM(PARAM_UART1_SIGNALSTATE(NewState));
igorsk 0:1063a091a062 1096
igorsk 0:1063a091a062 1097 switch (Pin){
igorsk 0:1063a091a062 1098 case UART1_MODEM_PIN_DTR:
igorsk 0:1063a091a062 1099 tmp = UART1_MCR_DTR_CTRL;
igorsk 0:1063a091a062 1100 break;
igorsk 0:1063a091a062 1101 case UART1_MODEM_PIN_RTS:
igorsk 0:1063a091a062 1102 tmp = UART1_MCR_RTS_CTRL;
igorsk 0:1063a091a062 1103 break;
igorsk 0:1063a091a062 1104 default:
igorsk 0:1063a091a062 1105 break;
igorsk 0:1063a091a062 1106 }
igorsk 0:1063a091a062 1107
igorsk 0:1063a091a062 1108 if (NewState == ACTIVE){
igorsk 0:1063a091a062 1109 UARTx->MCR |= tmp;
igorsk 0:1063a091a062 1110 } else {
igorsk 0:1063a091a062 1111 UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;
igorsk 0:1063a091a062 1112 }
igorsk 0:1063a091a062 1113 }
igorsk 0:1063a091a062 1114
igorsk 0:1063a091a062 1115
igorsk 0:1063a091a062 1116 /*********************************************************************//**
igorsk 0:1063a091a062 1117 * @brief Configure Full Modem mode for UART peripheral
igorsk 0:1063a091a062 1118 * @param[in] UARTx UART1 (only)
igorsk 0:1063a091a062 1119 * @param[in] Mode Full Modem mode, should be:
igorsk 0:1063a091a062 1120 * - UART1_MODEM_MODE_LOOPBACK: Loop back mode.
igorsk 0:1063a091a062 1121 * - UART1_MODEM_MODE_AUTO_RTS: Auto-RTS mode.
igorsk 0:1063a091a062 1122 * - UART1_MODEM_MODE_AUTO_CTS: Auto-CTS mode.
igorsk 0:1063a091a062 1123 * @param[in] NewState New State of this mode, should be:
igorsk 0:1063a091a062 1124 * - ENABLE: Enable this mode.
igorsk 0:1063a091a062 1125 - DISABLE: Disable this mode.
igorsk 0:1063a091a062 1126 * @return none
igorsk 0:1063a091a062 1127 **********************************************************************/
igorsk 0:1063a091a062 1128 void UART_FullModemConfigMode(LPC_UART1_TypeDef *UARTx, UART_MODEM_MODE_Type Mode, \
igorsk 0:1063a091a062 1129 FunctionalState NewState)
igorsk 0:1063a091a062 1130 {
igorsk 0:1063a091a062 1131 uint8_t tmp=0;
igorsk 0:1063a091a062 1132
igorsk 0:1063a091a062 1133 CHECK_PARAM(PARAM_UART1_MODEM(UARTx));
igorsk 0:1063a091a062 1134 CHECK_PARAM(PARAM_UART1_MODEM_MODE(Mode));
igorsk 0:1063a091a062 1135 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
igorsk 0:1063a091a062 1136
igorsk 0:1063a091a062 1137 switch(Mode){
igorsk 0:1063a091a062 1138 case UART1_MODEM_MODE_LOOPBACK:
igorsk 0:1063a091a062 1139 tmp = UART1_MCR_LOOPB_EN;
igorsk 0:1063a091a062 1140 break;
igorsk 0:1063a091a062 1141 case UART1_MODEM_MODE_AUTO_RTS:
igorsk 0:1063a091a062 1142 tmp = UART1_MCR_AUTO_RTS_EN;
igorsk 0:1063a091a062 1143 break;
igorsk 0:1063a091a062 1144 case UART1_MODEM_MODE_AUTO_CTS:
igorsk 0:1063a091a062 1145 tmp = UART1_MCR_AUTO_CTS_EN;
igorsk 0:1063a091a062 1146 break;
igorsk 0:1063a091a062 1147 default:
igorsk 0:1063a091a062 1148 break;
igorsk 0:1063a091a062 1149 }
igorsk 0:1063a091a062 1150
igorsk 0:1063a091a062 1151 if (NewState == ENABLE)
igorsk 0:1063a091a062 1152 {
igorsk 0:1063a091a062 1153 UARTx->MCR |= tmp;
igorsk 0:1063a091a062 1154 }
igorsk 0:1063a091a062 1155 else
igorsk 0:1063a091a062 1156 {
igorsk 0:1063a091a062 1157 UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;
igorsk 0:1063a091a062 1158 }
igorsk 0:1063a091a062 1159 }
igorsk 0:1063a091a062 1160
igorsk 0:1063a091a062 1161
igorsk 0:1063a091a062 1162 /*********************************************************************//**
igorsk 0:1063a091a062 1163 * @brief Get current status of modem status register
igorsk 0:1063a091a062 1164 * @param[in] UARTx UART1 (only)
igorsk 0:1063a091a062 1165 * @return Current value of modem status register
igorsk 0:1063a091a062 1166 * Note: The return value of this function must be ANDed with each member
igorsk 0:1063a091a062 1167 * UART_MODEM_STAT_type enumeration to determine current flag status
igorsk 0:1063a091a062 1168 * corresponding to each modem flag status. Because some flags in
igorsk 0:1063a091a062 1169 * modem status register will be cleared after reading, the next reading
igorsk 0:1063a091a062 1170 * modem register could not be correct. So this function used to
igorsk 0:1063a091a062 1171 * read modem status register in one time only, then the return value
igorsk 0:1063a091a062 1172 * used to check all flags.
igorsk 0:1063a091a062 1173 **********************************************************************/
igorsk 0:1063a091a062 1174 uint8_t UART_FullModemGetStatus(LPC_UART1_TypeDef *UARTx)
igorsk 0:1063a091a062 1175 {
igorsk 0:1063a091a062 1176 CHECK_PARAM(PARAM_UART1_MODEM(UARTx));
igorsk 0:1063a091a062 1177 return ((UARTx->MSR) & UART1_MSR_BITMASK);
igorsk 0:1063a091a062 1178 }
igorsk 0:1063a091a062 1179
igorsk 0:1063a091a062 1180
igorsk 0:1063a091a062 1181 /*********************************************************************//**
igorsk 0:1063a091a062 1182 * @brief Configure UART peripheral in RS485 mode according to the specified
igorsk 0:1063a091a062 1183 * parameters in the RS485ConfigStruct.
igorsk 0:1063a091a062 1184 * @param[in] UARTx UART1 (only)
igorsk 0:1063a091a062 1185 * @param[in] RS485ConfigStruct Pointer to a UART1_RS485_CTRLCFG_Type structure
igorsk 0:1063a091a062 1186 * that contains the configuration information for specified UART
igorsk 0:1063a091a062 1187 * in RS485 mode.
igorsk 0:1063a091a062 1188 * @return None
igorsk 0:1063a091a062 1189 **********************************************************************/
igorsk 0:1063a091a062 1190 void UART_RS485Config(LPC_UART1_TypeDef *UARTx, UART1_RS485_CTRLCFG_Type *RS485ConfigStruct)
igorsk 0:1063a091a062 1191 {
igorsk 0:1063a091a062 1192 uint32_t tmp;
igorsk 0:1063a091a062 1193
igorsk 0:1063a091a062 1194 CHECK_PARAM(PARAM_UART1_MODEM(UARTx));
igorsk 0:1063a091a062 1195 CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoAddrDetect_State));
igorsk 0:1063a091a062 1196 CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoDirCtrl_State));
igorsk 0:1063a091a062 1197 CHECK_PARAM(PARAM_UART1_RS485_CFG_DELAYVALUE(RS485ConfigStruct->DelayValue));
igorsk 0:1063a091a062 1198 CHECK_PARAM(PARAM_SETSTATE(RS485ConfigStruct->DirCtrlPol_Level));
igorsk 0:1063a091a062 1199 CHECK_PARAM(PARAM_UART_RS485_DIRCTRL_PIN(RS485ConfigStruct->DirCtrlPin));
igorsk 0:1063a091a062 1200 CHECK_PARAM(PARAM_UART1_RS485_CFG_MATCHADDRVALUE(RS485ConfigStruct->MatchAddrValue));
igorsk 0:1063a091a062 1201 CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->NormalMultiDropMode_State));
igorsk 0:1063a091a062 1202 CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->Rx_State));
igorsk 0:1063a091a062 1203
igorsk 0:1063a091a062 1204 tmp = 0;
igorsk 0:1063a091a062 1205 // If Auto Direction Control is enabled - This function is used in Master mode
igorsk 0:1063a091a062 1206 if (RS485ConfigStruct->AutoDirCtrl_State == ENABLE)
igorsk 0:1063a091a062 1207 {
igorsk 0:1063a091a062 1208 tmp |= UART1_RS485CTRL_DCTRL_EN;
igorsk 0:1063a091a062 1209
igorsk 0:1063a091a062 1210 // Set polar
igorsk 0:1063a091a062 1211 if (RS485ConfigStruct->DirCtrlPol_Level == SET)
igorsk 0:1063a091a062 1212 {
igorsk 0:1063a091a062 1213 tmp |= UART1_RS485CTRL_OINV_1;
igorsk 0:1063a091a062 1214 }
igorsk 0:1063a091a062 1215
igorsk 0:1063a091a062 1216 // Set pin according to
igorsk 0:1063a091a062 1217 if (RS485ConfigStruct->DirCtrlPin == UART1_RS485_DIRCTRL_DTR)
igorsk 0:1063a091a062 1218 {
igorsk 0:1063a091a062 1219 tmp |= UART1_RS485CTRL_SEL_DTR;
igorsk 0:1063a091a062 1220 }
igorsk 0:1063a091a062 1221
igorsk 0:1063a091a062 1222 // Fill delay time
igorsk 0:1063a091a062 1223 UARTx->RS485DLY = RS485ConfigStruct->DelayValue & UART1_RS485DLY_BITMASK;
igorsk 0:1063a091a062 1224 }
igorsk 0:1063a091a062 1225
igorsk 0:1063a091a062 1226 // MultiDrop mode is enable
igorsk 0:1063a091a062 1227 if (RS485ConfigStruct->NormalMultiDropMode_State == ENABLE)
igorsk 0:1063a091a062 1228 {
igorsk 0:1063a091a062 1229 tmp |= UART1_RS485CTRL_NMM_EN;
igorsk 0:1063a091a062 1230 }
igorsk 0:1063a091a062 1231
igorsk 0:1063a091a062 1232 // Auto Address Detect function
igorsk 0:1063a091a062 1233 if (RS485ConfigStruct->AutoAddrDetect_State == ENABLE)
igorsk 0:1063a091a062 1234 {
igorsk 0:1063a091a062 1235 tmp |= UART1_RS485CTRL_AADEN;
igorsk 0:1063a091a062 1236 // Fill Match Address
igorsk 0:1063a091a062 1237 UARTx->ADRMATCH = RS485ConfigStruct->MatchAddrValue & UART1_RS485ADRMATCH_BITMASK;
igorsk 0:1063a091a062 1238 }
igorsk 0:1063a091a062 1239
igorsk 0:1063a091a062 1240
igorsk 0:1063a091a062 1241 // Receiver is disable
igorsk 0:1063a091a062 1242 if (RS485ConfigStruct->Rx_State == DISABLE)
igorsk 0:1063a091a062 1243 {
igorsk 0:1063a091a062 1244 tmp |= UART1_RS485CTRL_RX_DIS;
igorsk 0:1063a091a062 1245 }
igorsk 0:1063a091a062 1246
igorsk 0:1063a091a062 1247 // write back to RS485 control register
igorsk 0:1063a091a062 1248 UARTx->RS485CTRL = tmp & UART1_RS485CTRL_BITMASK;
igorsk 0:1063a091a062 1249
igorsk 0:1063a091a062 1250 // Enable Parity function and leave parity in stick '0' parity as default
igorsk 0:1063a091a062 1251 UARTx->LCR |= (UART_LCR_PARITY_F_0 | UART_LCR_PARITY_EN);
igorsk 0:1063a091a062 1252 }
igorsk 0:1063a091a062 1253
igorsk 0:1063a091a062 1254
igorsk 0:1063a091a062 1255 /**
igorsk 0:1063a091a062 1256 * @brief Enable/Disable receiver in RS485 module in UART1
igorsk 0:1063a091a062 1257 * @param[in] UARTx UART1 only.
igorsk 0:1063a091a062 1258 * @param[in] NewState New State of command, should be:
igorsk 0:1063a091a062 1259 * - ENABLE: Enable this function.
igorsk 0:1063a091a062 1260 * - DISABLE: Disable this function.
igorsk 0:1063a091a062 1261 * @return None
igorsk 0:1063a091a062 1262 */
igorsk 0:1063a091a062 1263 void UART_RS485ReceiverCmd(LPC_UART1_TypeDef *UARTx, FunctionalState NewState)
igorsk 0:1063a091a062 1264 {
igorsk 0:1063a091a062 1265 if (NewState == ENABLE){
igorsk 0:1063a091a062 1266 UARTx->RS485CTRL &= ~UART1_RS485CTRL_RX_DIS;
igorsk 0:1063a091a062 1267 } else {
igorsk 0:1063a091a062 1268 UARTx->RS485CTRL |= UART1_RS485CTRL_RX_DIS;
igorsk 0:1063a091a062 1269 }
igorsk 0:1063a091a062 1270 }
igorsk 0:1063a091a062 1271
igorsk 0:1063a091a062 1272
igorsk 0:1063a091a062 1273 /**
igorsk 0:1063a091a062 1274 * @brief Send data on RS485 bus with specified parity stick value (9-bit mode).
igorsk 0:1063a091a062 1275 * @param[in] UARTx UART1 (only).
igorsk 0:1063a091a062 1276 * @param[in] pDatFrm Pointer to data frame.
igorsk 0:1063a091a062 1277 * @param[in] size Size of data.
igorsk 0:1063a091a062 1278 * @param[in] ParityStick Parity Stick value, should be 0 or 1.
igorsk 0:1063a091a062 1279 * @return None.
igorsk 0:1063a091a062 1280 */
igorsk 0:1063a091a062 1281 uint32_t UART_RS485Send(LPC_UART1_TypeDef *UARTx, uint8_t *pDatFrm, \
igorsk 0:1063a091a062 1282 uint32_t size, uint8_t ParityStick)
igorsk 0:1063a091a062 1283 {
igorsk 0:1063a091a062 1284 uint8_t tmp, save;
igorsk 0:1063a091a062 1285 uint32_t cnt;
igorsk 0:1063a091a062 1286
igorsk 0:1063a091a062 1287 if (ParityStick){
igorsk 0:1063a091a062 1288 save = tmp = UARTx->LCR & UART_LCR_BITMASK;
igorsk 0:1063a091a062 1289 tmp &= ~(UART_LCR_PARITY_EVEN);
igorsk 0:1063a091a062 1290 UARTx->LCR = tmp;
igorsk 0:1063a091a062 1291 cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);
igorsk 0:1063a091a062 1292 while (!(UARTx->LSR & UART_LSR_TEMT));
igorsk 0:1063a091a062 1293 UARTx->LCR = save;
igorsk 0:1063a091a062 1294 } else {
igorsk 0:1063a091a062 1295 cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);
igorsk 0:1063a091a062 1296 while (!(UARTx->LSR & UART_LSR_TEMT));
igorsk 0:1063a091a062 1297 }
igorsk 0:1063a091a062 1298 return cnt;
igorsk 0:1063a091a062 1299 }
igorsk 0:1063a091a062 1300
igorsk 0:1063a091a062 1301
igorsk 0:1063a091a062 1302 /**
igorsk 0:1063a091a062 1303 * @brief Send Slave address frames on RS485 bus.
igorsk 0:1063a091a062 1304 * @param[in] UARTx UART1 (only).
igorsk 0:1063a091a062 1305 * @param[in] SlvAddr Slave Address.
igorsk 0:1063a091a062 1306 * @return None.
igorsk 0:1063a091a062 1307 */
igorsk 0:1063a091a062 1308 void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr)
igorsk 0:1063a091a062 1309 {
igorsk 0:1063a091a062 1310 UART_RS485Send(UARTx, &SlvAddr, 1, 1);
igorsk 0:1063a091a062 1311 }
igorsk 0:1063a091a062 1312
igorsk 0:1063a091a062 1313
igorsk 0:1063a091a062 1314 /**
igorsk 0:1063a091a062 1315 * @brief Send Data frames on RS485 bus.
igorsk 0:1063a091a062 1316 * @param[in] UARTx UART1 (only).
igorsk 0:1063a091a062 1317 * @param[in] pData Pointer to data to be sent.
igorsk 0:1063a091a062 1318 * @param[in] size Size of data frame to be sent.
igorsk 0:1063a091a062 1319 * @return None.
igorsk 0:1063a091a062 1320 */
igorsk 0:1063a091a062 1321 uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size)
igorsk 0:1063a091a062 1322 {
igorsk 0:1063a091a062 1323 return (UART_RS485Send(UARTx, pData, size, 0));
igorsk 0:1063a091a062 1324 }
igorsk 0:1063a091a062 1325
igorsk 0:1063a091a062 1326 #endif /* _UART1 */
igorsk 0:1063a091a062 1327
igorsk 0:1063a091a062 1328
igorsk 0:1063a091a062 1329 /* Additional driver APIs ----------------------------------------------------------------------- */
igorsk 0:1063a091a062 1330
igorsk 0:1063a091a062 1331 /*********************************************************************//**
igorsk 0:1063a091a062 1332 * @brief Send a block of data via UART peripheral
igorsk 0:1063a091a062 1333 * @param[in] UARTx Selected UART peripheral used to send data,
igorsk 0:1063a091a062 1334 * should be UART0, UART1, UART2 or UART3.
igorsk 0:1063a091a062 1335 * @param[in] txbuf Pointer to Transmit buffer
igorsk 0:1063a091a062 1336 * @param[in] buflen Length of Transmit buffer
igorsk 0:1063a091a062 1337 * @param[in] flag Flag used in UART transfer, should be
igorsk 0:1063a091a062 1338 * NONE_BLOCKING or BLOCKING
igorsk 0:1063a091a062 1339 * @return Number of bytes sent.
igorsk 0:1063a091a062 1340 *
igorsk 0:1063a091a062 1341 * Note: when using UART in BLOCKING mode, a time-out condition is used
igorsk 0:1063a091a062 1342 * via defined symbol UART_BLOCKING_TIMEOUT.
igorsk 0:1063a091a062 1343 **********************************************************************/
igorsk 0:1063a091a062 1344 uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf,
igorsk 0:1063a091a062 1345 uint32_t buflen, TRANSFER_BLOCK_Type flag)
igorsk 0:1063a091a062 1346 {
igorsk 0:1063a091a062 1347 uint32_t bToSend, bSent, timeOut, fifo_cnt;
igorsk 0:1063a091a062 1348 uint8_t *pChar = txbuf;
igorsk 0:1063a091a062 1349
igorsk 0:1063a091a062 1350 bToSend = buflen;
igorsk 0:1063a091a062 1351
igorsk 0:1063a091a062 1352 // blocking mode
igorsk 0:1063a091a062 1353 if (flag == BLOCKING) {
igorsk 0:1063a091a062 1354 bSent = 0;
igorsk 0:1063a091a062 1355 while (bToSend){
igorsk 0:1063a091a062 1356 timeOut = UART_BLOCKING_TIMEOUT;
igorsk 0:1063a091a062 1357 // Wait for THR empty with timeout
igorsk 0:1063a091a062 1358 while (!(UARTx->LSR & UART_LSR_THRE)) {
igorsk 0:1063a091a062 1359 if (timeOut == 0) break;
igorsk 0:1063a091a062 1360 timeOut--;
igorsk 0:1063a091a062 1361 }
igorsk 0:1063a091a062 1362 // Time out!
igorsk 0:1063a091a062 1363 if(timeOut == 0) break;
igorsk 0:1063a091a062 1364 fifo_cnt = UART_TX_FIFO_SIZE;
igorsk 0:1063a091a062 1365 while (fifo_cnt && bToSend){
igorsk 0:1063a091a062 1366 UART_SendData(UARTx, (*pChar++));
igorsk 0:1063a091a062 1367 fifo_cnt--;
igorsk 0:1063a091a062 1368 bToSend--;
igorsk 0:1063a091a062 1369 bSent++;
igorsk 0:1063a091a062 1370 }
igorsk 0:1063a091a062 1371 }
igorsk 0:1063a091a062 1372 }
igorsk 0:1063a091a062 1373 // None blocking mode
igorsk 0:1063a091a062 1374 else {
igorsk 0:1063a091a062 1375 bSent = 0;
igorsk 0:1063a091a062 1376 while (bToSend) {
igorsk 0:1063a091a062 1377 if (!(UARTx->LSR & UART_LSR_THRE)){
igorsk 0:1063a091a062 1378 break;
igorsk 0:1063a091a062 1379 }
igorsk 0:1063a091a062 1380 fifo_cnt = UART_TX_FIFO_SIZE;
igorsk 0:1063a091a062 1381 while (fifo_cnt && bToSend) {
igorsk 0:1063a091a062 1382 UART_SendData(UARTx, (*pChar++));
igorsk 0:1063a091a062 1383 bToSend--;
igorsk 0:1063a091a062 1384 fifo_cnt--;
igorsk 0:1063a091a062 1385 bSent++;
igorsk 0:1063a091a062 1386 }
igorsk 0:1063a091a062 1387 }
igorsk 0:1063a091a062 1388 }
igorsk 0:1063a091a062 1389 return bSent;
igorsk 0:1063a091a062 1390 }
igorsk 0:1063a091a062 1391
igorsk 0:1063a091a062 1392 /*********************************************************************//**
igorsk 0:1063a091a062 1393 * @brief Receive a block of data via UART peripheral
igorsk 0:1063a091a062 1394 * @param[in] UARTx Selected UART peripheral used to send data,
igorsk 0:1063a091a062 1395 * should be UART0, UART1, UART2 or UART3.
igorsk 0:1063a091a062 1396 * @param[out] rxbuf Pointer to Received buffer
igorsk 0:1063a091a062 1397 * @param[in] buflen Length of Received buffer
igorsk 0:1063a091a062 1398 * @param[in] flag Flag mode, should be NONE_BLOCKING or BLOCKING
igorsk 0:1063a091a062 1399
igorsk 0:1063a091a062 1400 * @return Number of bytes received
igorsk 0:1063a091a062 1401 *
igorsk 0:1063a091a062 1402 * Note: when using UART in BLOCKING mode, a time-out condition is used
igorsk 0:1063a091a062 1403 * via defined symbol UART_BLOCKING_TIMEOUT.
igorsk 0:1063a091a062 1404 **********************************************************************/
igorsk 0:1063a091a062 1405 uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \
igorsk 0:1063a091a062 1406 uint32_t buflen, TRANSFER_BLOCK_Type flag)
igorsk 0:1063a091a062 1407 {
igorsk 0:1063a091a062 1408 uint32_t bToRecv, bRecv, timeOut;
igorsk 0:1063a091a062 1409 uint8_t *pChar = rxbuf;
igorsk 0:1063a091a062 1410
igorsk 0:1063a091a062 1411 bToRecv = buflen;
igorsk 0:1063a091a062 1412
igorsk 0:1063a091a062 1413 // Blocking mode
igorsk 0:1063a091a062 1414 if (flag == BLOCKING) {
igorsk 0:1063a091a062 1415 bRecv = 0;
igorsk 0:1063a091a062 1416 while (bToRecv){
igorsk 0:1063a091a062 1417 timeOut = UART_BLOCKING_TIMEOUT;
igorsk 0:1063a091a062 1418 while (!(UARTx->LSR & UART_LSR_RDR)){
igorsk 0:1063a091a062 1419 if (timeOut == 0) break;
igorsk 0:1063a091a062 1420 timeOut--;
igorsk 0:1063a091a062 1421 }
igorsk 0:1063a091a062 1422 // Time out!
igorsk 0:1063a091a062 1423 if(timeOut == 0) break;
igorsk 0:1063a091a062 1424 // Get data from the buffer
igorsk 0:1063a091a062 1425 (*pChar++) = UART_ReceiveData(UARTx);
igorsk 0:1063a091a062 1426 bToRecv--;
igorsk 0:1063a091a062 1427 bRecv++;
igorsk 0:1063a091a062 1428 }
igorsk 0:1063a091a062 1429 }
igorsk 0:1063a091a062 1430 // None blocking mode
igorsk 0:1063a091a062 1431 else {
igorsk 0:1063a091a062 1432 bRecv = 0;
igorsk 0:1063a091a062 1433 while (bToRecv) {
igorsk 0:1063a091a062 1434 if (!(UARTx->LSR & UART_LSR_RDR)) {
igorsk 0:1063a091a062 1435 break;
igorsk 0:1063a091a062 1436 } else {
igorsk 0:1063a091a062 1437 (*pChar++) = UART_ReceiveData(UARTx);
igorsk 0:1063a091a062 1438 bRecv++;
igorsk 0:1063a091a062 1439 bToRecv--;
igorsk 0:1063a091a062 1440 }
igorsk 0:1063a091a062 1441 }
igorsk 0:1063a091a062 1442 }
igorsk 0:1063a091a062 1443 return bRecv;
igorsk 0:1063a091a062 1444 }
igorsk 0:1063a091a062 1445
igorsk 0:1063a091a062 1446
igorsk 0:1063a091a062 1447 /*********************************************************************//**
igorsk 0:1063a091a062 1448 * @brief Setup call-back function for UART interrupt handler for each
igorsk 0:1063a091a062 1449 * UART peripheral
igorsk 0:1063a091a062 1450 * @param[in] UARTx Selected UART peripheral, should be UART0..3
igorsk 0:1063a091a062 1451 * @param[in] CbType Call-back type, should be:
igorsk 0:1063a091a062 1452 * 0 - Receive Call-back
igorsk 0:1063a091a062 1453 * 1 - Transmit Call-back
igorsk 0:1063a091a062 1454 * 2 - Auto Baudrate Callback
igorsk 0:1063a091a062 1455 * 3 - Error Call-back
igorsk 0:1063a091a062 1456 * 4 - Modem Status Call-back (UART1 only)
igorsk 0:1063a091a062 1457 * @param[in] pfnCbs Pointer to Call-back function
igorsk 0:1063a091a062 1458 * @return None
igorsk 0:1063a091a062 1459 **********************************************************************/
igorsk 0:1063a091a062 1460 void UART_SetupCbs(LPC_UART_TypeDef *UARTx, uint8_t CbType, void *pfnCbs)
igorsk 0:1063a091a062 1461 {
igorsk 0:1063a091a062 1462 uint8_t pUartNum;
igorsk 0:1063a091a062 1463
igorsk 0:1063a091a062 1464 pUartNum = getUartNum(UARTx);
igorsk 0:1063a091a062 1465 switch(CbType){
igorsk 0:1063a091a062 1466 case 0:
igorsk 0:1063a091a062 1467 uartCbsDat[pUartNum].pfnRxCbs = (fnTxCbs_Type *)pfnCbs;
igorsk 0:1063a091a062 1468 break;
igorsk 0:1063a091a062 1469 case 1:
igorsk 0:1063a091a062 1470 uartCbsDat[pUartNum].pfnTxCbs = (fnRxCbs_Type *)pfnCbs;
igorsk 0:1063a091a062 1471 break;
igorsk 0:1063a091a062 1472 case 2:
igorsk 0:1063a091a062 1473 uartCbsDat[pUartNum].pfnABCbs = (fnABCbs_Type *)pfnCbs;
igorsk 0:1063a091a062 1474 break;
igorsk 0:1063a091a062 1475 case 3:
igorsk 0:1063a091a062 1476 uartCbsDat[pUartNum].pfnErrCbs = (fnErrCbs_Type *)pfnCbs;
igorsk 0:1063a091a062 1477 break;
igorsk 0:1063a091a062 1478 case 4:
igorsk 0:1063a091a062 1479 pfnModemCbs = (fnModemCbs_Type *)pfnCbs;
igorsk 0:1063a091a062 1480 break;
igorsk 0:1063a091a062 1481 default:
igorsk 0:1063a091a062 1482 break;
igorsk 0:1063a091a062 1483 }
igorsk 0:1063a091a062 1484 }
igorsk 0:1063a091a062 1485
igorsk 0:1063a091a062 1486 /*********************************************************************//**
igorsk 0:1063a091a062 1487 * @brief Standard UART0 interrupt handler
igorsk 0:1063a091a062 1488 * @param[in] None
igorsk 0:1063a091a062 1489 * @return None
igorsk 0:1063a091a062 1490 **********************************************************************/
igorsk 0:1063a091a062 1491 void UART0_StdIntHandler(void)
igorsk 0:1063a091a062 1492 {
igorsk 0:1063a091a062 1493 UART_GenIntHandler((LPC_UART_TypeDef *)LPC_UART0);
igorsk 0:1063a091a062 1494 }
igorsk 0:1063a091a062 1495
igorsk 0:1063a091a062 1496 /*********************************************************************//**
igorsk 0:1063a091a062 1497 * @brief Standard UART1 interrupt handler
igorsk 0:1063a091a062 1498 * @param[in] None
igorsk 0:1063a091a062 1499 * @return None
igorsk 0:1063a091a062 1500 **********************************************************************/
igorsk 0:1063a091a062 1501 void UART1_StdIntHandler(void)
igorsk 0:1063a091a062 1502 {
igorsk 0:1063a091a062 1503 UART_GenIntHandler((LPC_UART_TypeDef *)LPC_UART1);
igorsk 0:1063a091a062 1504 }
igorsk 0:1063a091a062 1505
igorsk 0:1063a091a062 1506 /*********************************************************************//**
igorsk 0:1063a091a062 1507 * @brief Standard UART2 interrupt handler
igorsk 0:1063a091a062 1508 * @param[in] None
igorsk 0:1063a091a062 1509 * @return None
igorsk 0:1063a091a062 1510 **********************************************************************/
igorsk 0:1063a091a062 1511 void UART2_StdIntHandler(void)
igorsk 0:1063a091a062 1512 {
igorsk 0:1063a091a062 1513 UART_GenIntHandler(LPC_UART2);
igorsk 0:1063a091a062 1514 }
igorsk 0:1063a091a062 1515
igorsk 0:1063a091a062 1516 /*********************************************************************//**
igorsk 0:1063a091a062 1517 * @brief Standard UART3 interrupt handler
igorsk 0:1063a091a062 1518 * @param[in] None
igorsk 0:1063a091a062 1519 * @return
igorsk 0:1063a091a062 1520 **********************************************************************/
igorsk 0:1063a091a062 1521 void UART3_StdIntHandler(void)
igorsk 0:1063a091a062 1522 {
igorsk 0:1063a091a062 1523 UART_GenIntHandler(LPC_UART3);
igorsk 0:1063a091a062 1524 }
igorsk 0:1063a091a062 1525
igorsk 0:1063a091a062 1526 /**
igorsk 0:1063a091a062 1527 * @}
igorsk 0:1063a091a062 1528 */
igorsk 0:1063a091a062 1529
igorsk 0:1063a091a062 1530
igorsk 0:1063a091a062 1531 #endif /* _UART */
igorsk 0:1063a091a062 1532
igorsk 0:1063a091a062 1533 /**
igorsk 0:1063a091a062 1534 * @}
igorsk 0:1063a091a062 1535 */
igorsk 0:1063a091a062 1536
igorsk 0:1063a091a062 1537 /* --------------------------------- End Of File ------------------------------ */
igorsk 0:1063a091a062 1538