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