MSPM0GX51X Driver Library  2.05.01.00
dl_spi.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /*!****************************************************************************
33  * @file dl_spi.h
34  * @brief SPI Driver Library
35  * @defgroup SPI Serial Peripheral Interface (SPI)
36  *
37  * @anchor ti_dl_dl_spi_Overview
38  * # Overview
39  *
40  * The Serial Peripheral Interface Driver Library allows full configuration of
41  * the MSPM0 SPI module.
42  * The serial peripheral interface (SPI) module provides a standardized
43  * serial interface to transfer data between MSPM0 devices and other external
44  * devices with SPI interface.
45  *
46  * <hr>
47  ******************************************************************************
48  */
52 #ifndef ti_dl_dl_spi__include
53 #define ti_dl_dl_spi__include
54 
55 #include <stdbool.h>
56 #include <stdint.h>
57 
58 #include <ti/devices/msp/msp.h>
59 #include <ti/driverlib/dl_common.h>
60 
61 #ifdef __MSPM0_HAS_SPI__
62 
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66 
67 /* clang-format off */
68 
75 #define DL_SPI_CD_MODE_DATA (SPI_CTL1_CDMODE_DATA >> SPI_CTL1_CDMODE_OFS)
76 
80 #define DL_SPI_CD_MODE_COMMAND (SPI_CTL1_CDMODE_COMMAND >> SPI_CTL1_CDMODE_OFS)
81 
82 
92 #define DL_SPI_INTERRUPT_DMA_DONE_TX (SPI_CPU_INT_IMASK_DMA_DONE_TX_SET)
93 
97 #define DL_SPI_INTERRUPT_DMA_DONE_RX (SPI_CPU_INT_IMASK_DMA_DONE_RX_SET)
98 
101 #define DL_SPI_INTERRUPT_IDLE (SPI_CPU_INT_IMASK_IDLE_SET)
102 
106 #define DL_SPI_INTERRUPT_TX_EMPTY (SPI_CPU_INT_IMASK_TXEMPTY_SET)
107 
111 #define DL_SPI_INTERRUPT_TX (SPI_CPU_INT_IMASK_TX_SET)
112 
116 #define DL_SPI_INTERRUPT_RX (SPI_CPU_INT_IMASK_RX_SET)
117 
121 #define DL_SPI_INTERRUPT_RX_TIMEOUT (SPI_CPU_INT_IMASK_RTOUT_SET)
122 
126 #define DL_SPI_INTERRUPT_RX_FULL (SPI_CPU_INT_IMASK_RXFULL_SET)
127 
131 #define DL_SPI_INTERRUPT_TX_UNDERFLOW (SPI_CPU_INT_IMASK_TXFIFO_UNF_SET)
132 
136 #define DL_SPI_INTERRUPT_PARITY_ERROR (SPI_CPU_INT_IMASK_PER_SET)
137 
141 #define DL_SPI_INTERRUPT_RX_OVERFLOW (SPI_CPU_INT_IMASK_RXFIFO_OVF_SET)
142 
146 typedef enum {
148  DL_SPI_DMA_IIDX_RX_TRIGGER = SPI_DMA_TRIG_RX_IIDX_STAT_RX_EVT,
150  DL_SPI_DMA_IIDX_RX_TIMEOUT_TRIGGER = SPI_DMA_TRIG_RX_IIDX_STAT_RTOUT_EVT
151 } DL_SPI_DMA_IIDX_RX;
152 
154 typedef enum {
156  DL_SPI_DMA_IIDX_TX_TRIGGER = SPI_DMA_TRIG_TX_IIDX_STAT_TX_EVT
157 } DL_SPI_DMA_IIDX_TX;
158 
165 #define DL_SPI_DMA_INTERRUPT_RX (SPI_DMA_TRIG_RX_IMASK_RX_SET)
166 
170 #define DL_SPI_DMA_INTERRUPT_RX_TIMEOUT (SPI_DMA_TRIG_RX_IMASK_RTOUT_SET)
171 
177 #define DL_SPI_DMA_INTERRUPT_TX (SPI_DMA_TRIG_TX_IMASK_TX_SET)
178 
179 /* clang-format on */
180 
182 typedef enum {
184  DL_SPI_PARITY_EVEN =
185  (SPI_CTL1_PES_ENABLE | SPI_CTL1_PREN_ENABLE | SPI_CTL1_PTEN_ENABLE),
187  DL_SPI_PARITY_ODD =
188  (SPI_CTL1_PES_DISABLE | SPI_CTL1_PREN_ENABLE | SPI_CTL1_PTEN_ENABLE),
190  DL_SPI_PARITY_NONE = (SPI_CTL1_PREN_DISABLE | SPI_CTL1_PTEN_DISABLE)
191 } DL_SPI_PARITY;
192 
194 typedef enum {
196  DL_SPI_FRAME_FORMAT_MOTO3_POL0_PHA0 =
197  (SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_3WIRE),
199  DL_SPI_FRAME_FORMAT_MOTO3_POL0_PHA1 =
200  (SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_SECOND | SPI_CTL0_FRF_MOTOROLA_3WIRE),
202  DL_SPI_FRAME_FORMAT_MOTO3_POL1_PHA0 =
203  (SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_3WIRE),
205  DL_SPI_FRAME_FORMAT_MOTO3_POL1_PHA1 =
206  (SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_SECOND |
207  SPI_CTL0_FRF_MOTOROLA_3WIRE),
209  DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0 =
210  (SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_4WIRE),
212  DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA1 =
213  (SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_SECOND | SPI_CTL0_FRF_MOTOROLA_4WIRE),
215  DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA0 =
216  (SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_4WIRE),
218  DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA1 =
219  (SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_SECOND |
220  SPI_CTL0_FRF_MOTOROLA_4WIRE),
222  DL_SPI_FRAME_FORMAT_TI_SYNC = (SPI_CTL0_FRF_TI_SYNC),
223 } DL_SPI_FRAME_FORMAT;
224 
226 typedef enum {
228  DL_SPI_MODE_CONTROLLER = (SPI_CTL1_CP_ENABLE),
230  DL_SPI_MODE_PERIPHERAL = (SPI_CTL1_CP_DISABLE)
231 } DL_SPI_MODE;
232 
234 typedef enum {
236  DL_SPI_BIT_ORDER_MSB_FIRST = (SPI_CTL1_MSB_ENABLE),
238  DL_SPI_BIT_ORDER_LSB_FIRST = (SPI_CTL1_MSB_DISABLE)
239 } DL_SPI_BIT_ORDER;
240 
242 typedef enum {
244  DL_SPI_DATA_SIZE_4 = (SPI_CTL0_DSS_DSS_4),
246  DL_SPI_DATA_SIZE_5 = (SPI_CTL0_DSS_DSS_5),
248  DL_SPI_DATA_SIZE_6 = (SPI_CTL0_DSS_DSS_6),
250  DL_SPI_DATA_SIZE_7 = (SPI_CTL0_DSS_DSS_7),
252  DL_SPI_DATA_SIZE_8 = (SPI_CTL0_DSS_DSS_8),
254  DL_SPI_DATA_SIZE_9 = (SPI_CTL0_DSS_DSS_9),
256  DL_SPI_DATA_SIZE_10 = (SPI_CTL0_DSS_DSS_10),
258  DL_SPI_DATA_SIZE_11 = (SPI_CTL0_DSS_DSS_11),
260  DL_SPI_DATA_SIZE_12 = (SPI_CTL0_DSS_DSS_12),
262  DL_SPI_DATA_SIZE_13 = (SPI_CTL0_DSS_DSS_13),
264  DL_SPI_DATA_SIZE_14 = (SPI_CTL0_DSS_DSS_14),
266  DL_SPI_DATA_SIZE_15 = (SPI_CTL0_DSS_DSS_15),
268  DL_SPI_DATA_SIZE_16 = (SPI_CTL0_DSS_DSS_16),
269 } DL_SPI_DATA_SIZE;
270 
272 typedef enum {
274  DL_SPI_CHIP_SELECT_0 = (SPI_CTL0_CSSEL_CSSEL_0),
276  DL_SPI_CHIP_SELECT_1 = (SPI_CTL0_CSSEL_CSSEL_1),
278  DL_SPI_CHIP_SELECT_2 = (SPI_CTL0_CSSEL_CSSEL_2),
280  DL_SPI_CHIP_SELECT_3 = (SPI_CTL0_CSSEL_CSSEL_3),
282  DL_SPI_CHIP_SELECT_NONE = (0)
283 } DL_SPI_CHIP_SELECT;
284 
286 typedef enum {
288  DL_SPI_TX_FIFO_LEVEL_3_4_EMPTY = SPI_IFLS_TXIFLSEL_LVL_3_4,
290  DL_SPI_TX_FIFO_LEVEL_1_2_EMPTY = SPI_IFLS_TXIFLSEL_LVL_1_2,
292  DL_SPI_TX_FIFO_LEVEL_1_4_EMPTY = SPI_IFLS_TXIFLSEL_LVL_1_4,
294  DL_SPI_TX_FIFO_LEVEL_EMPTY = SPI_IFLS_TXIFLSEL_LVL_EMPTY,
296  DL_SPI_TX_FIFO_LEVEL_ONE_FRAME = SPI_IFLS_TXIFLSEL_LEVEL_1
297 } DL_SPI_TX_FIFO_LEVEL;
298 
300 typedef enum {
302  DL_SPI_RX_FIFO_LEVEL_ONE_FRAME = SPI_IFLS_RXIFLSEL_LEVEL_1,
304  DL_SPI_RX_FIFO_LEVEL_FULL = SPI_IFLS_RXIFLSEL_LVL_FULL,
306  DL_SPI_RX_FIFO_LEVEL_3_4_FULL = SPI_IFLS_RXIFLSEL_LVL_3_4,
308  DL_SPI_RX_FIFO_LEVEL_1_2_FULL = SPI_IFLS_RXIFLSEL_LVL_1_2,
310  DL_SPI_RX_FIFO_LEVEL_1_4_FULL = SPI_IFLS_RXIFLSEL_LVL_1_4,
311 } DL_SPI_RX_FIFO_LEVEL;
312 
314 typedef enum {
315 
317  DL_SPI_IIDX_DMA_DONE_TX = SPI_CPU_INT_IIDX_STAT_DMA_DONE_TX_EVT,
319  DL_SPI_IIDX_DMA_DONE_RX = SPI_CPU_INT_IIDX_STAT_DMA_DONE_RX_EVT,
323  DL_SPI_IIDX_IDLE = SPI_CPU_INT_IIDX_STAT_IDLE_EVT,
325  DL_SPI_IIDX_TX_EMPTY = SPI_CPU_INT_IIDX_STAT_TX_EMPTY,
327  DL_SPI_IIDX_TX = SPI_CPU_INT_IIDX_STAT_TX_EVT,
329  DL_SPI_IIDX_RX = SPI_CPU_INT_IIDX_STAT_RX_EVT,
331  DL_SPI_IIDX_RX_TIMEOUT = SPI_CPU_INT_IIDX_STAT_RTOUT_EVT,
332 
334  DL_SPI_IIDX_RX_FULL = SPI_CPU_INT_IIDX_STAT_RXFULL_EVT,
336  DL_SPI_IIDX_TX_UNDERFLOW = SPI_CPU_INT_IIDX_STAT_TXFIFO_UNF_EVT,
337 
339  DL_SPI_IIDX_PARITY_ERROR = SPI_CPU_INT_IIDX_STAT_PER_EVT,
341  DL_SPI_IIDX_RX_OVERFLOW = SPI_CPU_INT_IIDX_STAT_RXFIFO_OFV_EVT
342 } DL_SPI_IIDX;
343 
345 typedef enum {
347  DL_SPI_CLOCK_DIVIDE_RATIO_1 = SPI_CLKDIV_RATIO_DIV_BY_1,
349  DL_SPI_CLOCK_DIVIDE_RATIO_2 = SPI_CLKDIV_RATIO_DIV_BY_2,
351  DL_SPI_CLOCK_DIVIDE_RATIO_3 = SPI_CLKDIV_RATIO_DIV_BY_3,
353  DL_SPI_CLOCK_DIVIDE_RATIO_4 = SPI_CLKDIV_RATIO_DIV_BY_4,
355  DL_SPI_CLOCK_DIVIDE_RATIO_5 = SPI_CLKDIV_RATIO_DIV_BY_5,
357  DL_SPI_CLOCK_DIVIDE_RATIO_6 = SPI_CLKDIV_RATIO_DIV_BY_6,
359  DL_SPI_CLOCK_DIVIDE_RATIO_7 = SPI_CLKDIV_RATIO_DIV_BY_7,
361  DL_SPI_CLOCK_DIVIDE_RATIO_8 = SPI_CLKDIV_RATIO_DIV_BY_8
362 } DL_SPI_CLOCK_DIVIDE_RATIO;
363 
365 typedef enum {
367  DL_SPI_CLOCK_BUSCLK = SPI_CLKSEL_SYSCLK_SEL_ENABLE,
369  DL_SPI_CLOCK_MFCLK = SPI_CLKSEL_MFCLK_SEL_ENABLE,
371  DL_SPI_CLOCK_LFCLK = SPI_CLKSEL_LFCLK_SEL_ENABLE
372 } DL_SPI_CLOCK;
373 
377 typedef struct {
379  DL_SPI_MODE mode;
380 
385  DL_SPI_FRAME_FORMAT frameFormat;
386 
391  DL_SPI_PARITY parity;
392 
394  DL_SPI_DATA_SIZE dataSize;
395 
397  DL_SPI_BIT_ORDER bitOrder;
398 
403  DL_SPI_CHIP_SELECT chipSelectPin;
404 
405 } DL_SPI_Config;
406 
410 typedef struct {
412  DL_SPI_CLOCK clockSel;
413 
415  DL_SPI_CLOCK_DIVIDE_RATIO divideRatio;
416 
417 } DL_SPI_ClockConfig;
418 
424 typedef struct {
429  uint32_t controlWord0;
430 
435  uint32_t controlWord1;
436 
439  uint32_t clockControl;
440 
442  uint32_t clockSel;
443 
445  uint32_t divideRatio;
446 
450  uint32_t interruptFifoLevelSelectWord;
451 
454  uint32_t interruptMask0;
455 
458  uint32_t interruptMask1;
459 
462  uint32_t interruptMask2;
463 
466  bool backupRdy;
467 } DL_SPI_backupConfig;
468 
479 void DL_SPI_init(SPI_Regs *spi, const DL_SPI_Config *config);
480 
492 __STATIC_INLINE void DL_SPI_enablePower(SPI_Regs *spi)
493 {
494  spi->GPRCM.PWREN = (SPI_PWREN_KEY_UNLOCK_W | SPI_PWREN_ENABLE_ENABLE);
495 }
496 
508 __STATIC_INLINE void DL_SPI_disablePower(SPI_Regs *spi)
509 {
510  spi->GPRCM.PWREN = (SPI_PWREN_KEY_UNLOCK_W | SPI_PWREN_ENABLE_DISABLE);
511 }
512 
529 __STATIC_INLINE bool DL_SPI_isPowerEnabled(const SPI_Regs *spi)
530 {
531  return (
532  (spi->GPRCM.PWREN & SPI_PWREN_ENABLE_MASK) == SPI_PWREN_ENABLE_ENABLE);
533 }
534 
540 __STATIC_INLINE void DL_SPI_reset(SPI_Regs *spi)
541 {
542  spi->GPRCM.RSTCTL =
543  (SPI_RSTCTL_KEY_UNLOCK_W | SPI_RSTCTL_RESETSTKYCLR_CLR |
544  SPI_RSTCTL_RESETASSERT_ASSERT);
545 }
546 
556 __STATIC_INLINE bool DL_SPI_isReset(const SPI_Regs *spi)
557 {
558  return ((spi->GPRCM.STAT & SPI_GPRCM_STAT_RESETSTKY_MASK) ==
559  SPI_GPRCM_STAT_RESETSTKY_RESET);
560 }
561 
567 __STATIC_INLINE void DL_SPI_enable(SPI_Regs *spi)
568 {
569  spi->CTL1 |= SPI_CTL1_ENABLE_ENABLE;
570 }
571 
582 __STATIC_INLINE bool DL_SPI_isEnabled(const SPI_Regs *spi)
583 {
584  return ((spi->CTL1 & SPI_CTL1_ENABLE_MASK) == SPI_CTL1_ENABLE_ENABLE);
585 }
586 
592 __STATIC_INLINE void DL_SPI_disable(SPI_Regs *spi)
593 {
594  spi->CTL1 &= ~(SPI_CTL1_ENABLE_MASK);
595 }
596 
605 void DL_SPI_setClockConfig(SPI_Regs *spi, const DL_SPI_ClockConfig *config);
606 
615 void DL_SPI_getClockConfig(const SPI_Regs *spi, DL_SPI_ClockConfig *config);
616 
627 __STATIC_INLINE bool DL_SPI_isBusy(const SPI_Regs *spi)
628 {
629  return ((spi->STAT & SPI_STAT_BUSY_MASK) == SPI_STAT_BUSY_ACTIVE);
630 }
631 
642 __STATIC_INLINE bool DL_SPI_isTXFIFOEmpty(const SPI_Regs *spi)
643 {
644  return ((spi->STAT & SPI_STAT_TFE_MASK) == SPI_STAT_TFE_EMPTY);
645 }
646 
657 __STATIC_INLINE bool DL_SPI_isTXFIFOFull(const SPI_Regs *spi)
658 {
659  return ((spi->STAT & SPI_STAT_TNF_MASK) == SPI_STAT_TNF_FULL);
660 }
661 
672 __STATIC_INLINE bool DL_SPI_isRXFIFOEmpty(const SPI_Regs *spi)
673 {
674  return ((spi->STAT & SPI_STAT_RFE_MASK) == SPI_STAT_RFE_EMPTY);
675 }
676 
687 __STATIC_INLINE bool DL_SPI_isRXFIFOFull(const SPI_Regs *spi)
688 {
689  return ((spi->STAT & SPI_STAT_RNF_MASK) == SPI_STAT_RNF_FULL);
690 }
691 
710 __STATIC_INLINE void DL_SPI_setParity(SPI_Regs *spi, DL_SPI_PARITY parity)
711 {
712  DL_Common_updateReg(&spi->CTL1, (uint32_t) parity,
713  (SPI_CTL1_PREN_MASK | SPI_CTL1_PTEN_MASK | SPI_CTL1_PES_MASK));
714 }
715 
725 __STATIC_INLINE DL_SPI_PARITY DL_SPI_getParity(const SPI_Regs *spi)
726 {
727  uint32_t parity = spi->CTL1 & (SPI_CTL1_PES_MASK | SPI_CTL1_PREN_MASK |
728  SPI_CTL1_PTEN_MASK);
729 
730  return (DL_SPI_PARITY)(parity);
731 }
732 
743 __STATIC_INLINE void DL_SPI_enableReceiveParity(SPI_Regs *spi)
744 {
745  spi->CTL1 |= SPI_CTL1_PREN_ENABLE;
746 }
747 
758 __STATIC_INLINE void DL_SPI_disableReceiveParity(SPI_Regs *spi)
759 {
760  spi->CTL1 &= ~(SPI_CTL1_PREN_MASK);
761 }
762 
773 __STATIC_INLINE bool DL_SPI_isReceiveParityEnabled(const SPI_Regs *spi)
774 {
775  return ((spi->CTL1 & SPI_CTL1_PREN_MASK) == SPI_CTL1_PREN_ENABLE);
776 }
777 
788 __STATIC_INLINE void DL_SPI_enableTransmitParity(SPI_Regs *spi)
789 {
790  spi->CTL1 |= SPI_CTL1_PTEN_ENABLE;
791 }
792 
803 __STATIC_INLINE void DL_SPI_disableTransmitParity(SPI_Regs *spi)
804 {
805  spi->CTL1 &= ~(SPI_CTL1_PTEN_MASK);
806 }
807 
818 __STATIC_INLINE bool DL_SPI_isTransmitParityEnabled(const SPI_Regs *spi)
819 {
820  return ((spi->CTL1 & SPI_CTL1_PTEN_MASK) == SPI_CTL1_PTEN_ENABLE);
821 }
822 
835 __STATIC_INLINE void DL_SPI_setFrameFormat(
836  SPI_Regs *spi, DL_SPI_FRAME_FORMAT frameFormat)
837 {
838  DL_Common_updateReg(&spi->CTL0, (uint32_t) frameFormat,
839  (SPI_CTL0_FRF_MASK | SPI_CTL0_SPO_MASK | SPI_CTL0_SPH_MASK));
840 }
841 
851 __STATIC_INLINE DL_SPI_FRAME_FORMAT DL_SPI_getFrameFormat(const SPI_Regs *spi)
852 {
853  uint32_t frameFormat = spi->CTL0 & (SPI_CTL0_FRF_MASK | SPI_CTL0_SPO_MASK |
854  SPI_CTL0_SPH_MASK);
855 
856  return (DL_SPI_FRAME_FORMAT)(frameFormat);
857 }
858 
868 __STATIC_INLINE void DL_SPI_setDataSize(
869  SPI_Regs *spi, DL_SPI_DATA_SIZE dataSize)
870 {
871  DL_Common_updateReg(&spi->CTL0, (uint32_t) dataSize, SPI_CTL0_DSS_MASK);
872 }
873 
883 __STATIC_INLINE DL_SPI_DATA_SIZE DL_SPI_getDataSize(const SPI_Regs *spi)
884 {
885  uint32_t dataSize = spi->CTL0 & SPI_CTL0_DSS_MASK;
886 
887  return (DL_SPI_DATA_SIZE)(dataSize);
888 }
889 
898 __STATIC_INLINE void DL_SPI_setMode(SPI_Regs *spi, DL_SPI_MODE mode)
899 {
900  DL_Common_updateReg(&spi->CTL1, (uint32_t) mode, SPI_CTL1_CP_MASK);
901 }
902 
912 __STATIC_INLINE DL_SPI_MODE DL_SPI_getMode(const SPI_Regs *spi)
913 {
914  uint32_t mode = spi->CTL1 & SPI_CTL1_CP_MASK;
915 
916  return (DL_SPI_MODE)(mode);
917 }
918 
928 __STATIC_INLINE void DL_SPI_setBitOrder(
929  SPI_Regs *spi, DL_SPI_BIT_ORDER bitOrder)
930 {
931  DL_Common_updateReg(&spi->CTL1, (uint32_t) bitOrder, SPI_CTL1_MSB_MASK);
932 }
933 
943 __STATIC_INLINE DL_SPI_BIT_ORDER DL_SPI_getBitOrder(const SPI_Regs *spi)
944 {
945  uint32_t bitOrder = spi->CTL1 & SPI_CTL1_MSB_MASK;
946 
947  return (DL_SPI_BIT_ORDER)(bitOrder);
948 }
949 
958 __STATIC_INLINE void DL_SPI_enableLoopbackMode(SPI_Regs *spi)
959 {
960  spi->CTL1 |= SPI_CTL1_LBM_ENABLE;
961 }
962 
971 __STATIC_INLINE void DL_SPI_disableLoopbackMode(SPI_Regs *spi)
972 {
973  spi->CTL1 &= ~(SPI_CTL1_LBM_MASK);
974 }
975 
986 __STATIC_INLINE bool DL_SPI_isLoopbackModeEnabled(const SPI_Regs *spi)
987 {
988  return ((spi->CTL1 & SPI_CTL1_LBM_MASK) == SPI_CTL1_LBM_ENABLE);
989 }
990 
1005 __STATIC_INLINE void DL_SPI_setRepeatTransmit(
1006  SPI_Regs *spi, uint32_t numRepeats)
1007 {
1008  DL_Common_updateReg(&spi->CTL1, numRepeats << SPI_CTL1_REPEATTX_OFS,
1009  SPI_CTL1_REPEATTX_MASK);
1010 }
1011 
1026 __STATIC_INLINE uint32_t DL_SPI_getRepeatTransmit(const SPI_Regs *spi)
1027 {
1028  return ((spi->CTL1 & SPI_CTL1_REPEATTX_MASK) >> SPI_CTL1_REPEATTX_OFS);
1029 }
1030 
1043 __STATIC_INLINE void DL_SPI_enablePeripheralAlignDataOnChipSelect(
1044  SPI_Regs *spi)
1045 {
1046  spi->CTL0 |= SPI_CTL0_CSCLR_ENABLE;
1047 }
1048 
1059 __STATIC_INLINE void DL_SPI_disablePeripheralAlignDataOnChipSelect(
1060  SPI_Regs *spi)
1061 {
1062  spi->CTL0 &= ~(SPI_CTL0_CSCLR_MASK);
1063 }
1064 
1075 __STATIC_INLINE bool DL_SPI_isPeripheralAlignDataOnChipSelectEnabled(
1076  const SPI_Regs *spi)
1077 {
1078  return ((spi->CTL0 & SPI_CTL0_CSCLR_MASK) == SPI_CTL0_CSCLR_ENABLE);
1079 }
1080 
1092 __STATIC_INLINE void DL_SPI_enablePacking(SPI_Regs *spi)
1093 {
1094  spi->CTL0 |= SPI_CTL0_PACKEN_ENABLED;
1095 }
1096 
1108 __STATIC_INLINE void DL_SPI_disablePacking(SPI_Regs *spi)
1109 {
1110  spi->CTL0 &= ~(SPI_CTL0_PACKEN_MASK);
1111 }
1112 
1123 __STATIC_INLINE bool DL_SPI_isPackingEnabled(const SPI_Regs *spi)
1124 {
1125  return ((spi->CTL0 & SPI_CTL0_PACKEN_MASK) == SPI_CTL0_PACKEN_ENABLED);
1126 }
1127 
1142 __STATIC_INLINE void DL_SPI_setChipSelect(
1143  SPI_Regs *spi, DL_SPI_CHIP_SELECT chipSelect)
1144 {
1146  &spi->CTL0, (uint32_t) chipSelect, SPI_CTL0_CSSEL_MASK);
1147 }
1148 
1160 __STATIC_INLINE DL_SPI_CHIP_SELECT DL_SPI_getChipSelect(const SPI_Regs *spi)
1161 {
1162  uint32_t chipSelect = spi->CTL0 & SPI_CTL0_CSSEL_MASK;
1163 
1164  return (DL_SPI_CHIP_SELECT)(chipSelect);
1165 }
1166 
1180 __STATIC_INLINE void DL_SPI_setPeripheralReceiveTimeout(
1181  SPI_Regs *spi, uint32_t timeout)
1182 {
1183  DL_Common_updateReg(&spi->CTL1, timeout << SPI_CTL1_RXTIMEOUT_OFS,
1184  SPI_CTL1_RXTIMEOUT_MASK);
1185 }
1186 
1199 __STATIC_INLINE uint32_t DL_SPI_getPeripheralReceiveTimeout(
1200  const SPI_Regs *spi)
1201 {
1202  return ((spi->CTL1 & SPI_CTL1_RXTIMEOUT_MASK) >> SPI_CTL1_RXTIMEOUT_OFS);
1203 }
1204 
1227 __STATIC_INLINE void DL_SPI_setControllerCommandDataModeConfig(
1228  SPI_Regs *spi, uint32_t config)
1229 {
1231  &spi->CTL1, config << SPI_CTL1_CDMODE_OFS, SPI_CTL1_CDMODE_MASK);
1232 }
1233 
1249 __STATIC_INLINE uint32_t DL_SPI_getControllerCommandDataModeConfig(
1250  const SPI_Regs *spi)
1251 {
1252  return ((spi->CTL1 & SPI_CTL1_CDMODE_MASK) >> SPI_CTL1_CDMODE_OFS);
1253 }
1254 
1265 __STATIC_INLINE void DL_SPI_enableControllerCommandDataMode(SPI_Regs *spi)
1266 {
1267  spi->CTL1 |= SPI_CTL1_CDENABLE_ENABLE;
1268 }
1269 
1275 __STATIC_INLINE void DL_SPI_disableControllerCommandDataMode(SPI_Regs *spi)
1276 {
1277  spi->CTL1 &= ~(SPI_CTL1_CDENABLE_MASK);
1278 }
1279 
1290 __STATIC_INLINE bool DL_SPI_isControllerCommandDataModeEnabled(
1291  const SPI_Regs *spi)
1292 {
1293  return ((spi->CTL1 & SPI_CTL1_CDENABLE_MASK) == SPI_CTL1_CDENABLE_ENABLE);
1294 }
1295 
1306 __STATIC_INLINE void DL_SPI_enablePeripheralDataOutput(SPI_Regs *spi)
1307 {
1308  spi->CTL1 &= ~(SPI_CTL1_POD_MASK);
1309 }
1310 
1322 __STATIC_INLINE void DL_SPI_disablePeripheralDataOutput(SPI_Regs *spi)
1323 {
1324  spi->CTL1 |= SPI_CTL1_POD_ENABLE;
1325 }
1326 
1339 __STATIC_INLINE bool DL_SPI_isPeripheralDataOutputEnabled(const SPI_Regs *spi)
1340 {
1341  return ((spi->CTL1 & SPI_CTL1_POD_MASK) == SPI_CTL1_POD_DISABLE);
1342 }
1343 
1356 __STATIC_INLINE void DL_SPI_setDelayedSampling(SPI_Regs *spi, uint32_t delay)
1357 {
1358  DL_Common_updateReg(&spi->CLKCTL, delay << SPI_CLKCTL_DSAMPLE_OFS,
1359  SPI_CLKCTL_DSAMPLE_MASK);
1360 }
1361 
1377 __STATIC_INLINE uint32_t DL_SPI_getDelayedSampling(const SPI_Regs *spi)
1378 {
1379  return (spi->CLKCTL & SPI_CLKCTL_DSAMPLE_MASK >> SPI_CLKCTL_DSAMPLE_OFS);
1380 }
1381 
1400 __STATIC_INLINE void DL_SPI_setFIFOThreshold(SPI_Regs *spi,
1401  DL_SPI_RX_FIFO_LEVEL rxThreshold, DL_SPI_TX_FIFO_LEVEL txThreshold)
1402 {
1403  DL_Common_updateReg(&spi->IFLS,
1404  (uint32_t) rxThreshold | (uint32_t) txThreshold,
1405  SPI_IFLS_RXIFLSEL_MASK | SPI_IFLS_TXIFLSEL_MASK);
1406 }
1407 
1417 __STATIC_INLINE DL_SPI_TX_FIFO_LEVEL DL_SPI_getTXFIFOThreshold(
1418  const SPI_Regs *spi)
1419 {
1420  uint32_t txThreshold = spi->IFLS & SPI_IFLS_TXIFLSEL_MASK;
1421 
1422  return (DL_SPI_TX_FIFO_LEVEL)(txThreshold);
1423 }
1424 
1434 __STATIC_INLINE DL_SPI_RX_FIFO_LEVEL DL_SPI_getRXFIFOThreshold(
1435  const SPI_Regs *spi)
1436 {
1437  uint32_t rxThreshold = spi->IFLS & SPI_IFLS_RXIFLSEL_MASK;
1438 
1439  return (DL_SPI_RX_FIFO_LEVEL)(rxThreshold);
1440 }
1441 
1458 __STATIC_INLINE void DL_SPI_setBitRateSerialClockDivider(
1459  SPI_Regs *spi, uint32_t SCR)
1460 {
1461  DL_Common_updateReg(&spi->CLKCTL, SCR, SPI_CLKCTL_SCR_MASK);
1462 }
1463 
1473 __STATIC_INLINE uint32_t DL_SPI_getBitRateSerialClockDivider(
1474  const SPI_Regs *spi)
1475 {
1476  return (spi->CLKCTL & SPI_CLKCTL_SCR_MASK);
1477 }
1478 
1494 __STATIC_INLINE void DL_SPI_transmitData8(SPI_Regs *spi, uint8_t data)
1495 {
1496  spi->TXDATA = data;
1497 }
1498 
1514 __STATIC_INLINE void DL_SPI_transmitData16(SPI_Regs *spi, uint16_t data)
1515 {
1516  spi->TXDATA = data;
1517 }
1518 
1540 __STATIC_INLINE void DL_SPI_transmitData32(SPI_Regs *spi, uint32_t data)
1541 {
1542  spi->TXDATA = data;
1543 }
1544 
1561 __STATIC_INLINE uint8_t DL_SPI_receiveData8(const SPI_Regs *spi)
1562 {
1563  return ((uint8_t)(spi->RXDATA));
1564 }
1565 
1582 __STATIC_INLINE uint16_t DL_SPI_receiveData16(const SPI_Regs *spi)
1583 {
1584  return ((uint16_t)(spi->RXDATA));
1585 }
1586 
1609 __STATIC_INLINE uint32_t DL_SPI_receiveData32(const SPI_Regs *spi)
1610 {
1611  return spi->RXDATA;
1612 }
1613 
1622 __STATIC_INLINE void DL_SPI_enableInterrupt(
1623  SPI_Regs *spi, uint32_t interruptMask)
1624 {
1625  spi->CPU_INT.IMASK |= interruptMask;
1626 }
1627 
1636 __STATIC_INLINE void DL_SPI_disableInterrupt(
1637  SPI_Regs *spi, uint32_t interruptMask)
1638 {
1639  spi->CPU_INT.IMASK &= ~(interruptMask);
1640 }
1641 
1654 __STATIC_INLINE uint32_t DL_SPI_getEnabledInterrupts(
1655  const SPI_Regs *spi, uint32_t interruptMask)
1656 {
1657  return (spi->CPU_INT.IMASK & interruptMask);
1658 }
1659 
1677 __STATIC_INLINE uint32_t DL_SPI_getEnabledInterruptStatus(
1678  const SPI_Regs *spi, uint32_t interruptMask)
1679 {
1680  return (spi->CPU_INT.MIS & interruptMask);
1681 }
1682 
1698 __STATIC_INLINE uint32_t DL_SPI_getRawInterruptStatus(
1699  const SPI_Regs *spi, uint32_t interruptMask)
1700 {
1701  return (spi->CPU_INT.RIS & interruptMask);
1702 }
1703 
1716 __STATIC_INLINE DL_SPI_IIDX DL_SPI_getPendingInterrupt(const SPI_Regs *spi)
1717 {
1718  return ((DL_SPI_IIDX) spi->CPU_INT.IIDX);
1719 }
1720 
1729 __STATIC_INLINE void DL_SPI_clearInterruptStatus(
1730  SPI_Regs *spi, uint32_t interruptMask)
1731 {
1732  spi->CPU_INT.ICLR = interruptMask;
1733 }
1734 
1750 void DL_SPI_transmitDataBlocking8(SPI_Regs *spi, uint8_t data);
1751 
1767 void DL_SPI_transmitDataBlocking16(SPI_Regs *spi, uint16_t data);
1768 
1790 void DL_SPI_transmitDataBlocking32(SPI_Regs *spi, uint32_t data);
1791 
1808 uint8_t DL_SPI_receiveDataBlocking8(const SPI_Regs *spi);
1809 
1826 uint16_t DL_SPI_receiveDataBlocking16(const SPI_Regs *spi);
1827 
1850 uint32_t DL_SPI_receiveDataBlocking32(const SPI_Regs *spi);
1851 
1872 bool DL_SPI_transmitDataCheck8(SPI_Regs *spi, uint8_t data);
1873 
1894 bool DL_SPI_transmitDataCheck16(SPI_Regs *spi, uint16_t data);
1895 
1922 bool DL_SPI_transmitDataCheck32(SPI_Regs *spi, uint32_t data);
1923 
1944 bool DL_SPI_receiveDataCheck8(const SPI_Regs *spi, uint8_t *buffer);
1945 
1966 bool DL_SPI_receiveDataCheck16(const SPI_Regs *spi, uint16_t *buffer);
1967 
1994 bool DL_SPI_receiveDataCheck32(const SPI_Regs *spi, uint32_t *buffer);
1995 
2005 uint32_t DL_SPI_drainRXFIFO8(
2006  const SPI_Regs *spi, uint8_t *buffer, uint32_t maxCount);
2007 
2017 uint32_t DL_SPI_drainRXFIFO16(
2018  const SPI_Regs *spi, uint16_t *buffer, uint32_t maxCount);
2019 
2036 uint32_t DL_SPI_drainRXFIFO32(
2037  const SPI_Regs *spi, uint32_t *buffer, uint32_t maxCount);
2038 
2051 uint32_t DL_SPI_fillTXFIFO8(
2052  SPI_Regs *spi, const uint8_t *buffer, uint32_t count);
2053 
2066 uint32_t DL_SPI_fillTXFIFO16(
2067  SPI_Regs *spi, const uint16_t *buffer, uint32_t count);
2068 
2088 uint32_t DL_SPI_fillTXFIFO32(
2089  SPI_Regs *spi, const uint32_t *buffer, uint32_t count);
2090 
2106 __STATIC_INLINE void DL_SPI_enableDMAReceiveEvent(
2107  SPI_Regs *spi, uint32_t interrupt)
2108 {
2109  spi->DMA_TRIG_RX.IMASK = interrupt;
2110 }
2111 
2125 __STATIC_INLINE void DL_SPI_enableDMATransmitEvent(SPI_Regs *spi)
2126 {
2127  spi->DMA_TRIG_TX.IMASK = SPI_DMA_TRIG_TX_IMASK_TX_SET;
2128 }
2129 
2143 __STATIC_INLINE void DL_SPI_disableDMAReceiveEvent(
2144  SPI_Regs *spi, uint32_t interrupt)
2145 {
2146  spi->DMA_TRIG_RX.IMASK &= ~(interrupt);
2147 }
2148 
2162 __STATIC_INLINE void DL_SPI_disableDMATransmitEvent(SPI_Regs *spi)
2163 {
2164  spi->DMA_TRIG_TX.IMASK = SPI_DMA_TRIG_TX_IMASK_TX_CLR;
2165 }
2166 
2184 __STATIC_INLINE uint32_t DL_SPI_getEnabledDMAReceiveEvent(
2185  const SPI_Regs *spi, uint32_t interruptMask)
2186 {
2187  return (spi->DMA_TRIG_RX.IMASK & interruptMask);
2188 }
2189 
2203 __STATIC_INLINE uint32_t DL_SPI_getEnabledDMATransmitEvent(const SPI_Regs *spi)
2204 {
2205  return (spi->DMA_TRIG_TX.IMASK & SPI_DMA_TRIG_TX_IMASK_TX_MASK);
2206 }
2207 
2229 __STATIC_INLINE uint32_t DL_SPI_getEnabledDMAReceiveEventStatus(
2230  const SPI_Regs *spi, uint32_t interruptMask)
2231 {
2232  return (spi->DMA_TRIG_RX.MIS & interruptMask);
2233 }
2234 
2252 __STATIC_INLINE uint32_t DL_SPI_getEnabledDMATransmitEventStatus(
2253  const SPI_Regs *spi)
2254 {
2255  return (spi->DMA_TRIG_TX.MIS & SPI_DMA_TRIG_TX_MIS_TX_MASK);
2256 }
2257 
2275 __STATIC_INLINE uint32_t DL_SPI_getRawDMAReceiveEventStatus(
2276  const SPI_Regs *spi, uint32_t interruptMask)
2277 {
2278  return (spi->DMA_TRIG_RX.RIS & interruptMask);
2279 }
2280 
2296 __STATIC_INLINE uint32_t DL_SPI_getRawDMATransmitEventStatus(
2297  const SPI_Regs *spi)
2298 {
2299  return (spi->DMA_TRIG_TX.RIS & SPI_DMA_TRIG_TX_RIS_TX_MASK);
2300 }
2301 
2318 __STATIC_INLINE DL_SPI_DMA_IIDX_RX DL_SPI_getPendingDMAReceiveEvent(
2319  const SPI_Regs *spi)
2320 {
2321  return (DL_SPI_DMA_IIDX_RX)(spi->DMA_TRIG_RX.IIDX);
2322 }
2323 
2340 __STATIC_INLINE DL_SPI_DMA_IIDX_TX DL_SPI_getPendingDMATransmitEvent(
2341  const SPI_Regs *spi)
2342 {
2343  return (DL_SPI_DMA_IIDX_TX)(spi->DMA_TRIG_TX.IIDX);
2344 }
2345 
2357 __STATIC_INLINE void DL_SPI_clearDMAReceiveEventStatus(
2358  SPI_Regs *spi, uint32_t interruptMask)
2359 {
2360  spi->DMA_TRIG_RX.ICLR = interruptMask;
2361 }
2362 
2373 __STATIC_INLINE void DL_SPI_clearDMATransmitEventStatus(SPI_Regs *spi)
2374 {
2375  spi->DMA_TRIG_TX.ICLR = SPI_DMA_TRIG_TX_ICLR_TX_CLR;
2376 }
2377 
2395 bool DL_SPI_saveConfiguration(const SPI_Regs *spi, DL_SPI_backupConfig *ptr);
2396 
2414 bool DL_SPI_restoreConfiguration(SPI_Regs *spi, DL_SPI_backupConfig *ptr);
2415 
2416 #ifdef __cplusplus
2417 }
2418 #endif
2419 
2420 #endif /* __MSPM0_HAS_SPI__ */
2421 
2422 #endif /* ti_dl_dl_spi__include */
2423 
__STATIC_INLINE void DL_Common_updateReg(volatile uint32_t *reg, uint32_t val, uint32_t mask)
Writes value to specified register - retaining bits unaffected by mask.
Definition: dl_common.h:63
DriverLib Common APIs.
© Copyright 1995-2025, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale