mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Mon Oct 02 15:33:19 2017 +0100
Revision:
174:b96e65c34a4d
This updates the lib to the mbed lib v 152

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 174:b96e65c34a4d 1 /**************************************************************************//**
AnnaBridge 174:b96e65c34a4d 2 * @file scuart.c
AnnaBridge 174:b96e65c34a4d 3 * @version V1.00
AnnaBridge 174:b96e65c34a4d 4 * $Revision: 5 $
AnnaBridge 174:b96e65c34a4d 5 * $Date: 15/05/14 11:14a $
AnnaBridge 174:b96e65c34a4d 6 * @brief Nano100 series Smartcard UART mode (SCUART) driver source file
AnnaBridge 174:b96e65c34a4d 7 *
AnnaBridge 174:b96e65c34a4d 8 * @note
AnnaBridge 174:b96e65c34a4d 9 * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
AnnaBridge 174:b96e65c34a4d 10 *****************************************************************************/
AnnaBridge 174:b96e65c34a4d 11 #include "Nano100Series.h"
AnnaBridge 174:b96e65c34a4d 12
AnnaBridge 174:b96e65c34a4d 13 /** @addtogroup NANO100_Device_Driver NANO100 Device Driver
AnnaBridge 174:b96e65c34a4d 14 @{
AnnaBridge 174:b96e65c34a4d 15 */
AnnaBridge 174:b96e65c34a4d 16
AnnaBridge 174:b96e65c34a4d 17 /** @addtogroup NANO100_SCUART_Driver SCUART Driver
AnnaBridge 174:b96e65c34a4d 18 @{
AnnaBridge 174:b96e65c34a4d 19 */
AnnaBridge 174:b96e65c34a4d 20
AnnaBridge 174:b96e65c34a4d 21
AnnaBridge 174:b96e65c34a4d 22 /** @addtogroup NANO100_SCUART_EXPORTED_FUNCTIONS SCUART Exported Functions
AnnaBridge 174:b96e65c34a4d 23 @{
AnnaBridge 174:b96e65c34a4d 24 */
AnnaBridge 174:b96e65c34a4d 25
AnnaBridge 174:b96e65c34a4d 26 /**
AnnaBridge 174:b96e65c34a4d 27 * @brief The function is used to disable smartcard interface UART mode.
AnnaBridge 174:b96e65c34a4d 28 * @param sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 29 * @return None
AnnaBridge 174:b96e65c34a4d 30 */
AnnaBridge 174:b96e65c34a4d 31 void SCUART_Close(SC_T* sc)
AnnaBridge 174:b96e65c34a4d 32 {
AnnaBridge 174:b96e65c34a4d 33 sc->IER = 0;
AnnaBridge 174:b96e65c34a4d 34 sc->UACTL = 0;
AnnaBridge 174:b96e65c34a4d 35 sc->CTL = 0;
AnnaBridge 174:b96e65c34a4d 36
AnnaBridge 174:b96e65c34a4d 37 }
AnnaBridge 174:b96e65c34a4d 38
AnnaBridge 174:b96e65c34a4d 39 /// @cond HIDDEN_SYMBOLS
AnnaBridge 174:b96e65c34a4d 40 /**
AnnaBridge 174:b96e65c34a4d 41 * @brief This function returns module clock of specified SC interface
AnnaBridge 174:b96e65c34a4d 42 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 43 * @return Module clock of specified SC interface
AnnaBridge 174:b96e65c34a4d 44 */
AnnaBridge 174:b96e65c34a4d 45 static uint32_t SCUART_GetClock(SC_T *sc)
AnnaBridge 174:b96e65c34a4d 46 {
AnnaBridge 174:b96e65c34a4d 47 uint32_t u32ClkSrc = (CLK->CLKSEL2 & CLK_CLKSEL2_SC_S_Msk) >> CLK_CLKSEL2_SC_S_Pos;
AnnaBridge 174:b96e65c34a4d 48 uint32_t u32Clk;
AnnaBridge 174:b96e65c34a4d 49
AnnaBridge 174:b96e65c34a4d 50 // Get smartcard module clock
AnnaBridge 174:b96e65c34a4d 51 if(u32ClkSrc == 0)
AnnaBridge 174:b96e65c34a4d 52 u32Clk = __HXT;
AnnaBridge 174:b96e65c34a4d 53 else if(u32ClkSrc == 1)
AnnaBridge 174:b96e65c34a4d 54 u32Clk = CLK_GetPLLClockFreq();
AnnaBridge 174:b96e65c34a4d 55 else
AnnaBridge 174:b96e65c34a4d 56 u32Clk = __HIRC12M;
AnnaBridge 174:b96e65c34a4d 57
AnnaBridge 174:b96e65c34a4d 58 if(sc == SC0)
AnnaBridge 174:b96e65c34a4d 59 u32Clk /= ((CLK->CLKDIV0 & CLK_CLKDIV0_SC0_N_Msk) >> CLK_CLKDIV0_SC0_N_Pos) + 1;
AnnaBridge 174:b96e65c34a4d 60 else if(sc == SC1)
AnnaBridge 174:b96e65c34a4d 61 u32Clk /= (CLK->CLKDIV1 & CLK_CLKDIV1_SC1_N_Msk) + 1;
AnnaBridge 174:b96e65c34a4d 62 else // SC2
AnnaBridge 174:b96e65c34a4d 63 u32Clk /= ((CLK->CLKDIV1 & CLK_CLKDIV1_SC2_N_Msk) >> CLK_CLKDIV1_SC2_N_Pos) + 1;
AnnaBridge 174:b96e65c34a4d 64
AnnaBridge 174:b96e65c34a4d 65 return u32Clk;
AnnaBridge 174:b96e65c34a4d 66 }
AnnaBridge 174:b96e65c34a4d 67
AnnaBridge 174:b96e65c34a4d 68 /// @endcond HIDDEN_SYMBOLS
AnnaBridge 174:b96e65c34a4d 69
AnnaBridge 174:b96e65c34a4d 70 /**
AnnaBridge 174:b96e65c34a4d 71 * @brief This function use to enable smartcard module UART mode and set baudrate.
AnnaBridge 174:b96e65c34a4d 72 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 73 * @param[in] u32baudrate Target baudrate of smartcard module.
AnnaBridge 174:b96e65c34a4d 74 * @return Actual baudrate of smartcard mode
AnnaBridge 174:b96e65c34a4d 75 * @note This function configures character width to 8 bits, 1 stop bit, and no parity.
AnnaBridge 174:b96e65c34a4d 76 * And can use \ref SCUART_SetLineConfig function to update these settings
AnnaBridge 174:b96e65c34a4d 77 */
AnnaBridge 174:b96e65c34a4d 78 uint32_t SCUART_Open(SC_T* sc, uint32_t u32baudrate)
AnnaBridge 174:b96e65c34a4d 79 {
AnnaBridge 174:b96e65c34a4d 80 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
AnnaBridge 174:b96e65c34a4d 81
AnnaBridge 174:b96e65c34a4d 82 // Calculate divider for target baudrate
AnnaBridge 174:b96e65c34a4d 83 u32Div = (u32Clk + (u32baudrate >> 1) - 1) / u32baudrate - 1;
AnnaBridge 174:b96e65c34a4d 84
AnnaBridge 174:b96e65c34a4d 85 sc->CTL = SC_CTL_SC_CEN_Msk | SC_CTL_SLEN_Msk; // Enable smartcard interface and stop bit = 1
AnnaBridge 174:b96e65c34a4d 86 sc->UACTL = SCUART_CHAR_LEN_8 | SCUART_PARITY_NONE | SC_UACTL_UA_MODE_EN_Msk; // Enable UART mode, disable parity and 8 bit per character
AnnaBridge 174:b96e65c34a4d 87 sc->ETUCR = u32Div;
AnnaBridge 174:b96e65c34a4d 88
AnnaBridge 174:b96e65c34a4d 89 return(u32Clk / (u32Div + 1));
AnnaBridge 174:b96e65c34a4d 90 }
AnnaBridge 174:b96e65c34a4d 91
AnnaBridge 174:b96e65c34a4d 92 /**
AnnaBridge 174:b96e65c34a4d 93 * @brief The function is used to read Rx data from RX FIFO.
AnnaBridge 174:b96e65c34a4d 94 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 95 * @param[in] pu8RxBuf The buffer to store receive the data
AnnaBridge 174:b96e65c34a4d 96 * @param[in] u32ReadBytes Target number of characters to receive
AnnaBridge 174:b96e65c34a4d 97 * @return Actual character number reads to buffer
AnnaBridge 174:b96e65c34a4d 98 * @note This function does not block and return immediately if there's no data available
AnnaBridge 174:b96e65c34a4d 99 */
AnnaBridge 174:b96e65c34a4d 100 uint32_t SCUART_Read(SC_T* sc, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
AnnaBridge 174:b96e65c34a4d 101 {
AnnaBridge 174:b96e65c34a4d 102 uint32_t u32Count;
AnnaBridge 174:b96e65c34a4d 103
AnnaBridge 174:b96e65c34a4d 104 for(u32Count = 0; u32Count < u32ReadBytes; u32Count++) {
AnnaBridge 174:b96e65c34a4d 105 if(SCUART_GET_RX_EMPTY(sc)) { // no data available
AnnaBridge 174:b96e65c34a4d 106 break;
AnnaBridge 174:b96e65c34a4d 107 }
AnnaBridge 174:b96e65c34a4d 108 pu8RxBuf[u32Count] = SCUART_READ(sc); // get data from FIFO
AnnaBridge 174:b96e65c34a4d 109 }
AnnaBridge 174:b96e65c34a4d 110
AnnaBridge 174:b96e65c34a4d 111 return u32Count;
AnnaBridge 174:b96e65c34a4d 112 }
AnnaBridge 174:b96e65c34a4d 113
AnnaBridge 174:b96e65c34a4d 114 /**
AnnaBridge 174:b96e65c34a4d 115 * @brief This function use to config smartcard UART mode line setting.
AnnaBridge 174:b96e65c34a4d 116 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 117 * @param[in] u32Baudrate Target baudrate of smartcard module. If this value is 0, UART baudrate will not change.
AnnaBridge 174:b96e65c34a4d 118 * @param[in] u32DataWidth The data length, could be
AnnaBridge 174:b96e65c34a4d 119 * - \ref SCUART_CHAR_LEN_5
AnnaBridge 174:b96e65c34a4d 120 * - \ref SCUART_CHAR_LEN_6
AnnaBridge 174:b96e65c34a4d 121 * - \ref SCUART_CHAR_LEN_7
AnnaBridge 174:b96e65c34a4d 122 * - \ref SCUART_CHAR_LEN_8
AnnaBridge 174:b96e65c34a4d 123 * @param[in] u32Parity The parity setting, could be
AnnaBridge 174:b96e65c34a4d 124 * - \ref SCUART_PARITY_NONE
AnnaBridge 174:b96e65c34a4d 125 * - \ref SCUART_PARITY_ODD
AnnaBridge 174:b96e65c34a4d 126 * - \ref SCUART_PARITY_EVEN
AnnaBridge 174:b96e65c34a4d 127 * @param[in] u32StopBits The stop bit length, could be
AnnaBridge 174:b96e65c34a4d 128 * - \ref SCUART_STOP_BIT_1
AnnaBridge 174:b96e65c34a4d 129 * - \ref SCUART_STOP_BIT_2
AnnaBridge 174:b96e65c34a4d 130 * @return Actual baudrate of smartcard
AnnaBridge 174:b96e65c34a4d 131 */
AnnaBridge 174:b96e65c34a4d 132 uint32_t SCUART_SetLineConfig(SC_T* sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits)
AnnaBridge 174:b96e65c34a4d 133 {
AnnaBridge 174:b96e65c34a4d 134
AnnaBridge 174:b96e65c34a4d 135 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
AnnaBridge 174:b96e65c34a4d 136
AnnaBridge 174:b96e65c34a4d 137 if(u32Baudrate == 0) { // keep original baudrate setting
AnnaBridge 174:b96e65c34a4d 138 u32Div = sc->ETUCR & SC_ETUCR_ETU_RDIV_Msk;
AnnaBridge 174:b96e65c34a4d 139 } else {
AnnaBridge 174:b96e65c34a4d 140 // Calculate divider for target baudrate
AnnaBridge 174:b96e65c34a4d 141 u32Div = (u32Clk + (u32Baudrate >> 1) - 1)/ u32Baudrate - 1;
AnnaBridge 174:b96e65c34a4d 142 sc->ETUCR = u32Div;
AnnaBridge 174:b96e65c34a4d 143 }
AnnaBridge 174:b96e65c34a4d 144
AnnaBridge 174:b96e65c34a4d 145 sc->CTL = u32StopBits | SC_CTL_SC_CEN_Msk; // Set stop bit
AnnaBridge 174:b96e65c34a4d 146 sc->UACTL = u32Parity | u32DataWidth | SC_UACTL_UA_MODE_EN_Msk; // Set character width and parity
AnnaBridge 174:b96e65c34a4d 147
AnnaBridge 174:b96e65c34a4d 148 return(u32Clk / (u32Div + 1));
AnnaBridge 174:b96e65c34a4d 149 }
AnnaBridge 174:b96e65c34a4d 150
AnnaBridge 174:b96e65c34a4d 151 /**
AnnaBridge 174:b96e65c34a4d 152 * @brief This function use to set receive timeout count.
AnnaBridge 174:b96e65c34a4d 153 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 154 * @param[in] u32TOC Rx timeout counter, using baudrate as counter unit. Valid range are 0~0x1FF,
AnnaBridge 174:b96e65c34a4d 155 * set this value to 0 will disable timeout counter
AnnaBridge 174:b96e65c34a4d 156 * @return None
AnnaBridge 174:b96e65c34a4d 157 * @details The time-out counter resets and starts counting whenever the RX buffer received a
AnnaBridge 174:b96e65c34a4d 158 * new data word. Once the counter decrease to 1 and no new data is received or CPU
AnnaBridge 174:b96e65c34a4d 159 * does not read any data from FIFO, a receiver time-out interrupt will be generated.
AnnaBridge 174:b96e65c34a4d 160 */
AnnaBridge 174:b96e65c34a4d 161 void SCUART_SetTimeoutCnt(SC_T* sc, uint32_t u32TOC)
AnnaBridge 174:b96e65c34a4d 162 {
AnnaBridge 174:b96e65c34a4d 163 sc->RFTMR = u32TOC;
AnnaBridge 174:b96e65c34a4d 164 }
AnnaBridge 174:b96e65c34a4d 165
AnnaBridge 174:b96e65c34a4d 166
AnnaBridge 174:b96e65c34a4d 167 /**
AnnaBridge 174:b96e65c34a4d 168 * @brief This function is to write data into transmit FIFO to send data out.
AnnaBridge 174:b96e65c34a4d 169 * @param[in] sc The base address of smartcard module.
AnnaBridge 174:b96e65c34a4d 170 * @param[in] pu8TxBuf The buffer containing data to send to transmit FIFO.
AnnaBridge 174:b96e65c34a4d 171 * @param[in] u32WriteBytes Number of data to send.
AnnaBridge 174:b96e65c34a4d 172 * @return None
AnnaBridge 174:b96e65c34a4d 173 * @note This function blocks until all data write into FIFO
AnnaBridge 174:b96e65c34a4d 174 */
AnnaBridge 174:b96e65c34a4d 175 void SCUART_Write(SC_T* sc,uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
AnnaBridge 174:b96e65c34a4d 176 {
AnnaBridge 174:b96e65c34a4d 177 uint32_t u32Count;
AnnaBridge 174:b96e65c34a4d 178
AnnaBridge 174:b96e65c34a4d 179 for(u32Count = 0; u32Count != u32WriteBytes; u32Count++) {
AnnaBridge 174:b96e65c34a4d 180 while(SCUART_GET_TX_FULL(sc)); // Wait 'til FIFO not full
AnnaBridge 174:b96e65c34a4d 181 sc->THR = pu8TxBuf[u32Count]; // Write 1 byte to FIFO
AnnaBridge 174:b96e65c34a4d 182 }
AnnaBridge 174:b96e65c34a4d 183 }
AnnaBridge 174:b96e65c34a4d 184
AnnaBridge 174:b96e65c34a4d 185
AnnaBridge 174:b96e65c34a4d 186 /*@}*/ /* end of group NANO100_SCUART_EXPORTED_FUNCTIONS */
AnnaBridge 174:b96e65c34a4d 187
AnnaBridge 174:b96e65c34a4d 188 /*@}*/ /* end of group NANO100_SCUART_Driver */
AnnaBridge 174:b96e65c34a4d 189
AnnaBridge 174:b96e65c34a4d 190 /*@}*/ /* end of group NANO100_Device_Driver */
AnnaBridge 174:b96e65c34a4d 191
AnnaBridge 174:b96e65c34a4d 192 /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/