M471M/R1/S BSP V3.01.000
The Board Support Package for M4521
scuart.c
Go to the documentation of this file.
1/**************************************************************************/
8#include "NuMicro.h"
9
30{
31 sc->INTEN = 0;
32 sc->UARTCTL = 0;
33 sc->CTL = 0;
34
35}
36
38
43static uint32_t SCUART_GetClock(SC_T *sc)
44{
45 uint32_t u32ClkSrc, u32Num, u32Clk;
46
47 if(sc == SC0)
48 u32Num = 0;
49 else
50 return FALSE;
51
52 u32ClkSrc = (CLK->CLKSEL3 >> (2 * u32Num)) & CLK_CLKSEL3_SC0SEL_Msk;
53
54 // Get smartcard module clock
55 if(u32ClkSrc == 0)
56 u32Clk = __HXT;
57 else if(u32ClkSrc == 1)
58 u32Clk = CLK_GetPLLClockFreq();
59 else if(u32ClkSrc == 2)
60 {
62 if(CLK->CLKSEL0 & CLK_CLKSEL0_PCLK0SEL_Msk)
63 u32Clk = SystemCoreClock / 2;
64 else
65 u32Clk = SystemCoreClock;
66 }
67 else
68 u32Clk = __HIRC;
69
70 u32Clk /= (((CLK->CLKDIV1 >> (8 * u32Num)) & CLK_CLKDIV1_SC0DIV_Msk) + 1);
71
72
73 return u32Clk;
74}
76
86uint32_t SCUART_Open(SC_T* sc, uint32_t u32baudrate)
87{
88 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
89
90 // Calculate divider for target baudrate
91 u32Div = (u32Clk + (u32baudrate >> 1) - 1) / u32baudrate - 1;
92
93 sc->CTL = SC_CTL_SCEN_Msk | SC_CTL_NSB_Msk; // Enable smartcard interface and stop bit = 1
94 sc->UARTCTL = SCUART_CHAR_LEN_8 | SCUART_PARITY_NONE | SC_UARTCTL_UARTEN_Msk; // Enable UART mode, disable parity and 8 bit per character
95 sc->ETUCTL = u32Div;
96
97 return(u32Clk / (u32Div+1));
98}
99
109uint32_t SCUART_Read(SC_T* sc, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
110{
111 uint32_t u32Count;
112
113 for(u32Count = 0; u32Count < u32ReadBytes; u32Count++)
114 {
115 if(SCUART_GET_RX_EMPTY(sc)) // no data available
116 {
117 break;
118 }
119 pu8RxBuf[u32Count] = SCUART_READ(sc); // get data from FIFO
120 }
121
122 return u32Count;
123}
124
144uint32_t SCUART_SetLineConfig(SC_T* sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits)
145{
146
147 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
148
149 if(u32Baudrate == 0) // keep original baudrate setting
150 {
151 u32Div = sc->ETUCTL & SC_ETUCTL_ETURDIV_Msk;
152 }
153 else
154 {
155 // Calculate divider for target baudrate
156 u32Div = (u32Clk + (u32Baudrate >> 1) - 1) / u32Baudrate - 1;
157 sc->ETUCTL = u32Div;
158 }
159
160 sc->CTL = u32StopBits | SC_CTL_SCEN_Msk; // Set stop bit
161 sc->UARTCTL = u32Parity | u32DataWidth | SC_UARTCTL_UARTEN_Msk; // Set character width and parity
162
163 return(u32Clk / (u32Div+1));
164}
165
176void SCUART_SetTimeoutCnt(SC_T* sc, uint32_t u32TOC)
177{
178 sc->RXTOUT = u32TOC;
179}
180
181
191void SCUART_Write(SC_T* sc, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
192{
193 uint32_t u32Count;
194
195 for(u32Count = 0; u32Count != u32WriteBytes; u32Count++)
196 {
197 while(SCUART_GET_TX_FULL(sc)); // Wait 'til FIFO not full
198 sc->DAT = pu8TxBuf[u32Count]; // Write 1 byte to FIFO
199 }
200}
201
202 /* end of group SCUART_EXPORTED_FUNCTIONS */
204 /* end of group SCUART_Driver */
206 /* end of group Standard_Driver */
208
#define SC_CTL_NSB_Msk
Definition: M471M_R1_S.h:8546
#define SC_ETUCTL_ETURDIV_Msk
Definition: M471M_R1_S.h:8624
#define SC_CTL_SCEN_Msk
Definition: M471M_R1_S.h:8522
#define SC_UARTCTL_UARTEN_Msk
Definition: M471M_R1_S.h:8810
NuMicro peripheral access layer header file.
__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
Definition: clk.h:326
#define CLK_CLKSEL3_SC0SEL_Msk
Definition: M471M_R1_S.h:1613
#define CLK_CLKDIV1_SC0DIV_Msk
Definition: M471M_R1_S.h:1631
#define CLK_CLKSEL0_PCLK0SEL_Msk
Definition: M471M_R1_S.h:1568
__IO uint32_t DAT
Definition: M471M_R1_S.h:8492
__IO uint32_t ETUCTL
Definition: M471M_R1_S.h:8497
#define CLK
Definition: M471M_R1_S.h:13818
__IO uint32_t INTEN
Definition: M471M_R1_S.h:8498
__IO uint32_t CTL
Definition: M471M_R1_S.h:8493
#define FALSE
Definition: M471M_R1_S.h:13904
__IO uint32_t UARTCTL
Definition: M471M_R1_S.h:8505
__IO uint32_t RXTOUT
Definition: M471M_R1_S.h:8496
#define SC0
Definition: M471M_R1_S.h:13852
#define SCUART_CHAR_LEN_8
Definition: scuart.h:31
#define SCUART_PARITY_NONE
Definition: scuart.h:33
void SCUART_SetTimeoutCnt(SC_T *sc, uint32_t u32TOC)
This function use to set receive timeout count.
Definition: scuart.c:176
#define SCUART_GET_TX_FULL(sc)
Get TX FIFO full flag status from register.
Definition: scuart.h:79
uint32_t SCUART_Read(SC_T *sc, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
Read data from smartcard UART interface.
Definition: scuart.c:109
#define SCUART_GET_RX_EMPTY(sc)
Get RX FIFO empty flag status from register.
Definition: scuart.h:133
void SCUART_Write(SC_T *sc, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
Write data to smartcard UART interface.
Definition: scuart.c:191
#define SCUART_READ(sc)
Read Rx data register.
Definition: scuart.h:122
uint32_t SCUART_SetLineConfig(SC_T *sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits)
This function use to config smartcard UART mode line setting.
Definition: scuart.c:144
uint32_t SCUART_Open(SC_T *sc, uint32_t u32baudrate)
Enable smartcard uart interface.
Definition: scuart.c:86
void SCUART_Close(SC_T *sc)
Disable smartcard uart interface.
Definition: scuart.c:29
#define __HIRC
#define __HXT
uint32_t SystemCoreClock
void SystemCoreClockUpdate(void)
Updates the SystemCoreClock with current core Clock retrieved from cpu registers.