M480 BSP V3.05.006
The Board Support Package for M480 Series
scuart.c
Go to the documentation of this file.
1/**************************************************************************/
9#include "NuMicro.h"
10
11static uint32_t SCUART_GetClock(SC_T *sc);
12
13
34{
35 sc->INTEN = 0UL;
36 sc->UARTCTL = 0UL;
37 sc->CTL = 0UL;
38
39}
46static uint32_t SCUART_GetClock(SC_T *sc)
47{
48 uint32_t u32ClkSrc, u32Num, u32Clk;
49
50 if(sc == SC0)
51 {
52 u32Num = 0UL;
53 }
54 else if(sc == SC1)
55 {
56 u32Num = 1UL;
57 }
58 else
59 {
60 u32Num = 2UL;
61 }
62
63 u32ClkSrc = (CLK->CLKSEL3 >> (2UL * u32Num)) & CLK_CLKSEL3_SC0SEL_Msk;
64
65 /* Get smartcard module clock */
66 if(u32ClkSrc == 0UL)
67 {
68 u32Clk = __HXT;
69 }
70 else if(u32ClkSrc == 1UL)
71 {
72 u32Clk = CLK_GetPLLClockFreq();
73 }
74 else if(u32ClkSrc == 2UL)
75 {
76 if(u32Num == 1UL)
77 {
78 u32Clk = CLK_GetPCLK1Freq();
79 }
80 else
81 {
82 u32Clk = CLK_GetPCLK0Freq();
83 }
84 }
85 else
86 {
87 u32Clk = __HIRC;
88 }
89
90 u32Clk /= (((CLK->CLKDIV1 >> (8UL * u32Num)) & CLK_CLKDIV1_SC0DIV_Msk) + 1UL);
91
92
93 return u32Clk;
94}
95
111uint32_t SCUART_Open(SC_T* sc, uint32_t u32baudrate)
112{
113 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
114
115 /* Calculate divider for target baudrate */
116 u32Div = (u32Clk + (u32baudrate >> 1) - 1UL) / u32baudrate - 1UL;
117
118 /* Enable smartcard interface and stop bit = 1 */
120 /* Enable UART mode, disable parity and 8 bit per character */
122 sc->ETUCTL = u32Div;
123
124 return(u32Clk / (u32Div + 1UL));
125}
126
135uint32_t SCUART_Read(SC_T* sc, uint8_t pu8RxBuf[], uint32_t u32ReadBytes)
136{
137 uint32_t u32Count;
138
139 for(u32Count = 0UL; u32Count < u32ReadBytes; u32Count++)
140 {
141 if(SCUART_GET_RX_EMPTY(sc)) /* no data available */
142 {
143 break;
144 }
145 pu8RxBuf[u32Count] = (uint8_t)SCUART_READ(sc); /* get data from FIFO */
146 }
147
148 return u32Count;
149}
150
174uint32_t SCUART_SetLineConfig(SC_T* sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits)
175{
176
177 uint32_t u32Clk = SCUART_GetClock(sc), u32Div;
178
179 if(u32Baudrate == 0UL) /* keep original baudrate setting */
180 {
181 u32Div = sc->ETUCTL & SC_ETUCTL_ETURDIV_Msk;
182 }
183 else
184 {
185 /* Calculate divider for target baudrate */
186 u32Div = (u32Clk + (u32Baudrate >> 1) - 1UL)/ u32Baudrate - 1UL;
187 sc->ETUCTL = u32Div;
188 }
189 /* Set stop bit */
190 sc->CTL = u32StopBits | SC_CTL_SCEN_Msk;
191 /* Set character width and parity */
192 sc->UARTCTL = u32Parity | u32DataWidth | SC_UARTCTL_UARTEN_Msk;
193
194 return(u32Clk / (u32Div + 1UL));
195}
196
207void SCUART_SetTimeoutCnt(SC_T* sc, uint32_t u32TOC)
208{
209 sc->RXTOUT= u32TOC;
210}
211
212
222uint32_t SCUART_Write(SC_T* sc,uint8_t pu8TxBuf[], uint32_t u32WriteBytes)
223{
224 uint32_t u32Count;
225 /* Baudrate * (start bit + 8-bit data + 1-bit parity + 2-bit stop) */
226 uint32_t u32Delay = (SystemCoreClock / SCUART_GetClock(sc)) * sc->ETUCTL * 12, i;
227
229 for(u32Count = 0UL; u32Count != u32WriteBytes; u32Count++)
230 {
231 i = 0;
232 /* Wait 'til FIFO not full */
233 while(SCUART_GET_TX_FULL(sc))
234 {
235 /* Block longer than expected. Maybe some interrupt disable SCUART clock? */
236 if(i++ > u32Delay)
237 {
239 return u32Count;
240 }
241 }
242 /* Write 1 byte to FIFO */
243 sc->DAT = pu8TxBuf[u32Count];
244 }
245 return u32Count;
246}
247
248 /* end of group SCUART_EXPORTED_FUNCTIONS */
250 /* end of group SCUART_Driver */
252 /* end of group Standard_Driver */
NuMicro peripheral access layer header file.
uint32_t CLK_GetPCLK1Freq(void)
Get PCLK1 frequency.
Definition: clk.c:206
uint32_t CLK_GetPCLK0Freq(void)
Get PCLK0 frequency.
Definition: clk.c:166
uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
Definition: clk.c:1201
#define CLK
Definition: M480.h:368
#define SC1
Definition: M480.h:441
#define SC0
Definition: M480.h:440
#define CLK_CLKSEL3_SC0SEL_Msk
Definition: clk_reg.h:2580
#define SC_CTL_NSB_Msk
Definition: sc_reg.h:1538
#define CLK_CLKDIV1_SC0DIV_Msk
Definition: clk_reg.h:2634
#define SC_ETUCTL_ETURDIV_Msk
Definition: sc_reg.h:1613
#define SC_CTL_SCEN_Msk
Definition: sc_reg.h:1514
#define SC_UARTCTL_UARTEN_Msk
Definition: sc_reg.h:1796
int32_t g_SCUART_i32ErrCode
Definition: scuart.c:22
#define SCUART_CHAR_LEN_8
Definition: scuart.h:32
#define SCUART_PARITY_NONE
Definition: scuart.h:34
#define SCUART_TIMEOUT_ERR
Definition: scuart.h:41
void SCUART_SetTimeoutCnt(SC_T *sc, uint32_t u32TOC)
This function use to set receive timeout count.
Definition: scuart.c:207
#define SCUART_GET_TX_FULL(sc)
Get TX FIFO full flag status from register.
Definition: scuart.h:79
#define SCUART_GET_RX_EMPTY(sc)
Get RX FIFO empty flag status from register.
Definition: scuart.h:138
uint32_t SCUART_Open(SC_T *sc, uint32_t u32baudrate)
This function use to enable smartcard module UART mode and set baudrate.
Definition: scuart.c:111
uint32_t SCUART_Read(SC_T *sc, uint8_t pu8RxBuf[], uint32_t u32ReadBytes)
The function is used to read Rx data from RX FIFO.
Definition: scuart.c:135
#define SCUART_READ(sc)
Read Rx data register.
Definition: scuart.h:128
uint32_t SCUART_Write(SC_T *sc, uint8_t pu8TxBuf[], uint32_t u32WriteBytes)
This function is to write data into transmit FIFO to send data out.
Definition: scuart.c:222
uint32_t SCUART_SetLineConfig(SC_T *sc, uint32_t u32Baudrate, uint32_t u32DataWidth, uint32_t u32Parity, uint32_t u32StopBits)
This function use to configure smartcard UART mode line setting.
Definition: scuart.c:174
void SCUART_Close(SC_T *sc)
The function is used to disable smartcard interface UART mode.
Definition: scuart.c:33
static uint32_t SCUART_GetClock(SC_T *sc)
Definition: sc_reg.h:27
__IO uint32_t DAT
Definition: sc_reg.h:1484
__IO uint32_t ETUCTL
Definition: sc_reg.h:1489
__IO uint32_t INTEN
Definition: sc_reg.h:1490
__IO uint32_t CTL
Definition: sc_reg.h:1485
__IO uint32_t UARTCTL
Definition: sc_reg.h:1497
__IO uint32_t RXTOUT
Definition: sc_reg.h:1488
#define __HIRC
Definition: system_M480.h:36
#define __HXT
Definition: system_M480.h:29
uint32_t SystemCoreClock
Definition: system_M480.c:21