1 /**************************************************************************//**
2 * @file usci_spi.c
3 * @version V3.00
4 * @brief M460 series USCI_SPI driver source file
5 *
6 * @copyright SPDX-License-Identifier: Apache-2.0
7 * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
8 *****************************************************************************/
9 #include "NuMicro.h"
10
11 /** @addtogroup Standard_Driver Standard Driver
12 @{
13 */
14
15 /** @addtogroup USCI_SPI_Driver USCI_SPI Driver
16 @{
17 */
18
19
20 /** @addtogroup USCI_SPI_EXPORTED_FUNCTIONS USCI_SPI Exported Functions
21 @{
22 */
23
24 /**
25 * @brief This function make USCI_SPI module be ready to transfer.
26 * By default, the USCI_SPI transfer sequence is MSB first, the slave selection
27 * signal is active low and the automatic slave select function is disabled. In
28 * Slave mode, the u32BusClock must be NULL and the USCI_SPI clock
29 * divider setting will be 0.
30 * @param[in] uspi The pointer of the specified USCI_SPI module.
31 * @param[in] u32MasterSlave Decide the USCI_SPI module is operating in master mode or in slave mode. Valid values are:
32 * - \ref USPI_SLAVE
33 * - \ref USPI_MASTER
34 * @param[in] u32SPIMode Decide the transfer timing. Valid values are:
35 * - \ref USPI_MODE_0
36 * - \ref USPI_MODE_1
37 * - \ref USPI_MODE_2
38 * - \ref USPI_MODE_3
39 * @param[in] u32DataWidth The data width of a USCI_SPI transaction.
40 * @param[in] u32BusClock The expected frequency of USCI_SPI bus clock in Hz.
41 * @return Actual frequency of USCI_SPI peripheral clock.
42 */
USPI_Open(USPI_T * uspi,uint32_t u32MasterSlave,uint32_t u32SPIMode,uint32_t u32DataWidth,uint32_t u32BusClock)43 uint32_t USPI_Open(USPI_T *uspi, uint32_t u32MasterSlave, uint32_t u32SPIMode, uint32_t u32DataWidth, uint32_t u32BusClock)
44 {
45 uint32_t u32ClkDiv = 0ul;
46 uint32_t u32Pclk;
47 uint32_t u32UspiClk = 0ul;
48
49 if(uspi == (USPI_T *)USPI0)
50 {
51 u32Pclk = CLK_GetPCLK0Freq();
52 }
53
54 if(u32BusClock != 0ul)
55 {
56 u32ClkDiv = (uint32_t)((((((u32Pclk / 2ul) * 10ul) / (u32BusClock)) + 5ul) / 10ul) - 1ul); /* Compute proper divider for USCI_SPI clock */
57 }
58 else {}
59
60 /* Enable USCI_SPI protocol */
61 uspi->CTL &= ~USPI_CTL_FUNMODE_Msk;
62 uspi->CTL = 1ul << USPI_CTL_FUNMODE_Pos;
63
64 /* Data format configuration */
65 if(u32DataWidth == 16ul)
66 {
67 u32DataWidth = 0ul;
68 }
69 else {}
70 uspi->LINECTL &= ~USPI_LINECTL_DWIDTH_Msk;
71 uspi->LINECTL |= (u32DataWidth << USPI_LINECTL_DWIDTH_Pos);
72
73 /* MSB data format */
74 uspi->LINECTL &= ~USPI_LINECTL_LSB_Msk;
75
76 /* Set slave selection signal active low */
77 if(u32MasterSlave == USPI_MASTER)
78 {
79 uspi->LINECTL |= USPI_LINECTL_CTLOINV_Msk;
80 }
81 else
82 {
83 uspi->CTLIN0 |= USPI_CTLIN0_ININV_Msk;
84 }
85
86 /* Set operating mode and transfer timing */
87 uspi->PROTCTL &= ~(USPI_PROTCTL_SCLKMODE_Msk | USPI_PROTCTL_AUTOSS_Msk | USPI_PROTCTL_SLAVE_Msk);
88 uspi->PROTCTL |= (u32MasterSlave | u32SPIMode);
89
90 /* Set USCI_SPI bus clock */
91 uspi->BRGEN &= ~USPI_BRGEN_CLKDIV_Msk;
92 uspi->BRGEN |= (u32ClkDiv << USPI_BRGEN_CLKDIV_Pos);
93 uspi->PROTCTL |= USPI_PROTCTL_PROTEN_Msk;
94
95 if(u32BusClock != 0ul)
96 {
97 u32UspiClk = (uint32_t)(u32Pclk / ((u32ClkDiv + 1ul) << 1));
98 }
99 else {}
100
101 return u32UspiClk;
102 }
103
104 /**
105 * @brief Disable USCI_SPI function mode.
106 * @param[in] uspi The pointer of the specified USCI_SPI module.
107 * @return None
108 */
USPI_Close(USPI_T * uspi)109 void USPI_Close(USPI_T *uspi)
110 {
111 uspi->CTL &= ~USPI_CTL_FUNMODE_Msk;
112 }
113
114 /**
115 * @brief Clear Rx buffer.
116 * @param[in] uspi The pointer of the specified USCI_SPI module.
117 * @return None
118 */
USPI_ClearRxBuf(USPI_T * uspi)119 void USPI_ClearRxBuf(USPI_T *uspi)
120 {
121 uspi->BUFCTL |= USPI_BUFCTL_RXCLR_Msk;
122 }
123
124 /**
125 * @brief Clear Tx buffer.
126 * @param[in] uspi The pointer of the specified USCI_SPI module.
127 * @return None
128 */
USPI_ClearTxBuf(USPI_T * uspi)129 void USPI_ClearTxBuf(USPI_T *uspi)
130 {
131 uspi->BUFCTL |= USPI_BUFCTL_TXCLR_Msk;
132 }
133
134 /**
135 * @brief Disable the automatic slave select function.
136 * @param[in] uspi The pointer of the specified USCI_SPI module.
137 * @return None
138 */
USPI_DisableAutoSS(USPI_T * uspi)139 void USPI_DisableAutoSS(USPI_T *uspi)
140 {
141 uspi->PROTCTL &= ~(USPI_PROTCTL_AUTOSS_Msk | USPI_PROTCTL_SS_Msk);
142 }
143
144 /**
145 * @brief Enable the automatic slave select function. Only available in Master mode.
146 * @param[in] uspi The pointer of the specified USCI_SPI module.
147 * @param[in] u32SSPinMask This parameter is not used.
148 * @param[in] u32ActiveLevel The active level of slave select signal. Valid values are:
149 * - \ref USPI_SS_ACTIVE_HIGH
150 * - \ref USPI_SS_ACTIVE_LOW
151 * @return None
152 */
USPI_EnableAutoSS(USPI_T * uspi,uint32_t u32SSPinMask,uint32_t u32ActiveLevel)153 void USPI_EnableAutoSS(USPI_T *uspi, uint32_t u32SSPinMask, uint32_t u32ActiveLevel)
154 {
155 uspi->LINECTL = (uspi->LINECTL & ~USPI_LINECTL_CTLOINV_Msk) | u32ActiveLevel;
156 uspi->PROTCTL |= USPI_PROTCTL_AUTOSS_Msk;
157 }
158
159 /**
160 * @brief Set the USCI_SPI bus clock. Only available in Master mode.
161 * @param[in] uspi The pointer of the specified USCI_SPI module.
162 * @param[in] u32BusClock The expected frequency of USCI_SPI bus clock.
163 * @return Actual frequency of USCI_SPI peripheral clock.
164 */
USPI_SetBusClock(USPI_T * uspi,uint32_t u32BusClock)165 uint32_t USPI_SetBusClock(USPI_T *uspi, uint32_t u32BusClock)
166 {
167 uint32_t u32ClkDiv;
168 uint32_t u32Pclk = 0UL;
169
170 if(uspi == USPI0)
171 {
172 u32Pclk = CLK_GetPCLK0Freq();
173 }
174
175 u32ClkDiv = (uint32_t)((((((u32Pclk / 2ul) * 10ul) / (u32BusClock)) + 5ul) / 10ul) - 1ul); /* Compute proper divider for USCI_SPI clock */
176
177 /* Set USCI_SPI bus clock */
178 uspi->BRGEN &= ~USPI_BRGEN_CLKDIV_Msk;
179 uspi->BRGEN |= (u32ClkDiv << USPI_BRGEN_CLKDIV_Pos);
180
181 return (u32Pclk / ((u32ClkDiv + 1ul) << 1));
182 }
183
184 /**
185 * @brief Get the actual frequency of USCI_SPI bus clock. Only available in Master mode.
186 * @param[in] uspi The pointer of the specified USCI_SPI module.
187 * @return Actual USCI_SPI bus clock frequency.
188 */
USPI_GetBusClock(USPI_T * uspi)189 uint32_t USPI_GetBusClock(USPI_T *uspi)
190 {
191 uint32_t u32BusClk = 0UL;
192 uint32_t u32ClkDiv;
193
194 u32ClkDiv = (uspi->BRGEN & USPI_BRGEN_CLKDIV_Msk) >> USPI_BRGEN_CLKDIV_Pos;
195
196 if(uspi == USPI0)
197 {
198 u32BusClk = (uint32_t)(CLK_GetPCLK0Freq() / ((u32ClkDiv + 1ul) << 1));
199 }
200
201 return u32BusClk;
202 }
203
204 /**
205 * @brief Enable related interrupts specified by u32Mask parameter.
206 * @param[in] uspi The pointer of the specified USCI_SPI module.
207 * @param[in] u32Mask The combination of all related interrupt enable bits.
208 * Each bit corresponds to a interrupt bit.
209 * This parameter decides which interrupts will be enabled. Valid values are:
210 * - \ref USPI_SSINACT_INT_MASK
211 * - \ref USPI_SSACT_INT_MASK
212 * - \ref USPI_SLVTO_INT_MASK
213 * - \ref USPI_SLVBE_INT_MASK
214 * - \ref USPI_TXUDR_INT_MASK
215 * - \ref USPI_RXOV_INT_MASK
216 * - \ref USPI_TXST_INT_MASK
217 * - \ref USPI_TXEND_INT_MASK
218 * - \ref USPI_RXST_INT_MASK
219 * - \ref USPI_RXEND_INT_MASK
220 * @return None
221 */
USPI_EnableInt(USPI_T * uspi,uint32_t u32Mask)222 void USPI_EnableInt(USPI_T *uspi, uint32_t u32Mask)
223 {
224 /* Enable slave selection signal inactive interrupt flag */
225 if((u32Mask & USPI_SSINACT_INT_MASK) == USPI_SSINACT_INT_MASK)
226 {
227 uspi->PROTIEN |= USPI_PROTIEN_SSINAIEN_Msk;
228 }
229 else {}
230
231 /* Enable slave selection signal active interrupt flag */
232 if((u32Mask & USPI_SSACT_INT_MASK) == USPI_SSACT_INT_MASK)
233 {
234 uspi->PROTIEN |= USPI_PROTIEN_SSACTIEN_Msk;
235 }
236 else {}
237
238 /* Enable slave time-out interrupt flag */
239 if((u32Mask & USPI_SLVTO_INT_MASK) == USPI_SLVTO_INT_MASK)
240 {
241 uspi->PROTIEN |= USPI_PROTIEN_SLVTOIEN_Msk;
242 }
243 else {}
244
245 /* Enable slave bit count error interrupt flag */
246 if((u32Mask & USPI_SLVBE_INT_MASK) == USPI_SLVBE_INT_MASK)
247 {
248 uspi->PROTIEN |= USPI_PROTIEN_SLVBEIEN_Msk;
249 }
250 else {}
251
252 /* Enable TX under run interrupt flag */
253 if((u32Mask & USPI_TXUDR_INT_MASK) == USPI_TXUDR_INT_MASK)
254 {
255 uspi->BUFCTL |= USPI_BUFCTL_TXUDRIEN_Msk;
256 }
257 else {}
258
259 /* Enable RX overrun interrupt flag */
260 if((u32Mask & USPI_RXOV_INT_MASK) == USPI_RXOV_INT_MASK)
261 {
262 uspi->BUFCTL |= USPI_BUFCTL_RXOVIEN_Msk;
263 }
264 else {}
265
266 /* Enable TX start interrupt flag */
267 if((u32Mask & USPI_TXST_INT_MASK) == USPI_TXST_INT_MASK)
268 {
269 uspi->INTEN |= USPI_INTEN_TXSTIEN_Msk;
270 }
271 else {}
272
273 /* Enable TX end interrupt flag */
274 if((u32Mask & USPI_TXEND_INT_MASK) == USPI_TXEND_INT_MASK)
275 {
276 uspi->INTEN |= USPI_INTEN_TXENDIEN_Msk;
277 }
278 else {}
279
280 /* Enable RX start interrupt flag */
281 if((u32Mask & USPI_RXST_INT_MASK) == USPI_RXST_INT_MASK)
282 {
283 uspi->INTEN |= USPI_INTEN_RXSTIEN_Msk;
284 }
285 else {}
286
287 /* Enable RX end interrupt flag */
288 if((u32Mask & USPI_RXEND_INT_MASK) == USPI_RXEND_INT_MASK)
289 {
290 uspi->INTEN |= USPI_INTEN_RXENDIEN_Msk;
291 }
292 else {}
293 }
294
295 /**
296 * @brief Disable related interrupts specified by u32Mask parameter.
297 * @param[in] uspi The pointer of the specified USCI_SPI module.
298 * @param[in] u32Mask The combination of all related interrupt enable bits.
299 * Each bit corresponds to a interrupt bit.
300 * This parameter decides which interrupts will be disabled. Valid values are:
301 * - \ref USPI_SSINACT_INT_MASK
302 * - \ref USPI_SSACT_INT_MASK
303 * - \ref USPI_SLVTO_INT_MASK
304 * - \ref USPI_SLVBE_INT_MASK
305 * - \ref USPI_TXUDR_INT_MASK
306 * - \ref USPI_RXOV_INT_MASK
307 * - \ref USPI_TXST_INT_MASK
308 * - \ref USPI_TXEND_INT_MASK
309 * - \ref USPI_RXST_INT_MASK
310 * - \ref USPI_RXEND_INT_MASK
311 * @return None
312 */
USPI_DisableInt(USPI_T * uspi,uint32_t u32Mask)313 void USPI_DisableInt(USPI_T *uspi, uint32_t u32Mask)
314 {
315 /* Disable slave selection signal inactive interrupt flag */
316 if((u32Mask & USPI_SSINACT_INT_MASK) == USPI_SSINACT_INT_MASK)
317 {
318 uspi->PROTIEN &= ~USPI_PROTIEN_SSINAIEN_Msk;
319 }
320 else {}
321
322 /* Disable slave selection signal active interrupt flag */
323 if((u32Mask & USPI_SSACT_INT_MASK) == USPI_SSACT_INT_MASK)
324 {
325 uspi->PROTIEN &= ~USPI_PROTIEN_SSACTIEN_Msk;
326 }
327 else {}
328
329 /* Disable slave time-out interrupt flag */
330 if((u32Mask & USPI_SLVTO_INT_MASK) == USPI_SLVTO_INT_MASK)
331 {
332 uspi->PROTIEN &= ~USPI_PROTIEN_SLVTOIEN_Msk;
333 }
334 else {}
335
336 /* Disable slave bit count error interrupt flag */
337 if((u32Mask & USPI_SLVBE_INT_MASK) == USPI_SLVBE_INT_MASK)
338 {
339 uspi->PROTIEN &= ~USPI_PROTIEN_SLVBEIEN_Msk;
340 }
341 else {}
342
343 /* Disable TX under run interrupt flag */
344 if((u32Mask & USPI_TXUDR_INT_MASK) == USPI_TXUDR_INT_MASK)
345 {
346 uspi->BUFCTL &= ~USPI_BUFCTL_TXUDRIEN_Msk;
347 }
348 else {}
349
350 /* Disable RX overrun interrupt flag */
351 if((u32Mask & USPI_RXOV_INT_MASK) == USPI_RXOV_INT_MASK)
352 {
353 uspi->BUFCTL &= ~USPI_BUFCTL_RXOVIEN_Msk;
354 }
355 else {}
356
357 /* Disable TX start interrupt flag */
358 if((u32Mask & USPI_TXST_INT_MASK) == USPI_TXST_INT_MASK)
359 {
360 uspi->INTEN &= ~USPI_INTEN_TXSTIEN_Msk;
361 }
362 else {}
363
364 /* Disable TX end interrupt flag */
365 if((u32Mask & USPI_TXEND_INT_MASK) == USPI_TXEND_INT_MASK)
366 {
367 uspi->INTEN &= ~USPI_INTEN_TXENDIEN_Msk;
368 }
369 else {}
370
371 /* Disable RX start interrupt flag */
372 if((u32Mask & USPI_RXST_INT_MASK) == USPI_RXST_INT_MASK)
373 {
374 uspi->INTEN &= ~USPI_INTEN_RXSTIEN_Msk;
375 }
376 else {}
377
378 /* Disable RX end interrupt flag */
379 if((u32Mask & USPI_RXEND_INT_MASK) == USPI_RXEND_INT_MASK)
380 {
381 uspi->INTEN &= ~USPI_INTEN_RXENDIEN_Msk;
382 }
383 else {}
384 }
385
386 /**
387 * @brief Get interrupt flag.
388 * @param[in] uspi The pointer of the specified USCI_SPI module.
389 * @param[in] u32Mask The combination of all related interrupt sources.
390 * Each bit corresponds to a interrupt source.
391 * This parameter decides which interrupt flags will be read. It is combination of:
392 * - \ref USPI_SSINACT_INT_MASK
393 * - \ref USPI_SSACT_INT_MASK
394 * - \ref USPI_SLVTO_INT_MASK
395 * - \ref USPI_SLVBE_INT_MASK
396 * - \ref USPI_TXUDR_INT_MASK
397 * - \ref USPI_RXOV_INT_MASK
398 * - \ref USPI_TXST_INT_MASK
399 * - \ref USPI_TXEND_INT_MASK
400 * - \ref USPI_RXST_INT_MASK
401 * - \ref USPI_RXEND_INT_MASK
402 * @return Interrupt flags of selected sources.
403 */
USPI_GetIntFlag(USPI_T * uspi,uint32_t u32Mask)404 uint32_t USPI_GetIntFlag(USPI_T *uspi, uint32_t u32Mask)
405 {
406 uint32_t u32TmpFlag;
407 uint32_t u32IntFlag = 0ul;
408
409 /* Check slave selection signal inactive interrupt flag */
410 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_SSINAIF_Msk;
411 if(((u32Mask & USPI_SSINACT_INT_MASK) == USPI_SSINACT_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_SSINAIF_Msk))
412 {
413 u32IntFlag |= USPI_SSINACT_INT_MASK;
414 }
415 else {}
416
417 /* Check slave selection signal active interrupt flag */
418 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_SSACTIF_Msk;
419 if(((u32Mask & USPI_SSACT_INT_MASK) == USPI_SSACT_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_SSACTIF_Msk))
420 {
421 u32IntFlag |= USPI_SSACT_INT_MASK;
422 }
423 else {}
424
425 /* Check slave time-out interrupt flag */
426 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_SLVTOIF_Msk;
427 if(((u32Mask & USPI_SLVTO_INT_MASK) == USPI_SLVTO_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_SLVTOIF_Msk))
428 {
429 u32IntFlag |= USPI_SLVTO_INT_MASK;
430 }
431 else {}
432
433 /* Check slave bit count error interrupt flag */
434 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_SLVBEIF_Msk;
435 if(((u32Mask & USPI_SLVBE_INT_MASK) == USPI_SLVBE_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_SLVBEIF_Msk))
436 {
437 u32IntFlag |= USPI_SLVBE_INT_MASK;
438 }
439 else {}
440
441 /* Check TX under run interrupt flag */
442 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_TXUDRIF_Msk;
443 if(((u32Mask & USPI_TXUDR_INT_MASK) == USPI_TXUDR_INT_MASK) && (u32TmpFlag == USPI_BUFSTS_TXUDRIF_Msk))
444 {
445 u32IntFlag |= USPI_TXUDR_INT_MASK;
446 }
447 else {}
448
449 /* Check RX overrun interrupt flag */
450 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_RXOVIF_Msk;
451 if(((u32Mask & USPI_RXOV_INT_MASK) == USPI_RXOV_INT_MASK) && (u32TmpFlag == USPI_BUFSTS_RXOVIF_Msk))
452 {
453 u32IntFlag |= USPI_RXOV_INT_MASK;
454 }
455 else {}
456
457 /* Check TX start interrupt flag */
458 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_TXSTIF_Msk;
459 if(((u32Mask & USPI_TXST_INT_MASK) == USPI_TXST_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_TXSTIF_Msk))
460 {
461 u32IntFlag |= USPI_TXST_INT_MASK;
462 }
463 else {}
464
465 /* Check TX end interrupt flag */
466 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_TXENDIF_Msk;
467 if(((u32Mask & USPI_TXEND_INT_MASK) == USPI_TXEND_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_TXENDIF_Msk))
468 {
469 u32IntFlag |= USPI_TXEND_INT_MASK;
470 }
471 else {}
472
473 /* Check RX start interrupt flag */
474 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_RXSTIF_Msk;
475 if(((u32Mask & USPI_RXST_INT_MASK) == USPI_RXST_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_RXSTIF_Msk))
476 {
477 u32IntFlag |= USPI_RXST_INT_MASK;
478 }
479 else {}
480
481 /* Check RX end interrupt flag */
482 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_RXENDIF_Msk;
483 if(((u32Mask & USPI_RXEND_INT_MASK) == USPI_RXEND_INT_MASK) && (u32TmpFlag == USPI_PROTSTS_RXENDIF_Msk))
484 {
485 u32IntFlag |= USPI_RXEND_INT_MASK;
486 }
487 else {}
488
489 return u32IntFlag;
490 }
491
492 /**
493 * @brief Clear interrupt flag.
494 * @param[in] uspi The pointer of the specified USCI_SPI module.
495 * @param[in] u32Mask The combination of all related interrupt sources.
496 * Each bit corresponds to a interrupt source.
497 * This parameter decides which interrupt flags will be cleared. It could be the combination of:
498 * - \ref USPI_SSINACT_INT_MASK
499 * - \ref USPI_SSACT_INT_MASK
500 * - \ref USPI_SLVTO_INT_MASK
501 * - \ref USPI_SLVBE_INT_MASK
502 * - \ref USPI_TXUDR_INT_MASK
503 * - \ref USPI_RXOV_INT_MASK
504 * - \ref USPI_TXST_INT_MASK
505 * - \ref USPI_TXEND_INT_MASK
506 * - \ref USPI_RXST_INT_MASK
507 * - \ref USPI_RXEND_INT_MASK
508 * @return None
509 */
USPI_ClearIntFlag(USPI_T * uspi,uint32_t u32Mask)510 void USPI_ClearIntFlag(USPI_T *uspi, uint32_t u32Mask)
511 {
512 /* Clear slave selection signal inactive interrupt flag */
513 if((u32Mask & USPI_SSINACT_INT_MASK) == USPI_SSINACT_INT_MASK)
514 {
515 uspi->PROTSTS = USPI_PROTSTS_SSINAIF_Msk;
516 }
517 else {}
518
519 /* Clear slave selection signal active interrupt flag */
520 if((u32Mask & USPI_SSACT_INT_MASK) == USPI_SSACT_INT_MASK)
521 {
522 uspi->PROTSTS = USPI_PROTSTS_SSACTIF_Msk;
523 }
524 else {}
525
526 /* Clear slave time-out interrupt flag */
527 if((u32Mask & USPI_SLVTO_INT_MASK) == USPI_SLVTO_INT_MASK)
528 {
529 uspi->PROTSTS = USPI_PROTSTS_SLVTOIF_Msk;
530 }
531 else {}
532
533 /* Clear slave bit count error interrupt flag */
534 if((u32Mask & USPI_SLVBE_INT_MASK) == USPI_SLVBE_INT_MASK)
535 {
536 uspi->PROTSTS = USPI_PROTSTS_SLVBEIF_Msk;
537 }
538 else {}
539
540 /* Clear TX under run interrupt flag */
541 if((u32Mask & USPI_TXUDR_INT_MASK) == USPI_TXUDR_INT_MASK)
542 {
543 uspi->BUFSTS = USPI_BUFSTS_TXUDRIF_Msk;
544 }
545 else {}
546
547 /* Clear RX overrun interrupt flag */
548 if((u32Mask & USPI_RXOV_INT_MASK) == USPI_RXOV_INT_MASK)
549 {
550 uspi->BUFSTS = USPI_BUFSTS_RXOVIF_Msk;
551 }
552 else {}
553
554 /* Clear TX start interrupt flag */
555 if((u32Mask & USPI_TXST_INT_MASK) == USPI_TXST_INT_MASK)
556 {
557 uspi->PROTSTS = USPI_PROTSTS_TXSTIF_Msk;
558 }
559 else {}
560
561 /* Clear TX end interrupt flag */
562 if((u32Mask & USPI_TXEND_INT_MASK) == USPI_TXEND_INT_MASK)
563 {
564 uspi->PROTSTS = USPI_PROTSTS_TXENDIF_Msk;
565 }
566 else {}
567
568 /* Clear RX start interrupt flag */
569 if((u32Mask & USPI_RXST_INT_MASK) == USPI_RXST_INT_MASK)
570 {
571 uspi->PROTSTS = USPI_PROTSTS_RXSTIF_Msk;
572 }
573 else {}
574
575 /* Clear RX end interrupt flag */
576 if((u32Mask & USPI_RXEND_INT_MASK) == USPI_RXEND_INT_MASK)
577 {
578 uspi->PROTSTS = USPI_PROTSTS_RXENDIF_Msk;
579 }
580 else {}
581 }
582
583 /**
584 * @brief Get USCI_SPI status.
585 * @param[in] uspi The pointer of the specified USCI_SPI module.
586 * @param[in] u32Mask The combination of all related sources.
587 * Each bit corresponds to a source.
588 * This parameter decides which flags will be read. It is combination of:
589 * - \ref USPI_BUSY_MASK
590 * - \ref USPI_RX_EMPTY_MASK
591 * - \ref USPI_RX_FULL_MASK
592 * - \ref USPI_TX_EMPTY_MASK
593 * - \ref USPI_TX_FULL_MASK
594 * - \ref USPI_SSLINE_STS_MASK
595 * @return Flags of selected sources.
596 */
USPI_GetStatus(USPI_T * uspi,uint32_t u32Mask)597 uint32_t USPI_GetStatus(USPI_T *uspi, uint32_t u32Mask)
598 {
599 uint32_t u32Flag = 0ul;
600 uint32_t u32TmpFlag;
601
602 /* Check busy status */
603 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_BUSY_Msk;
604 if(((u32Mask & USPI_BUSY_MASK) == USPI_BUSY_MASK) && (u32TmpFlag & USPI_PROTSTS_BUSY_Msk))
605 {
606 u32Flag |= USPI_BUSY_MASK;
607 }
608 else {}
609
610 /* Check RX empty flag */
611 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_RXEMPTY_Msk;
612 if(((u32Mask & USPI_RX_EMPTY_MASK) == USPI_RX_EMPTY_MASK) && (u32TmpFlag == USPI_BUFSTS_RXEMPTY_Msk))
613 {
614 u32Flag |= USPI_RX_EMPTY_MASK;
615 }
616 else {}
617
618 /* Check RX full flag */
619 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_RXFULL_Msk;
620 if(((u32Mask & USPI_RX_FULL_MASK) == USPI_RX_FULL_MASK) && (u32TmpFlag == USPI_BUFSTS_RXFULL_Msk))
621 {
622 u32Flag |= USPI_RX_FULL_MASK;
623 }
624 else {}
625
626 /* Check TX empty flag */
627 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_TXEMPTY_Msk;
628 if(((u32Mask & USPI_TX_EMPTY_MASK) == USPI_TX_EMPTY_MASK) && (u32TmpFlag == USPI_BUFSTS_TXEMPTY_Msk))
629 {
630 u32Flag |= USPI_TX_EMPTY_MASK;
631 }
632 else {}
633
634 /* Check TX full flag */
635 u32TmpFlag = uspi->BUFSTS & USPI_BUFSTS_TXFULL_Msk;
636 if(((u32Mask & USPI_TX_FULL_MASK) == USPI_TX_FULL_MASK) && (u32TmpFlag == USPI_BUFSTS_TXFULL_Msk))
637 {
638 u32Flag |= USPI_TX_FULL_MASK;
639 }
640 else {}
641
642 /* Check USCI_SPI_SS line status */
643 u32TmpFlag = uspi->PROTSTS & USPI_PROTSTS_SSLINE_Msk;
644 if(((u32Mask & USPI_SSLINE_STS_MASK) == USPI_SSLINE_STS_MASK) && (u32TmpFlag & USPI_PROTSTS_SSLINE_Msk))
645 {
646 u32Flag |= USPI_SSLINE_STS_MASK;
647 }
648 else {}
649
650 return u32Flag;
651 }
652
653 /**
654 * @brief Enable USCI_SPI Wake-up Function.
655 * @param[in] uspi The pointer of the specified USCI_SPI module.
656 * @return None
657 */
USPI_EnableWakeup(USPI_T * uspi)658 void USPI_EnableWakeup(USPI_T *uspi)
659 {
660 uspi->WKCTL |= USPI_WKCTL_WKEN_Msk;
661 }
662
663 /**
664 * @brief Disable USCI_SPI Wake-up Function.
665 * @param[in] uspi The pointer of the specified USCI_SPI module.
666 * @return None
667 */
USPI_DisableWakeup(USPI_T * uspi)668 void USPI_DisableWakeup(USPI_T *uspi)
669 {
670 uspi->WKCTL &= ~USPI_WKCTL_WKEN_Msk;
671 }
672
673 /*@}*/ /* end of group USCI_SPI_EXPORTED_FUNCTIONS */
674
675 /*@}*/ /* end of group USCI_SPI_Driver */
676
677 /*@}*/ /* end of group Standard_Driver */
678