BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /**************************************************************************//**
gustavatmel 1:9c5af431a1f1 2 * @file uart.c
gustavatmel 1:9c5af431a1f1 3 * @version V3.00
gustavatmel 1:9c5af431a1f1 4 * @brief M480 series UART driver source file
gustavatmel 1:9c5af431a1f1 5 *
gustavatmel 1:9c5af431a1f1 6 * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
gustavatmel 1:9c5af431a1f1 7 *****************************************************************************/
gustavatmel 1:9c5af431a1f1 8
gustavatmel 1:9c5af431a1f1 9 #include <stdio.h>
gustavatmel 1:9c5af431a1f1 10 #include "M480.h"
gustavatmel 1:9c5af431a1f1 11
gustavatmel 1:9c5af431a1f1 12 /** @addtogroup M480_Device_Driver M480 Device Driver
gustavatmel 1:9c5af431a1f1 13 @{
gustavatmel 1:9c5af431a1f1 14 */
gustavatmel 1:9c5af431a1f1 15
gustavatmel 1:9c5af431a1f1 16 /** @addtogroup M480_UART_Driver UART Driver
gustavatmel 1:9c5af431a1f1 17 @{
gustavatmel 1:9c5af431a1f1 18 */
gustavatmel 1:9c5af431a1f1 19
gustavatmel 1:9c5af431a1f1 20 /** @addtogroup M480_UART_EXPORTED_FUNCTIONS UART Exported Functions
gustavatmel 1:9c5af431a1f1 21 @{
gustavatmel 1:9c5af431a1f1 22 */
gustavatmel 1:9c5af431a1f1 23
gustavatmel 1:9c5af431a1f1 24 /**
gustavatmel 1:9c5af431a1f1 25 * @brief Clear UART specified interrupt flag
gustavatmel 1:9c5af431a1f1 26 *
gustavatmel 1:9c5af431a1f1 27 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 28 * @param[in] u32InterruptFlag The specified interrupt of UART module.
gustavatmel 1:9c5af431a1f1 29 * - \ref UART_INTSTS_LININT_Msk : LIN bus interrupt
gustavatmel 1:9c5af431a1f1 30 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
gustavatmel 1:9c5af431a1f1 31 * - \ref UART_INTSTS_BUFERRINT_Msk : Buffer Error interrupt
gustavatmel 1:9c5af431a1f1 32 * - \ref UART_INTSTS_MODEMINT_Msk : Modem Status interrupt
gustavatmel 1:9c5af431a1f1 33 * - \ref UART_INTSTS_RLSINT_Msk : Receive Line Status interrupt
gustavatmel 1:9c5af431a1f1 34 *
gustavatmel 1:9c5af431a1f1 35 * @return None
gustavatmel 1:9c5af431a1f1 36 *
gustavatmel 1:9c5af431a1f1 37 * @details The function is used to clear UART specified interrupt flag.
gustavatmel 1:9c5af431a1f1 38 */
gustavatmel 1:9c5af431a1f1 39
gustavatmel 1:9c5af431a1f1 40 void UART_ClearIntFlag(UART_T* uart , uint32_t u32InterruptFlag)
gustavatmel 1:9c5af431a1f1 41 {
gustavatmel 1:9c5af431a1f1 42
gustavatmel 1:9c5af431a1f1 43 if(u32InterruptFlag & UART_INTSTS_RLSINT_Msk) { /* Clear Receive Line Status Interrupt */
gustavatmel 1:9c5af431a1f1 44 uart->FIFOSTS = UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_FEF_Msk;
gustavatmel 1:9c5af431a1f1 45 uart->FIFOSTS = UART_FIFOSTS_ADDRDETF_Msk;
gustavatmel 1:9c5af431a1f1 46 }
gustavatmel 1:9c5af431a1f1 47
gustavatmel 1:9c5af431a1f1 48 if(u32InterruptFlag & UART_INTSTS_MODEMINT_Msk) { /* Clear Modem Status Interrupt */
gustavatmel 1:9c5af431a1f1 49 uart->MODEMSTS |= UART_MODEMSTS_CTSDETF_Msk;
gustavatmel 1:9c5af431a1f1 50 } else {
gustavatmel 1:9c5af431a1f1 51 }
gustavatmel 1:9c5af431a1f1 52
gustavatmel 1:9c5af431a1f1 53 if(u32InterruptFlag & UART_INTSTS_BUFERRINT_Msk) { /* Clear Buffer Error Interrupt */
gustavatmel 1:9c5af431a1f1 54 uart->FIFOSTS = UART_FIFOSTS_RXOVIF_Msk | UART_FIFOSTS_TXOVIF_Msk;
gustavatmel 1:9c5af431a1f1 55 }
gustavatmel 1:9c5af431a1f1 56
gustavatmel 1:9c5af431a1f1 57 if(u32InterruptFlag & UART_INTSTS_WKINT_Msk) { /* Clear Wake-up Interrupt */
gustavatmel 1:9c5af431a1f1 58 uart->WKSTS = UART_WKSTS_CTSWKF_Msk | UART_WKSTS_DATWKF_Msk |
gustavatmel 1:9c5af431a1f1 59 UART_WKSTS_RFRTWKF_Msk |UART_WKSTS_RS485WKF_Msk |
gustavatmel 1:9c5af431a1f1 60 UART_WKSTS_TOUTWKF_Msk;
gustavatmel 1:9c5af431a1f1 61 }
gustavatmel 1:9c5af431a1f1 62
gustavatmel 1:9c5af431a1f1 63 if(u32InterruptFlag & UART_INTSTS_LININT_Msk) { /* Clear LIN Bus Interrupt */
gustavatmel 1:9c5af431a1f1 64 uart->INTSTS = UART_INTSTS_LINIF_Msk;
gustavatmel 1:9c5af431a1f1 65 uart->LINSTS = UART_LINSTS_BITEF_Msk | UART_LINSTS_BRKDETF_Msk |
gustavatmel 1:9c5af431a1f1 66 UART_LINSTS_SLVSYNCF_Msk | UART_LINSTS_SLVIDPEF_Msk |
gustavatmel 1:9c5af431a1f1 67 UART_LINSTS_SLVHEF_Msk | UART_LINSTS_SLVHDETF_Msk ;
gustavatmel 1:9c5af431a1f1 68 }
gustavatmel 1:9c5af431a1f1 69 }
gustavatmel 1:9c5af431a1f1 70
gustavatmel 1:9c5af431a1f1 71
gustavatmel 1:9c5af431a1f1 72 /**
gustavatmel 1:9c5af431a1f1 73 * @brief Disable UART interrupt
gustavatmel 1:9c5af431a1f1 74 *
gustavatmel 1:9c5af431a1f1 75 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 76 *
gustavatmel 1:9c5af431a1f1 77 * @return None
gustavatmel 1:9c5af431a1f1 78 *
gustavatmel 1:9c5af431a1f1 79 * @details The function is used to disable UART interrupt.
gustavatmel 1:9c5af431a1f1 80 */
gustavatmel 1:9c5af431a1f1 81 void UART_Close(UART_T* uart)
gustavatmel 1:9c5af431a1f1 82 {
gustavatmel 1:9c5af431a1f1 83 uart->INTEN = 0ul;
gustavatmel 1:9c5af431a1f1 84 }
gustavatmel 1:9c5af431a1f1 85
gustavatmel 1:9c5af431a1f1 86
gustavatmel 1:9c5af431a1f1 87 /**
gustavatmel 1:9c5af431a1f1 88 * @brief Disable UART auto flow control function
gustavatmel 1:9c5af431a1f1 89 *
gustavatmel 1:9c5af431a1f1 90 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 91 *
gustavatmel 1:9c5af431a1f1 92 * @return None
gustavatmel 1:9c5af431a1f1 93 *
gustavatmel 1:9c5af431a1f1 94 * @details The function is used to disable UART auto flow control.
gustavatmel 1:9c5af431a1f1 95 */
gustavatmel 1:9c5af431a1f1 96 void UART_DisableFlowCtrl(UART_T* uart)
gustavatmel 1:9c5af431a1f1 97 {
gustavatmel 1:9c5af431a1f1 98 uart->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk);
gustavatmel 1:9c5af431a1f1 99 }
gustavatmel 1:9c5af431a1f1 100
gustavatmel 1:9c5af431a1f1 101
gustavatmel 1:9c5af431a1f1 102 /**
gustavatmel 1:9c5af431a1f1 103 * @brief Disable UART specified interrupt
gustavatmel 1:9c5af431a1f1 104 *
gustavatmel 1:9c5af431a1f1 105 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 106 * @param[in] u32InterruptFlag The specified interrupt of UART module.
gustavatmel 1:9c5af431a1f1 107 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
gustavatmel 1:9c5af431a1f1 108 * - \ref UART_INTEN_LINIEN_Msk : Lin bus interrupt
gustavatmel 1:9c5af431a1f1 109 * - \ref UART_INTEN_BUFERRIEN_Msk : Buffer Error interrupt
gustavatmel 1:9c5af431a1f1 110 * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt
gustavatmel 1:9c5af431a1f1 111 * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt
gustavatmel 1:9c5af431a1f1 112 * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt
gustavatmel 1:9c5af431a1f1 113 * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt
gustavatmel 1:9c5af431a1f1 114 * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt *
gustavatmel 1:9c5af431a1f1 115 *
gustavatmel 1:9c5af431a1f1 116 * @return None
gustavatmel 1:9c5af431a1f1 117 *
gustavatmel 1:9c5af431a1f1 118 * @details The function is used to disable UART specified interrupt and disable NVIC UART IRQ.
gustavatmel 1:9c5af431a1f1 119 */
gustavatmel 1:9c5af431a1f1 120 void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag)
gustavatmel 1:9c5af431a1f1 121 {
gustavatmel 1:9c5af431a1f1 122 /* Disable UART specified interrupt */
gustavatmel 1:9c5af431a1f1 123 UART_DISABLE_INT(uart, u32InterruptFlag);
gustavatmel 1:9c5af431a1f1 124 }
gustavatmel 1:9c5af431a1f1 125
gustavatmel 1:9c5af431a1f1 126
gustavatmel 1:9c5af431a1f1 127 /**
gustavatmel 1:9c5af431a1f1 128 * @brief Enable UART auto flow control function
gustavatmel 1:9c5af431a1f1 129 *
gustavatmel 1:9c5af431a1f1 130 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 131 *
gustavatmel 1:9c5af431a1f1 132 * @return None
gustavatmel 1:9c5af431a1f1 133 *
gustavatmel 1:9c5af431a1f1 134 * @details The function is used to Enable UART auto flow control.
gustavatmel 1:9c5af431a1f1 135 */
gustavatmel 1:9c5af431a1f1 136 void UART_EnableFlowCtrl(UART_T* uart)
gustavatmel 1:9c5af431a1f1 137 {
gustavatmel 1:9c5af431a1f1 138 /* Set RTS pin output is low level active */
gustavatmel 1:9c5af431a1f1 139 uart->MODEM |= UART_MODEM_RTSACTLV_Msk;
gustavatmel 1:9c5af431a1f1 140
gustavatmel 1:9c5af431a1f1 141 /* Set CTS pin input is low level active */
gustavatmel 1:9c5af431a1f1 142 uart->MODEMSTS |= UART_MODEMSTS_CTSACTLV_Msk;
gustavatmel 1:9c5af431a1f1 143
gustavatmel 1:9c5af431a1f1 144 /* Set RTS and CTS auto flow control enable */
gustavatmel 1:9c5af431a1f1 145 uart->INTEN |= UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk;
gustavatmel 1:9c5af431a1f1 146 }
gustavatmel 1:9c5af431a1f1 147
gustavatmel 1:9c5af431a1f1 148
gustavatmel 1:9c5af431a1f1 149 /**
gustavatmel 1:9c5af431a1f1 150 * @brief The function is used to enable UART specified interrupt and enable NVIC UART IRQ.
gustavatmel 1:9c5af431a1f1 151 *
gustavatmel 1:9c5af431a1f1 152 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 153 * @param[in] u32InterruptFlag The specified interrupt of UART module:
gustavatmel 1:9c5af431a1f1 154 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
gustavatmel 1:9c5af431a1f1 155 * - \ref UART_INTEN_LINIEN_Msk : Lin bus interrupt
gustavatmel 1:9c5af431a1f1 156 * - \ref UART_INTEN_BUFERRIEN_Msk : Buffer Error interrupt
gustavatmel 1:9c5af431a1f1 157 * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt
gustavatmel 1:9c5af431a1f1 158 * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt
gustavatmel 1:9c5af431a1f1 159 * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt
gustavatmel 1:9c5af431a1f1 160 * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt
gustavatmel 1:9c5af431a1f1 161 * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt *
gustavatmel 1:9c5af431a1f1 162 *
gustavatmel 1:9c5af431a1f1 163 * @return None
gustavatmel 1:9c5af431a1f1 164 *
gustavatmel 1:9c5af431a1f1 165 * @details The function is used to enable UART specified interrupt and enable NVIC UART IRQ.
gustavatmel 1:9c5af431a1f1 166 */
gustavatmel 1:9c5af431a1f1 167 void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag)
gustavatmel 1:9c5af431a1f1 168 {
gustavatmel 1:9c5af431a1f1 169 /* Enable UART specified interrupt */
gustavatmel 1:9c5af431a1f1 170 UART_ENABLE_INT(uart, u32InterruptFlag);
gustavatmel 1:9c5af431a1f1 171 }
gustavatmel 1:9c5af431a1f1 172
gustavatmel 1:9c5af431a1f1 173
gustavatmel 1:9c5af431a1f1 174 /**
gustavatmel 1:9c5af431a1f1 175 * @brief Open and set UART function
gustavatmel 1:9c5af431a1f1 176 *
gustavatmel 1:9c5af431a1f1 177 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 178 * @param[in] u32baudrate The baudrate of UART module.
gustavatmel 1:9c5af431a1f1 179 *
gustavatmel 1:9c5af431a1f1 180 * @return None
gustavatmel 1:9c5af431a1f1 181 *
gustavatmel 1:9c5af431a1f1 182 * @details This function use to enable UART function and set baud-rate.
gustavatmel 1:9c5af431a1f1 183 */
gustavatmel 1:9c5af431a1f1 184 void UART_Open(UART_T* uart, uint32_t u32baudrate)
gustavatmel 1:9c5af431a1f1 185 {
gustavatmel 1:9c5af431a1f1 186 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
gustavatmel 1:9c5af431a1f1 187 uint32_t u32ClkTbl[4] = {__HXT, 0ul, __LXT, __HIRC};
gustavatmel 1:9c5af431a1f1 188 uint32_t u32Baud_Div = 0ul;
gustavatmel 1:9c5af431a1f1 189
gustavatmel 1:9c5af431a1f1 190
gustavatmel 1:9c5af431a1f1 191 if(uart==(UART_T*)UART0) {
gustavatmel 1:9c5af431a1f1 192 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 193 u32UartClkSrcSel = ((uint32_t)(CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk)) >> CLK_CLKSEL1_UART0SEL_Pos;
gustavatmel 1:9c5af431a1f1 194 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 195 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
gustavatmel 1:9c5af431a1f1 196 } else if(uart==(UART_T*)UART1) {
gustavatmel 1:9c5af431a1f1 197 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 198 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
gustavatmel 1:9c5af431a1f1 199 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 200 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
gustavatmel 1:9c5af431a1f1 201 } else if(uart==(UART_T*)UART2) {
gustavatmel 1:9c5af431a1f1 202 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 203 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
gustavatmel 1:9c5af431a1f1 204 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 205 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
gustavatmel 1:9c5af431a1f1 206 } else if(uart==(UART_T*)UART3) {
gustavatmel 1:9c5af431a1f1 207 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 208 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
gustavatmel 1:9c5af431a1f1 209 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 210 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
gustavatmel 1:9c5af431a1f1 211 } else if(uart==(UART_T*)UART4) {
gustavatmel 1:9c5af431a1f1 212 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 213 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
gustavatmel 1:9c5af431a1f1 214 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 215 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
gustavatmel 1:9c5af431a1f1 216 } else if(uart==(UART_T*)UART5) {
gustavatmel 1:9c5af431a1f1 217 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 218 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
gustavatmel 1:9c5af431a1f1 219 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 220 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
gustavatmel 1:9c5af431a1f1 221 }
gustavatmel 1:9c5af431a1f1 222
gustavatmel 1:9c5af431a1f1 223 /* Select UART function */
gustavatmel 1:9c5af431a1f1 224 uart->FUNCSEL = UART_FUNCSEL_UART;
gustavatmel 1:9c5af431a1f1 225
gustavatmel 1:9c5af431a1f1 226 /* Set UART line configuration */
gustavatmel 1:9c5af431a1f1 227 uart->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
gustavatmel 1:9c5af431a1f1 228
gustavatmel 1:9c5af431a1f1 229 /* Set UART Rx and RTS trigger level */
gustavatmel 1:9c5af431a1f1 230 uart->FIFO &= ~(UART_FIFO_RFITL_Msk | UART_FIFO_RTSTRGLV_Msk);
gustavatmel 1:9c5af431a1f1 231
gustavatmel 1:9c5af431a1f1 232 /* Get PLL clock frequency if UART clock source selection is PLL */
gustavatmel 1:9c5af431a1f1 233 if(u32UartClkSrcSel == 1ul) {
gustavatmel 1:9c5af431a1f1 234 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
gustavatmel 1:9c5af431a1f1 235 }
gustavatmel 1:9c5af431a1f1 236
gustavatmel 1:9c5af431a1f1 237 /* Set UART baud rate */
gustavatmel 1:9c5af431a1f1 238 if(u32baudrate != 0ul) {
gustavatmel 1:9c5af431a1f1 239 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
gustavatmel 1:9c5af431a1f1 240
gustavatmel 1:9c5af431a1f1 241 if(u32Baud_Div > 0xFFFFul) {
gustavatmel 1:9c5af431a1f1 242 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
gustavatmel 1:9c5af431a1f1 243 } else {
gustavatmel 1:9c5af431a1f1 244 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
gustavatmel 1:9c5af431a1f1 245 }
gustavatmel 1:9c5af431a1f1 246 }
gustavatmel 1:9c5af431a1f1 247 }
gustavatmel 1:9c5af431a1f1 248
gustavatmel 1:9c5af431a1f1 249
gustavatmel 1:9c5af431a1f1 250 /**
gustavatmel 1:9c5af431a1f1 251 * @brief Read UART data
gustavatmel 1:9c5af431a1f1 252 *
gustavatmel 1:9c5af431a1f1 253 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 254 * @param[in] pu8RxBuf The buffer to receive the data of receive FIFO.
gustavatmel 1:9c5af431a1f1 255 * @param[in] u32ReadBytes The the read bytes number of data.
gustavatmel 1:9c5af431a1f1 256 *
gustavatmel 1:9c5af431a1f1 257 * @return u32Count Receive byte count
gustavatmel 1:9c5af431a1f1 258 *
gustavatmel 1:9c5af431a1f1 259 * @details The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf.
gustavatmel 1:9c5af431a1f1 260 */
gustavatmel 1:9c5af431a1f1 261 uint32_t UART_Read(UART_T* uart, uint8_t pu8RxBuf[], uint32_t u32ReadBytes)
gustavatmel 1:9c5af431a1f1 262 {
gustavatmel 1:9c5af431a1f1 263 uint32_t u32Count, u32delayno;
gustavatmel 1:9c5af431a1f1 264 uint32_t u32Exit = 0ul;
gustavatmel 1:9c5af431a1f1 265
gustavatmel 1:9c5af431a1f1 266 for(u32Count = 0ul; u32Count < u32ReadBytes; u32Count++) {
gustavatmel 1:9c5af431a1f1 267 u32delayno = 0ul;
gustavatmel 1:9c5af431a1f1 268
gustavatmel 1:9c5af431a1f1 269 while(uart->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) { /* Check RX empty => failed */
gustavatmel 1:9c5af431a1f1 270 u32delayno++;
gustavatmel 1:9c5af431a1f1 271 if(u32delayno >= 0x40000000ul) {
gustavatmel 1:9c5af431a1f1 272 u32Exit = 1ul;
gustavatmel 1:9c5af431a1f1 273 break;
gustavatmel 1:9c5af431a1f1 274 } else {
gustavatmel 1:9c5af431a1f1 275 }
gustavatmel 1:9c5af431a1f1 276 }
gustavatmel 1:9c5af431a1f1 277
gustavatmel 1:9c5af431a1f1 278 if(u32Exit == 1ul) {
gustavatmel 1:9c5af431a1f1 279 break;
gustavatmel 1:9c5af431a1f1 280 } else {
gustavatmel 1:9c5af431a1f1 281 pu8RxBuf[u32Count] = (uint8_t)uart->DAT; /* Get Data from UART RX */
gustavatmel 1:9c5af431a1f1 282 }
gustavatmel 1:9c5af431a1f1 283 }
gustavatmel 1:9c5af431a1f1 284
gustavatmel 1:9c5af431a1f1 285 return u32Count;
gustavatmel 1:9c5af431a1f1 286
gustavatmel 1:9c5af431a1f1 287 }
gustavatmel 1:9c5af431a1f1 288
gustavatmel 1:9c5af431a1f1 289
gustavatmel 1:9c5af431a1f1 290 /**
gustavatmel 1:9c5af431a1f1 291 * @brief Set UART line configuration
gustavatmel 1:9c5af431a1f1 292 *
gustavatmel 1:9c5af431a1f1 293 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 294 * @param[in] u32baudrate The register value of baudrate of UART module.
gustavatmel 1:9c5af431a1f1 295 * If u32baudrate = 0, UART baudrate will not change.
gustavatmel 1:9c5af431a1f1 296 * @param[in] u32data_width The data length of UART module.
gustavatmel 1:9c5af431a1f1 297 * - \ref UART_WORD_LEN_5
gustavatmel 1:9c5af431a1f1 298 * - \ref UART_WORD_LEN_6
gustavatmel 1:9c5af431a1f1 299 * - \ref UART_WORD_LEN_7
gustavatmel 1:9c5af431a1f1 300 * - \ref UART_WORD_LEN_8
gustavatmel 1:9c5af431a1f1 301 * @param[in] u32parity The parity setting (none/odd/even/mark/space) of UART module.
gustavatmel 1:9c5af431a1f1 302 * - \ref UART_PARITY_NONE
gustavatmel 1:9c5af431a1f1 303 * - \ref UART_PARITY_ODD
gustavatmel 1:9c5af431a1f1 304 * - \ref UART_PARITY_EVEN
gustavatmel 1:9c5af431a1f1 305 * - \ref UART_PARITY_MARK
gustavatmel 1:9c5af431a1f1 306 * - \ref UART_PARITY_SPACE
gustavatmel 1:9c5af431a1f1 307 * @param[in] u32stop_bits The stop bit length (1/1.5/2 bit) of UART module.
gustavatmel 1:9c5af431a1f1 308 * - \ref UART_STOP_BIT_1
gustavatmel 1:9c5af431a1f1 309 * - \ref UART_STOP_BIT_1_5
gustavatmel 1:9c5af431a1f1 310 * - \ref UART_STOP_BIT_2
gustavatmel 1:9c5af431a1f1 311 *
gustavatmel 1:9c5af431a1f1 312 * @return None
gustavatmel 1:9c5af431a1f1 313 *
gustavatmel 1:9c5af431a1f1 314 * @details This function use to config UART line setting.
gustavatmel 1:9c5af431a1f1 315 */
gustavatmel 1:9c5af431a1f1 316 void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
gustavatmel 1:9c5af431a1f1 317 {
gustavatmel 1:9c5af431a1f1 318 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
gustavatmel 1:9c5af431a1f1 319 uint32_t u32ClkTbl[4ul] = {__HXT, 0ul, __LXT, __HIRC};
gustavatmel 1:9c5af431a1f1 320 uint32_t u32Baud_Div = 0ul;
gustavatmel 1:9c5af431a1f1 321
gustavatmel 1:9c5af431a1f1 322
gustavatmel 1:9c5af431a1f1 323 if(uart==(UART_T*)UART0) {
gustavatmel 1:9c5af431a1f1 324 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 325 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk) >> CLK_CLKSEL1_UART0SEL_Pos;
gustavatmel 1:9c5af431a1f1 326 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 327 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
gustavatmel 1:9c5af431a1f1 328 } else if(uart==(UART_T*)UART1) {
gustavatmel 1:9c5af431a1f1 329 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 330 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
gustavatmel 1:9c5af431a1f1 331 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 332 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
gustavatmel 1:9c5af431a1f1 333 } else if(uart==(UART_T*)UART2) {
gustavatmel 1:9c5af431a1f1 334 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 335 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
gustavatmel 1:9c5af431a1f1 336 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 337 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
gustavatmel 1:9c5af431a1f1 338 } else if(uart==(UART_T*)UART3) {
gustavatmel 1:9c5af431a1f1 339 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 340 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
gustavatmel 1:9c5af431a1f1 341 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 342 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
gustavatmel 1:9c5af431a1f1 343 } else if(uart==(UART_T*)UART4) {
gustavatmel 1:9c5af431a1f1 344 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 345 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
gustavatmel 1:9c5af431a1f1 346 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 347 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
gustavatmel 1:9c5af431a1f1 348 } else if(uart==(UART_T*)UART5) {
gustavatmel 1:9c5af431a1f1 349 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 350 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
gustavatmel 1:9c5af431a1f1 351 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 352 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
gustavatmel 1:9c5af431a1f1 353 }
gustavatmel 1:9c5af431a1f1 354
gustavatmel 1:9c5af431a1f1 355 /* Get PLL clock frequency if UART clock source selection is PLL */
gustavatmel 1:9c5af431a1f1 356 if(u32UartClkSrcSel == 1ul) {
gustavatmel 1:9c5af431a1f1 357 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
gustavatmel 1:9c5af431a1f1 358 } else {
gustavatmel 1:9c5af431a1f1 359 }
gustavatmel 1:9c5af431a1f1 360
gustavatmel 1:9c5af431a1f1 361 /* Set UART baud rate */
gustavatmel 1:9c5af431a1f1 362 if(u32baudrate != 0ul) {
gustavatmel 1:9c5af431a1f1 363 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
gustavatmel 1:9c5af431a1f1 364
gustavatmel 1:9c5af431a1f1 365 if(u32Baud_Div > 0xFFFFul) {
gustavatmel 1:9c5af431a1f1 366 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
gustavatmel 1:9c5af431a1f1 367 } else {
gustavatmel 1:9c5af431a1f1 368 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
gustavatmel 1:9c5af431a1f1 369 }
gustavatmel 1:9c5af431a1f1 370 }
gustavatmel 1:9c5af431a1f1 371
gustavatmel 1:9c5af431a1f1 372 /* Set UART line configuration */
gustavatmel 1:9c5af431a1f1 373 uart->LINE = u32data_width | u32parity | u32stop_bits;
gustavatmel 1:9c5af431a1f1 374 }
gustavatmel 1:9c5af431a1f1 375
gustavatmel 1:9c5af431a1f1 376
gustavatmel 1:9c5af431a1f1 377 /**
gustavatmel 1:9c5af431a1f1 378 * @brief Set Rx timeout count
gustavatmel 1:9c5af431a1f1 379 *
gustavatmel 1:9c5af431a1f1 380 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 381 * @param[in] u32TOC Rx timeout counter.
gustavatmel 1:9c5af431a1f1 382 *
gustavatmel 1:9c5af431a1f1 383 * @return None
gustavatmel 1:9c5af431a1f1 384 *
gustavatmel 1:9c5af431a1f1 385 * @details This function use to set Rx timeout count.
gustavatmel 1:9c5af431a1f1 386 */
gustavatmel 1:9c5af431a1f1 387 void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
gustavatmel 1:9c5af431a1f1 388 {
gustavatmel 1:9c5af431a1f1 389 /* Set time-out interrupt comparator */
gustavatmel 1:9c5af431a1f1 390 uart->TOUT = (uart->TOUT & ~UART_TOUT_TOIC_Msk) | (u32TOC);
gustavatmel 1:9c5af431a1f1 391
gustavatmel 1:9c5af431a1f1 392 /* Set time-out counter enable */
gustavatmel 1:9c5af431a1f1 393 uart->INTEN |= UART_INTEN_TOCNTEN_Msk;
gustavatmel 1:9c5af431a1f1 394 }
gustavatmel 1:9c5af431a1f1 395
gustavatmel 1:9c5af431a1f1 396
gustavatmel 1:9c5af431a1f1 397 /**
gustavatmel 1:9c5af431a1f1 398 * @brief Select and configure IrDA function
gustavatmel 1:9c5af431a1f1 399 *
gustavatmel 1:9c5af431a1f1 400 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 401 * @param[in] u32Buadrate The baudrate of UART module.
gustavatmel 1:9c5af431a1f1 402 * @param[in] u32Direction The direction of UART module in IrDA mode:
gustavatmel 1:9c5af431a1f1 403 * - \ref UART_IRDA_TXEN
gustavatmel 1:9c5af431a1f1 404 * - \ref UART_IRDA_RXEN
gustavatmel 1:9c5af431a1f1 405 *
gustavatmel 1:9c5af431a1f1 406 * @return None
gustavatmel 1:9c5af431a1f1 407 *
gustavatmel 1:9c5af431a1f1 408 * @details The function is used to configure IrDA relative settings. It consists of TX or RX mode and baudrate.
gustavatmel 1:9c5af431a1f1 409 */
gustavatmel 1:9c5af431a1f1 410 void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
gustavatmel 1:9c5af431a1f1 411 {
gustavatmel 1:9c5af431a1f1 412 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
gustavatmel 1:9c5af431a1f1 413 uint32_t u32ClkTbl[4ul] = {__HXT, 0ul, __LXT, __HIRC};
gustavatmel 1:9c5af431a1f1 414 uint32_t u32Baud_Div;
gustavatmel 1:9c5af431a1f1 415
gustavatmel 1:9c5af431a1f1 416 /* Select IrDA function mode */
gustavatmel 1:9c5af431a1f1 417 uart->FUNCSEL = UART_FUNCSEL_IrDA;
gustavatmel 1:9c5af431a1f1 418
gustavatmel 1:9c5af431a1f1 419
gustavatmel 1:9c5af431a1f1 420 if(uart==UART0) {
gustavatmel 1:9c5af431a1f1 421 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 422 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk) >> CLK_CLKSEL1_UART0SEL_Pos;
gustavatmel 1:9c5af431a1f1 423 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 424 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
gustavatmel 1:9c5af431a1f1 425 } else if(uart==UART1) {
gustavatmel 1:9c5af431a1f1 426 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 427 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
gustavatmel 1:9c5af431a1f1 428 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 429 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
gustavatmel 1:9c5af431a1f1 430 } else if(uart==UART2) {
gustavatmel 1:9c5af431a1f1 431 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 432 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
gustavatmel 1:9c5af431a1f1 433 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 434 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
gustavatmel 1:9c5af431a1f1 435 } else if(uart==UART3) {
gustavatmel 1:9c5af431a1f1 436 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 437 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
gustavatmel 1:9c5af431a1f1 438 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 439 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
gustavatmel 1:9c5af431a1f1 440 } else if(uart==UART4) {
gustavatmel 1:9c5af431a1f1 441 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 442 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
gustavatmel 1:9c5af431a1f1 443 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 444 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
gustavatmel 1:9c5af431a1f1 445 } else if(uart==UART5) {
gustavatmel 1:9c5af431a1f1 446 /* Get UART clock source selection */
gustavatmel 1:9c5af431a1f1 447 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
gustavatmel 1:9c5af431a1f1 448 /* Get UART clock divider number */
gustavatmel 1:9c5af431a1f1 449 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
gustavatmel 1:9c5af431a1f1 450 }
gustavatmel 1:9c5af431a1f1 451
gustavatmel 1:9c5af431a1f1 452
gustavatmel 1:9c5af431a1f1 453 /* Get PLL clock frequency if UART clock source selection is PLL */
gustavatmel 1:9c5af431a1f1 454 if(u32UartClkSrcSel == 1ul) {
gustavatmel 1:9c5af431a1f1 455 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
gustavatmel 1:9c5af431a1f1 456 } else {
gustavatmel 1:9c5af431a1f1 457 }
gustavatmel 1:9c5af431a1f1 458
gustavatmel 1:9c5af431a1f1 459 /* Set UART IrDA baud rate in mode 0 */
gustavatmel 1:9c5af431a1f1 460 if(u32Buadrate != 0ul) {
gustavatmel 1:9c5af431a1f1 461 u32Baud_Div = UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32Buadrate);
gustavatmel 1:9c5af431a1f1 462
gustavatmel 1:9c5af431a1f1 463 if(u32Baud_Div < 0xFFFFul) {
gustavatmel 1:9c5af431a1f1 464 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
gustavatmel 1:9c5af431a1f1 465 } else {
gustavatmel 1:9c5af431a1f1 466 }
gustavatmel 1:9c5af431a1f1 467 }
gustavatmel 1:9c5af431a1f1 468
gustavatmel 1:9c5af431a1f1 469 /* Configure IrDA relative settings */
gustavatmel 1:9c5af431a1f1 470 if(u32Direction == UART_IRDA_RXEN) {
gustavatmel 1:9c5af431a1f1 471 uart->IRDA |= UART_IRDA_RXINV_Msk; /*Rx signal is inverse*/
gustavatmel 1:9c5af431a1f1 472 uart->IRDA &= ~UART_IRDA_TXEN_Msk;
gustavatmel 1:9c5af431a1f1 473 } else {
gustavatmel 1:9c5af431a1f1 474 uart->IRDA &= ~UART_IRDA_TXINV_Msk; /*Tx signal is not inverse*/
gustavatmel 1:9c5af431a1f1 475 uart->IRDA |= UART_IRDA_TXEN_Msk;
gustavatmel 1:9c5af431a1f1 476 }
gustavatmel 1:9c5af431a1f1 477
gustavatmel 1:9c5af431a1f1 478 }
gustavatmel 1:9c5af431a1f1 479
gustavatmel 1:9c5af431a1f1 480
gustavatmel 1:9c5af431a1f1 481 /**
gustavatmel 1:9c5af431a1f1 482 * @brief Select and configure RS485 function
gustavatmel 1:9c5af431a1f1 483 *
gustavatmel 1:9c5af431a1f1 484 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 485 * @param[in] u32Mode The operation mode(NMM/AUD/AAD).
gustavatmel 1:9c5af431a1f1 486 * - \ref UART_ALTCTL_RS485NMM_Msk
gustavatmel 1:9c5af431a1f1 487 * - \ref UART_ALTCTL_RS485AUD_Msk
gustavatmel 1:9c5af431a1f1 488 * - \ref UART_ALTCTL_RS485AAD_Msk
gustavatmel 1:9c5af431a1f1 489 * @param[in] u32Addr The RS485 address.
gustavatmel 1:9c5af431a1f1 490 *
gustavatmel 1:9c5af431a1f1 491 * @return None
gustavatmel 1:9c5af431a1f1 492 *
gustavatmel 1:9c5af431a1f1 493 * @details The function is used to set RS485 relative setting.
gustavatmel 1:9c5af431a1f1 494 */
gustavatmel 1:9c5af431a1f1 495 void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
gustavatmel 1:9c5af431a1f1 496 {
gustavatmel 1:9c5af431a1f1 497 /* Select UART RS485 function mode */
gustavatmel 1:9c5af431a1f1 498 uart->FUNCSEL = UART_FUNCSEL_RS485;
gustavatmel 1:9c5af431a1f1 499
gustavatmel 1:9c5af431a1f1 500 /* Set RS585 configuration */
gustavatmel 1:9c5af431a1f1 501 uart->ALTCTL &= ~(UART_ALTCTL_RS485NMM_Msk | UART_ALTCTL_RS485AUD_Msk | UART_ALTCTL_RS485AAD_Msk | UART_ALTCTL_ADDRMV_Msk);
gustavatmel 1:9c5af431a1f1 502 uart->ALTCTL |= (u32Mode | (u32Addr << UART_ALTCTL_ADDRMV_Pos));
gustavatmel 1:9c5af431a1f1 503 }
gustavatmel 1:9c5af431a1f1 504
gustavatmel 1:9c5af431a1f1 505
gustavatmel 1:9c5af431a1f1 506 /**
gustavatmel 1:9c5af431a1f1 507 * @brief Select and configure LIN function
gustavatmel 1:9c5af431a1f1 508 *
gustavatmel 1:9c5af431a1f1 509 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 510 * @param[in] u32Mode The LIN direction :
gustavatmel 1:9c5af431a1f1 511 * - \ref UART_ALTCTL_LINTXEN_Msk
gustavatmel 1:9c5af431a1f1 512 * - \ref UART_ALTCTL_LINRXEN_Msk
gustavatmel 1:9c5af431a1f1 513 * @param[in] u32BreakLength The break field length.
gustavatmel 1:9c5af431a1f1 514 *
gustavatmel 1:9c5af431a1f1 515 * @return None
gustavatmel 1:9c5af431a1f1 516 *
gustavatmel 1:9c5af431a1f1 517 * @details The function is used to set LIN relative setting.
gustavatmel 1:9c5af431a1f1 518 */
gustavatmel 1:9c5af431a1f1 519 void UART_SelectLINMode(UART_T* uart, uint32_t u32Mode, uint32_t u32BreakLength)
gustavatmel 1:9c5af431a1f1 520 {
gustavatmel 1:9c5af431a1f1 521 /* Select LIN function mode */
gustavatmel 1:9c5af431a1f1 522 uart->FUNCSEL = UART_FUNCSEL_LIN;
gustavatmel 1:9c5af431a1f1 523
gustavatmel 1:9c5af431a1f1 524 /* Select LIN function setting : Tx enable, Rx enable and break field length */
gustavatmel 1:9c5af431a1f1 525 uart->ALTCTL &= ~(UART_ALTCTL_LINTXEN_Msk | UART_ALTCTL_LINRXEN_Msk | UART_ALTCTL_BRKFL_Msk);
gustavatmel 1:9c5af431a1f1 526 uart->ALTCTL |= (u32Mode | (u32BreakLength << UART_ALTCTL_BRKFL_Pos));
gustavatmel 1:9c5af431a1f1 527 }
gustavatmel 1:9c5af431a1f1 528
gustavatmel 1:9c5af431a1f1 529
gustavatmel 1:9c5af431a1f1 530 /**
gustavatmel 1:9c5af431a1f1 531 * @brief Write UART data
gustavatmel 1:9c5af431a1f1 532 *
gustavatmel 1:9c5af431a1f1 533 * @param[in] uart The pointer of the specified UART module.
gustavatmel 1:9c5af431a1f1 534 * @param[in] pu8TxBuf The buffer to send the data to UART transmission FIFO.
gustavatmel 1:9c5af431a1f1 535 * @param[out] u32WriteBytes The byte number of data.
gustavatmel 1:9c5af431a1f1 536 *
gustavatmel 1:9c5af431a1f1 537 * @return u32Count transfer byte count
gustavatmel 1:9c5af431a1f1 538 *
gustavatmel 1:9c5af431a1f1 539 * @details The function is to write data into TX buffer to transmit data by UART.
gustavatmel 1:9c5af431a1f1 540 */
gustavatmel 1:9c5af431a1f1 541 uint32_t UART_Write(UART_T* uart, uint8_t pu8TxBuf[], uint32_t u32WriteBytes)
gustavatmel 1:9c5af431a1f1 542 {
gustavatmel 1:9c5af431a1f1 543 uint32_t u32Count, u32delayno;
gustavatmel 1:9c5af431a1f1 544 uint32_t u32Exit = 0ul;
gustavatmel 1:9c5af431a1f1 545
gustavatmel 1:9c5af431a1f1 546 for(u32Count = 0ul; u32Count != u32WriteBytes; u32Count++) {
gustavatmel 1:9c5af431a1f1 547 u32delayno = 0ul;
gustavatmel 1:9c5af431a1f1 548 while((uart->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk) == 0ul) { /* Wait Tx empty and Time-out manner */
gustavatmel 1:9c5af431a1f1 549 u32delayno++;
gustavatmel 1:9c5af431a1f1 550 if(u32delayno >= 0x40000000ul) {
gustavatmel 1:9c5af431a1f1 551 u32Exit = 1ul;
gustavatmel 1:9c5af431a1f1 552 break;
gustavatmel 1:9c5af431a1f1 553 } else {
gustavatmel 1:9c5af431a1f1 554 }
gustavatmel 1:9c5af431a1f1 555 }
gustavatmel 1:9c5af431a1f1 556
gustavatmel 1:9c5af431a1f1 557 if(u32Exit == 1ul) {
gustavatmel 1:9c5af431a1f1 558 break;
gustavatmel 1:9c5af431a1f1 559 } else {
gustavatmel 1:9c5af431a1f1 560 uart->DAT = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
gustavatmel 1:9c5af431a1f1 561 }
gustavatmel 1:9c5af431a1f1 562 }
gustavatmel 1:9c5af431a1f1 563
gustavatmel 1:9c5af431a1f1 564 return u32Count;
gustavatmel 1:9c5af431a1f1 565
gustavatmel 1:9c5af431a1f1 566 }
gustavatmel 1:9c5af431a1f1 567
gustavatmel 1:9c5af431a1f1 568
gustavatmel 1:9c5af431a1f1 569 /*@}*/ /* end of group M480_UART_EXPORTED_FUNCTIONS */
gustavatmel 1:9c5af431a1f1 570
gustavatmel 1:9c5af431a1f1 571 /*@}*/ /* end of group M480_UART_Driver */
gustavatmel 1:9c5af431a1f1 572
gustavatmel 1:9c5af431a1f1 573 /*@}*/ /* end of group M480_Device_Driver */
gustavatmel 1:9c5af431a1f1 574
gustavatmel 1:9c5af431a1f1 575 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
gustavatmel 1:9c5af431a1f1 576
gustavatmel 1:9c5af431a1f1 577
gustavatmel 1:9c5af431a1f1 578