xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/spi.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/spi.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/eusci.h>
36*5fd0122aSMatthias Ringwald 
is_A_Module(uint32_t module)37*5fd0122aSMatthias Ringwald static bool is_A_Module(uint32_t module)
38*5fd0122aSMatthias Ringwald {
39*5fd0122aSMatthias Ringwald     if (module == EUSCI_A0_BASE || module == EUSCI_A1_BASE
40*5fd0122aSMatthias Ringwald #ifdef EUSCI_A2_BASE
41*5fd0122aSMatthias Ringwald             || module == EUSCI_A2_BASE
42*5fd0122aSMatthias Ringwald #endif
43*5fd0122aSMatthias Ringwald #ifdef EUSCI_A3_BASE
44*5fd0122aSMatthias Ringwald             || module == EUSCI_A3_BASE
45*5fd0122aSMatthias Ringwald #endif
46*5fd0122aSMatthias Ringwald     )
47*5fd0122aSMatthias Ringwald         return true;
48*5fd0122aSMatthias Ringwald     else
49*5fd0122aSMatthias Ringwald         return false;
50*5fd0122aSMatthias Ringwald }
51*5fd0122aSMatthias Ringwald 
SPI_initMaster(uint32_t moduleInstance,const eUSCI_SPI_MasterConfig * config)52*5fd0122aSMatthias Ringwald bool SPI_initMaster(uint32_t moduleInstance, const eUSCI_SPI_MasterConfig *config)
53*5fd0122aSMatthias Ringwald {
54*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
55*5fd0122aSMatthias Ringwald     {
56*5fd0122aSMatthias Ringwald         ASSERT(
57*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_CLOCKSOURCE_ACLK == config->selectClockSource)
58*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_CLOCKSOURCE_SMCLK
59*5fd0122aSMatthias Ringwald                         == config->selectClockSource));
60*5fd0122aSMatthias Ringwald 
61*5fd0122aSMatthias Ringwald         ASSERT(
62*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_MSB_FIRST == config->msbFirst)
63*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_LSB_FIRST == config->msbFirst));
64*5fd0122aSMatthias Ringwald 
65*5fd0122aSMatthias Ringwald         ASSERT(
66*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
67*5fd0122aSMatthias Ringwald                         == config->clockPhase)
68*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
69*5fd0122aSMatthias Ringwald                         == config->clockPhase));
70*5fd0122aSMatthias Ringwald 
71*5fd0122aSMatthias Ringwald         ASSERT(
72*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
73*5fd0122aSMatthias Ringwald                         == config->clockPolarity)
74*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW
75*5fd0122aSMatthias Ringwald                         == config->clockPolarity));
76*5fd0122aSMatthias Ringwald 
77*5fd0122aSMatthias Ringwald         ASSERT(
78*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_3PIN == config->spiMode)
79*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_HIGH
80*5fd0122aSMatthias Ringwald                         == config->spiMode)
81*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_LOW
82*5fd0122aSMatthias Ringwald                         == config->spiMode));
83*5fd0122aSMatthias Ringwald 
84*5fd0122aSMatthias Ringwald         //Disable the USCI Module
85*5fd0122aSMatthias Ringwald         BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
86*5fd0122aSMatthias Ringwald 
87*5fd0122aSMatthias Ringwald         /*
88*5fd0122aSMatthias Ringwald          * Configure as SPI master mode.
89*5fd0122aSMatthias Ringwald          * Clock phase select, polarity, msb
90*5fd0122aSMatthias Ringwald          * EUSCI_A_CTLW0_MST = Master mode
91*5fd0122aSMatthias Ringwald          * EUSCI_A_CTLW0_SYNC = Synchronous mode
92*5fd0122aSMatthias Ringwald          * UCMODE_0 = 3-pin SPI
93*5fd0122aSMatthias Ringwald          */
94*5fd0122aSMatthias Ringwald         EUSCI_A_CMSIS(moduleInstance)->CTLW0 =
95*5fd0122aSMatthias Ringwald                 (EUSCI_A_CMSIS(moduleInstance)->CTLW0
96*5fd0122aSMatthias Ringwald                         & ~(EUSCI_A_CTLW0_SSEL_MASK + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_MST
97*5fd0122aSMatthias Ringwald                                 + EUSCI_A_CTLW0_MODE_3 + EUSCI_A_CTLW0_SYNC))
98*5fd0122aSMatthias Ringwald                         | (config->selectClockSource + config->msbFirst
99*5fd0122aSMatthias Ringwald                                 + config->clockPhase + config->clockPolarity
100*5fd0122aSMatthias Ringwald                                 + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_SYNC + config->spiMode);
101*5fd0122aSMatthias Ringwald 
102*5fd0122aSMatthias Ringwald         EUSCI_A_CMSIS(moduleInstance)->BRW =
103*5fd0122aSMatthias Ringwald                 (uint16_t) (config->clockSourceFrequency
104*5fd0122aSMatthias Ringwald                         / config->desiredSpiClock);
105*5fd0122aSMatthias Ringwald 
106*5fd0122aSMatthias Ringwald         //No modulation
107*5fd0122aSMatthias Ringwald         EUSCI_A_CMSIS(moduleInstance)->MCTLW = 0;
108*5fd0122aSMatthias Ringwald 
109*5fd0122aSMatthias Ringwald         return true;
110*5fd0122aSMatthias Ringwald     } else
111*5fd0122aSMatthias Ringwald     {
112*5fd0122aSMatthias Ringwald         ASSERT(
113*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_CLOCKSOURCE_ACLK == config->selectClockSource)
114*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_CLOCKSOURCE_SMCLK
115*5fd0122aSMatthias Ringwald                         == config->selectClockSource));
116*5fd0122aSMatthias Ringwald 
117*5fd0122aSMatthias Ringwald         ASSERT(
118*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_MSB_FIRST == config->msbFirst)
119*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_LSB_FIRST == config->msbFirst));
120*5fd0122aSMatthias Ringwald 
121*5fd0122aSMatthias Ringwald         ASSERT(
122*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
123*5fd0122aSMatthias Ringwald                         == config->clockPhase)
124*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
125*5fd0122aSMatthias Ringwald                         == config->clockPhase));
126*5fd0122aSMatthias Ringwald 
127*5fd0122aSMatthias Ringwald         ASSERT(
128*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
129*5fd0122aSMatthias Ringwald                         == config->clockPolarity)
130*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW
131*5fd0122aSMatthias Ringwald                         == config->clockPolarity));
132*5fd0122aSMatthias Ringwald 
133*5fd0122aSMatthias Ringwald         ASSERT(
134*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_3PIN == config->spiMode)
135*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_HIGH
136*5fd0122aSMatthias Ringwald                         == config->spiMode)
137*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW
138*5fd0122aSMatthias Ringwald                         == config->spiMode));
139*5fd0122aSMatthias Ringwald 
140*5fd0122aSMatthias Ringwald         //Disable the USCI Module
141*5fd0122aSMatthias Ringwald         BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
142*5fd0122aSMatthias Ringwald 
143*5fd0122aSMatthias Ringwald         /*
144*5fd0122aSMatthias Ringwald          * Configure as SPI master mode.
145*5fd0122aSMatthias Ringwald          * Clock phase select, polarity, msb
146*5fd0122aSMatthias Ringwald          * EUSCI_A_CTLW0_MST = Master mode
147*5fd0122aSMatthias Ringwald          * EUSCI_A_CTLW0_SYNC = Synchronous mode
148*5fd0122aSMatthias Ringwald          * UCMODE_0 = 3-pin SPI
149*5fd0122aSMatthias Ringwald          */
150*5fd0122aSMatthias Ringwald         EUSCI_B_CMSIS(moduleInstance)->CTLW0 =
151*5fd0122aSMatthias Ringwald                 (EUSCI_B_CMSIS(moduleInstance)->CTLW0
152*5fd0122aSMatthias Ringwald                         & ~(EUSCI_A_CTLW0_SSEL_MASK + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_MST
153*5fd0122aSMatthias Ringwald                                 + EUSCI_A_CTLW0_MODE_3 + EUSCI_A_CTLW0_SYNC))
154*5fd0122aSMatthias Ringwald                         | (config->selectClockSource + config->msbFirst
155*5fd0122aSMatthias Ringwald                                 + config->clockPhase + config->clockPolarity
156*5fd0122aSMatthias Ringwald                                 + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_SYNC + config->spiMode);
157*5fd0122aSMatthias Ringwald 
158*5fd0122aSMatthias Ringwald         EUSCI_B_CMSIS(moduleInstance)->BRW =
159*5fd0122aSMatthias Ringwald                 (uint16_t) (config->clockSourceFrequency
160*5fd0122aSMatthias Ringwald                         / config->desiredSpiClock);
161*5fd0122aSMatthias Ringwald 
162*5fd0122aSMatthias Ringwald         return true;
163*5fd0122aSMatthias Ringwald     }
164*5fd0122aSMatthias Ringwald 
165*5fd0122aSMatthias Ringwald }
166*5fd0122aSMatthias Ringwald 
SPI_selectFourPinFunctionality(uint32_t moduleInstance,uint_fast8_t select4PinFunctionality)167*5fd0122aSMatthias Ringwald void SPI_selectFourPinFunctionality(uint32_t moduleInstance,
168*5fd0122aSMatthias Ringwald         uint_fast8_t select4PinFunctionality)
169*5fd0122aSMatthias Ringwald {
170*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
171*5fd0122aSMatthias Ringwald     {
172*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_select4PinFunctionality(moduleInstance,
173*5fd0122aSMatthias Ringwald                 select4PinFunctionality);
174*5fd0122aSMatthias Ringwald     } else
175*5fd0122aSMatthias Ringwald     {
176*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_select4PinFunctionality(moduleInstance,
177*5fd0122aSMatthias Ringwald                 select4PinFunctionality);
178*5fd0122aSMatthias Ringwald     }
179*5fd0122aSMatthias Ringwald 
180*5fd0122aSMatthias Ringwald }
181*5fd0122aSMatthias Ringwald 
SPI_changeMasterClock(uint32_t moduleInstance,uint32_t clockSourceFrequency,uint32_t desiredSpiClock)182*5fd0122aSMatthias Ringwald void SPI_changeMasterClock(uint32_t moduleInstance,
183*5fd0122aSMatthias Ringwald         uint32_t clockSourceFrequency, uint32_t desiredSpiClock)
184*5fd0122aSMatthias Ringwald {
185*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
186*5fd0122aSMatthias Ringwald     {
187*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_masterChangeClock(moduleInstance, clockSourceFrequency,
188*5fd0122aSMatthias Ringwald                 desiredSpiClock);
189*5fd0122aSMatthias Ringwald     } else
190*5fd0122aSMatthias Ringwald     {
191*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_masterChangeClock(moduleInstance, clockSourceFrequency,
192*5fd0122aSMatthias Ringwald                 desiredSpiClock);
193*5fd0122aSMatthias Ringwald     }
194*5fd0122aSMatthias Ringwald 
195*5fd0122aSMatthias Ringwald }
196*5fd0122aSMatthias Ringwald 
SPI_initSlave(uint32_t moduleInstance,const eUSCI_SPI_SlaveConfig * config)197*5fd0122aSMatthias Ringwald bool SPI_initSlave(uint32_t moduleInstance, const eUSCI_SPI_SlaveConfig *config)
198*5fd0122aSMatthias Ringwald {
199*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
200*5fd0122aSMatthias Ringwald     {
201*5fd0122aSMatthias Ringwald         ASSERT(
202*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_MSB_FIRST == config->msbFirst)
203*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_LSB_FIRST == config->msbFirst));
204*5fd0122aSMatthias Ringwald 
205*5fd0122aSMatthias Ringwald         ASSERT(
206*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
207*5fd0122aSMatthias Ringwald                         == config->clockPhase)
208*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
209*5fd0122aSMatthias Ringwald                         == config->clockPhase));
210*5fd0122aSMatthias Ringwald 
211*5fd0122aSMatthias Ringwald         ASSERT(
212*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
213*5fd0122aSMatthias Ringwald                         == config->clockPolarity)
214*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW
215*5fd0122aSMatthias Ringwald                         == config->clockPolarity));
216*5fd0122aSMatthias Ringwald 
217*5fd0122aSMatthias Ringwald         ASSERT(
218*5fd0122aSMatthias Ringwald                 (EUSCI_A_SPI_3PIN == config->spiMode)
219*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_HIGH
220*5fd0122aSMatthias Ringwald                         == config->spiMode)
221*5fd0122aSMatthias Ringwald                 || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_LOW
222*5fd0122aSMatthias Ringwald                         == config->spiMode));
223*5fd0122aSMatthias Ringwald 
224*5fd0122aSMatthias Ringwald         //Disable USCI Module
225*5fd0122aSMatthias Ringwald         BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
226*5fd0122aSMatthias Ringwald 
227*5fd0122aSMatthias Ringwald         //Reset OFS_UCAxCTLW0 register
228*5fd0122aSMatthias Ringwald         EUSCI_A_CMSIS(moduleInstance)->CTLW0 =
229*5fd0122aSMatthias Ringwald                 (EUSCI_A_CMSIS(moduleInstance)->CTLW0
230*5fd0122aSMatthias Ringwald                         & ~(EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_MODE_3))
231*5fd0122aSMatthias Ringwald                         | (config->clockPhase + config->clockPolarity
232*5fd0122aSMatthias Ringwald                                 + config->msbFirst + EUSCI_A_CTLW0_SYNC + config->spiMode);
233*5fd0122aSMatthias Ringwald 
234*5fd0122aSMatthias Ringwald         return true;
235*5fd0122aSMatthias Ringwald     } else
236*5fd0122aSMatthias Ringwald     {
237*5fd0122aSMatthias Ringwald         ASSERT(
238*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_MSB_FIRST == config->msbFirst)
239*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_LSB_FIRST == config->msbFirst));
240*5fd0122aSMatthias Ringwald 
241*5fd0122aSMatthias Ringwald         ASSERT(
242*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
243*5fd0122aSMatthias Ringwald                         == config->clockPhase)
244*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
245*5fd0122aSMatthias Ringwald                         == config->clockPhase));
246*5fd0122aSMatthias Ringwald 
247*5fd0122aSMatthias Ringwald         ASSERT(
248*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
249*5fd0122aSMatthias Ringwald                         == config->clockPolarity)
250*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW
251*5fd0122aSMatthias Ringwald                         == config->clockPolarity));
252*5fd0122aSMatthias Ringwald 
253*5fd0122aSMatthias Ringwald         ASSERT(
254*5fd0122aSMatthias Ringwald                 (EUSCI_B_SPI_3PIN == config->spiMode)
255*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_HIGH
256*5fd0122aSMatthias Ringwald                         == config->spiMode)
257*5fd0122aSMatthias Ringwald                 || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW
258*5fd0122aSMatthias Ringwald                         == config->spiMode));
259*5fd0122aSMatthias Ringwald 
260*5fd0122aSMatthias Ringwald         //Disable USCI Module
261*5fd0122aSMatthias Ringwald         BITBAND_PERI(EUSCI_B_CMSIS(moduleInstance)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
262*5fd0122aSMatthias Ringwald 
263*5fd0122aSMatthias Ringwald         //Reset OFS_UCBxCTLW0 register
264*5fd0122aSMatthias Ringwald         EUSCI_B_CMSIS(moduleInstance)->CTLW0 =
265*5fd0122aSMatthias Ringwald                 (EUSCI_B_CMSIS(moduleInstance)->CTLW0
266*5fd0122aSMatthias Ringwald                         & ~(EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_MODE_3))
267*5fd0122aSMatthias Ringwald                         | (config->clockPhase + config->clockPolarity
268*5fd0122aSMatthias Ringwald                                 + config->msbFirst + EUSCI_A_CTLW0_SYNC + config->spiMode);
269*5fd0122aSMatthias Ringwald 
270*5fd0122aSMatthias Ringwald         return true;
271*5fd0122aSMatthias Ringwald     }
272*5fd0122aSMatthias Ringwald 
273*5fd0122aSMatthias Ringwald }
274*5fd0122aSMatthias Ringwald 
SPI_changeClockPhasePolarity(uint32_t moduleInstance,uint_fast16_t clockPhase,uint_fast16_t clockPolarity)275*5fd0122aSMatthias Ringwald void SPI_changeClockPhasePolarity(uint32_t moduleInstance,
276*5fd0122aSMatthias Ringwald         uint_fast16_t clockPhase, uint_fast16_t clockPolarity)
277*5fd0122aSMatthias Ringwald {
278*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
279*5fd0122aSMatthias Ringwald     {
280*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_changeClockPhasePolarity(moduleInstance, clockPhase,
281*5fd0122aSMatthias Ringwald                 clockPolarity);
282*5fd0122aSMatthias Ringwald     } else
283*5fd0122aSMatthias Ringwald     {
284*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_changeClockPhasePolarity(moduleInstance, clockPhase,
285*5fd0122aSMatthias Ringwald                 clockPolarity);
286*5fd0122aSMatthias Ringwald     }
287*5fd0122aSMatthias Ringwald 
288*5fd0122aSMatthias Ringwald }
289*5fd0122aSMatthias Ringwald 
SPI_transmitData(uint32_t moduleInstance,uint_fast8_t transmitData)290*5fd0122aSMatthias Ringwald void SPI_transmitData(uint32_t moduleInstance, uint_fast8_t transmitData)
291*5fd0122aSMatthias Ringwald {
292*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
293*5fd0122aSMatthias Ringwald     {
294*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_transmitData(moduleInstance, transmitData);
295*5fd0122aSMatthias Ringwald     } else
296*5fd0122aSMatthias Ringwald     {
297*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_transmitData(moduleInstance, transmitData);
298*5fd0122aSMatthias Ringwald     }
299*5fd0122aSMatthias Ringwald 
300*5fd0122aSMatthias Ringwald }
301*5fd0122aSMatthias Ringwald 
SPI_receiveData(uint32_t moduleInstance)302*5fd0122aSMatthias Ringwald uint8_t SPI_receiveData(uint32_t moduleInstance)
303*5fd0122aSMatthias Ringwald {
304*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
305*5fd0122aSMatthias Ringwald     {
306*5fd0122aSMatthias Ringwald         return EUSCI_A_SPI_receiveData(moduleInstance);
307*5fd0122aSMatthias Ringwald     } else
308*5fd0122aSMatthias Ringwald     {
309*5fd0122aSMatthias Ringwald         return EUSCI_B_SPI_receiveData(moduleInstance);
310*5fd0122aSMatthias Ringwald     }
311*5fd0122aSMatthias Ringwald 
312*5fd0122aSMatthias Ringwald }
313*5fd0122aSMatthias Ringwald 
SPI_enableModule(uint32_t moduleInstance)314*5fd0122aSMatthias Ringwald void SPI_enableModule(uint32_t moduleInstance)
315*5fd0122aSMatthias Ringwald {
316*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
317*5fd0122aSMatthias Ringwald     {
318*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_enable(moduleInstance);
319*5fd0122aSMatthias Ringwald     } else
320*5fd0122aSMatthias Ringwald     {
321*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_enable(moduleInstance);
322*5fd0122aSMatthias Ringwald     }
323*5fd0122aSMatthias Ringwald 
324*5fd0122aSMatthias Ringwald }
325*5fd0122aSMatthias Ringwald 
SPI_disableModule(uint32_t moduleInstance)326*5fd0122aSMatthias Ringwald void SPI_disableModule(uint32_t moduleInstance)
327*5fd0122aSMatthias Ringwald {
328*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
329*5fd0122aSMatthias Ringwald     {
330*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_disable(moduleInstance);
331*5fd0122aSMatthias Ringwald     } else
332*5fd0122aSMatthias Ringwald     {
333*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_disable(moduleInstance);
334*5fd0122aSMatthias Ringwald     }
335*5fd0122aSMatthias Ringwald 
336*5fd0122aSMatthias Ringwald }
337*5fd0122aSMatthias Ringwald 
SPI_getReceiveBufferAddressForDMA(uint32_t moduleInstance)338*5fd0122aSMatthias Ringwald uint32_t SPI_getReceiveBufferAddressForDMA(uint32_t moduleInstance)
339*5fd0122aSMatthias Ringwald {
340*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
341*5fd0122aSMatthias Ringwald     {
342*5fd0122aSMatthias Ringwald         return EUSCI_A_SPI_getReceiveBufferAddressForDMA(moduleInstance);
343*5fd0122aSMatthias Ringwald     } else
344*5fd0122aSMatthias Ringwald     {
345*5fd0122aSMatthias Ringwald         return EUSCI_B_SPI_getReceiveBufferAddressForDMA(moduleInstance);
346*5fd0122aSMatthias Ringwald     }
347*5fd0122aSMatthias Ringwald 
348*5fd0122aSMatthias Ringwald }
349*5fd0122aSMatthias Ringwald 
SPI_getTransmitBufferAddressForDMA(uint32_t moduleInstance)350*5fd0122aSMatthias Ringwald uint32_t SPI_getTransmitBufferAddressForDMA(uint32_t moduleInstance)
351*5fd0122aSMatthias Ringwald {
352*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
353*5fd0122aSMatthias Ringwald     {
354*5fd0122aSMatthias Ringwald         return EUSCI_A_SPI_getTransmitBufferAddressForDMA(moduleInstance);
355*5fd0122aSMatthias Ringwald     } else
356*5fd0122aSMatthias Ringwald     {
357*5fd0122aSMatthias Ringwald         return EUSCI_B_SPI_getTransmitBufferAddressForDMA(moduleInstance);
358*5fd0122aSMatthias Ringwald     }
359*5fd0122aSMatthias Ringwald 
360*5fd0122aSMatthias Ringwald }
361*5fd0122aSMatthias Ringwald 
SPI_isBusy(uint32_t moduleInstance)362*5fd0122aSMatthias Ringwald uint_fast8_t SPI_isBusy(uint32_t moduleInstance)
363*5fd0122aSMatthias Ringwald {
364*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
365*5fd0122aSMatthias Ringwald     {
366*5fd0122aSMatthias Ringwald         return EUSCI_A_SPI_isBusy(moduleInstance);
367*5fd0122aSMatthias Ringwald     } else
368*5fd0122aSMatthias Ringwald     {
369*5fd0122aSMatthias Ringwald         return EUSCI_B_SPI_isBusy(moduleInstance);
370*5fd0122aSMatthias Ringwald     }
371*5fd0122aSMatthias Ringwald 
372*5fd0122aSMatthias Ringwald }
373*5fd0122aSMatthias Ringwald 
SPI_enableInterrupt(uint32_t moduleInstance,uint_fast16_t mask)374*5fd0122aSMatthias Ringwald void SPI_enableInterrupt(uint32_t moduleInstance, uint_fast16_t mask)
375*5fd0122aSMatthias Ringwald {
376*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
377*5fd0122aSMatthias Ringwald     {
378*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_enableInterrupt(moduleInstance, mask);
379*5fd0122aSMatthias Ringwald     } else
380*5fd0122aSMatthias Ringwald     {
381*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_enableInterrupt(moduleInstance, mask);
382*5fd0122aSMatthias Ringwald     }
383*5fd0122aSMatthias Ringwald 
384*5fd0122aSMatthias Ringwald }
385*5fd0122aSMatthias Ringwald 
SPI_disableInterrupt(uint32_t moduleInstance,uint_fast16_t mask)386*5fd0122aSMatthias Ringwald void SPI_disableInterrupt(uint32_t moduleInstance, uint_fast16_t mask)
387*5fd0122aSMatthias Ringwald {
388*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
389*5fd0122aSMatthias Ringwald     {
390*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_disableInterrupt(moduleInstance, mask);
391*5fd0122aSMatthias Ringwald     } else
392*5fd0122aSMatthias Ringwald     {
393*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_disableInterrupt(moduleInstance, mask);
394*5fd0122aSMatthias Ringwald     }
395*5fd0122aSMatthias Ringwald 
396*5fd0122aSMatthias Ringwald }
397*5fd0122aSMatthias Ringwald 
SPI_getInterruptStatus(uint32_t moduleInstance,uint16_t mask)398*5fd0122aSMatthias Ringwald uint_fast8_t SPI_getInterruptStatus(uint32_t moduleInstance, uint16_t mask)
399*5fd0122aSMatthias Ringwald {
400*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
401*5fd0122aSMatthias Ringwald     {
402*5fd0122aSMatthias Ringwald         return EUSCI_A_SPI_getInterruptStatus(moduleInstance, mask);
403*5fd0122aSMatthias Ringwald     } else
404*5fd0122aSMatthias Ringwald     {
405*5fd0122aSMatthias Ringwald         return EUSCI_B_SPI_getInterruptStatus(moduleInstance, mask);
406*5fd0122aSMatthias Ringwald     }
407*5fd0122aSMatthias Ringwald 
408*5fd0122aSMatthias Ringwald }
409*5fd0122aSMatthias Ringwald 
SPI_getEnabledInterruptStatus(uint32_t moduleInstance)410*5fd0122aSMatthias Ringwald uint_fast8_t SPI_getEnabledInterruptStatus(uint32_t moduleInstance)
411*5fd0122aSMatthias Ringwald {
412*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
413*5fd0122aSMatthias Ringwald     {
414*5fd0122aSMatthias Ringwald         return SPI_getInterruptStatus(moduleInstance,
415*5fd0122aSMatthias Ringwald                 EUSCI_A_SPI_TRANSMIT_INTERRUPT | EUSCI_A_SPI_RECEIVE_INTERRUPT)
416*5fd0122aSMatthias Ringwald                 & EUSCI_A_CMSIS(moduleInstance)->IE;
417*5fd0122aSMatthias Ringwald 
418*5fd0122aSMatthias Ringwald     } else
419*5fd0122aSMatthias Ringwald     {
420*5fd0122aSMatthias Ringwald         return SPI_getInterruptStatus(moduleInstance,
421*5fd0122aSMatthias Ringwald                 EUSCI_B_SPI_TRANSMIT_INTERRUPT | EUSCI_B_SPI_RECEIVE_INTERRUPT)
422*5fd0122aSMatthias Ringwald                 & EUSCI_B_CMSIS(moduleInstance)->IE;
423*5fd0122aSMatthias Ringwald 
424*5fd0122aSMatthias Ringwald     }
425*5fd0122aSMatthias Ringwald }
426*5fd0122aSMatthias Ringwald 
SPI_clearInterruptFlag(uint32_t moduleInstance,uint_fast16_t mask)427*5fd0122aSMatthias Ringwald void SPI_clearInterruptFlag(uint32_t moduleInstance, uint_fast16_t mask)
428*5fd0122aSMatthias Ringwald {
429*5fd0122aSMatthias Ringwald     if (is_A_Module(moduleInstance))
430*5fd0122aSMatthias Ringwald     {
431*5fd0122aSMatthias Ringwald         EUSCI_A_SPI_clearInterruptFlag(moduleInstance, mask);
432*5fd0122aSMatthias Ringwald     } else
433*5fd0122aSMatthias Ringwald     {
434*5fd0122aSMatthias Ringwald         EUSCI_B_SPI_clearInterruptFlag(moduleInstance, mask);
435*5fd0122aSMatthias Ringwald     }
436*5fd0122aSMatthias Ringwald 
437*5fd0122aSMatthias Ringwald }
438*5fd0122aSMatthias Ringwald 
SPI_registerInterrupt(uint32_t moduleInstance,void (* intHandler)(void))439*5fd0122aSMatthias Ringwald void SPI_registerInterrupt(uint32_t moduleInstance, void (*intHandler)(void))
440*5fd0122aSMatthias Ringwald {
441*5fd0122aSMatthias Ringwald     switch (moduleInstance)
442*5fd0122aSMatthias Ringwald     {
443*5fd0122aSMatthias Ringwald     case EUSCI_A0_BASE:
444*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIA0, intHandler);
445*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIA0);
446*5fd0122aSMatthias Ringwald         break;
447*5fd0122aSMatthias Ringwald     case EUSCI_A1_BASE:
448*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIA1, intHandler);
449*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIA1);
450*5fd0122aSMatthias Ringwald         break;
451*5fd0122aSMatthias Ringwald #ifdef EUSCI_A2_BASE
452*5fd0122aSMatthias Ringwald     case EUSCI_A2_BASE:
453*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIA2, intHandler);
454*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIA2);
455*5fd0122aSMatthias Ringwald         break;
456*5fd0122aSMatthias Ringwald #endif
457*5fd0122aSMatthias Ringwald #ifdef EUSCI_A3_BASE
458*5fd0122aSMatthias Ringwald     case EUSCI_A3_BASE:
459*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIA3, intHandler);
460*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIA3);
461*5fd0122aSMatthias Ringwald         break;
462*5fd0122aSMatthias Ringwald #endif
463*5fd0122aSMatthias Ringwald     case EUSCI_B0_BASE:
464*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIB0, intHandler);
465*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIB0);
466*5fd0122aSMatthias Ringwald         break;
467*5fd0122aSMatthias Ringwald     case EUSCI_B1_BASE:
468*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIB1, intHandler);
469*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIB1);
470*5fd0122aSMatthias Ringwald         break;
471*5fd0122aSMatthias Ringwald #ifdef EUSCI_B2_BASE
472*5fd0122aSMatthias Ringwald     case EUSCI_B2_BASE:
473*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIB2, intHandler);
474*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIB2);
475*5fd0122aSMatthias Ringwald         break;
476*5fd0122aSMatthias Ringwald #endif
477*5fd0122aSMatthias Ringwald #ifdef EUSCI_B3_BASE
478*5fd0122aSMatthias Ringwald     case EUSCI_B3_BASE:
479*5fd0122aSMatthias Ringwald         Interrupt_registerInterrupt(INT_EUSCIB3, intHandler);
480*5fd0122aSMatthias Ringwald         Interrupt_enableInterrupt(INT_EUSCIB3);
481*5fd0122aSMatthias Ringwald         break;
482*5fd0122aSMatthias Ringwald #endif
483*5fd0122aSMatthias Ringwald     default:
484*5fd0122aSMatthias Ringwald         ASSERT(false);
485*5fd0122aSMatthias Ringwald     }
486*5fd0122aSMatthias Ringwald }
487*5fd0122aSMatthias Ringwald 
SPI_unregisterInterrupt(uint32_t moduleInstance)488*5fd0122aSMatthias Ringwald void SPI_unregisterInterrupt(uint32_t moduleInstance)
489*5fd0122aSMatthias Ringwald {
490*5fd0122aSMatthias Ringwald     switch (moduleInstance)
491*5fd0122aSMatthias Ringwald     {
492*5fd0122aSMatthias Ringwald     case EUSCI_A0_BASE:
493*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIA0);
494*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIA0);
495*5fd0122aSMatthias Ringwald         break;
496*5fd0122aSMatthias Ringwald     case EUSCI_A1_BASE:
497*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIA1);
498*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIA1);
499*5fd0122aSMatthias Ringwald         break;
500*5fd0122aSMatthias Ringwald #ifdef EUSCI_A2_BASE
501*5fd0122aSMatthias Ringwald     case EUSCI_A2_BASE:
502*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIA2);
503*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIA2);
504*5fd0122aSMatthias Ringwald         break;
505*5fd0122aSMatthias Ringwald #endif
506*5fd0122aSMatthias Ringwald #ifdef EUSCI_A3_BASE
507*5fd0122aSMatthias Ringwald     case EUSCI_A3_BASE:
508*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIA3);
509*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIA3);
510*5fd0122aSMatthias Ringwald         break;
511*5fd0122aSMatthias Ringwald #endif
512*5fd0122aSMatthias Ringwald     case EUSCI_B0_BASE:
513*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIB0);
514*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIB0);
515*5fd0122aSMatthias Ringwald         break;
516*5fd0122aSMatthias Ringwald     case EUSCI_B1_BASE:
517*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIB1);
518*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIB1);
519*5fd0122aSMatthias Ringwald         break;
520*5fd0122aSMatthias Ringwald #ifdef EUSCI_B2_BASE
521*5fd0122aSMatthias Ringwald     case EUSCI_B2_BASE:
522*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIB2);
523*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIB2);
524*5fd0122aSMatthias Ringwald         break;
525*5fd0122aSMatthias Ringwald #endif
526*5fd0122aSMatthias Ringwald #ifdef EUSCI_B3_BASE
527*5fd0122aSMatthias Ringwald     case EUSCI_B3_BASE:
528*5fd0122aSMatthias Ringwald         Interrupt_disableInterrupt(INT_EUSCIB3);
529*5fd0122aSMatthias Ringwald         Interrupt_unregisterInterrupt(INT_EUSCIB3);
530*5fd0122aSMatthias Ringwald         break;
531*5fd0122aSMatthias Ringwald #endif
532*5fd0122aSMatthias Ringwald     default:
533*5fd0122aSMatthias Ringwald         ASSERT(false);
534*5fd0122aSMatthias Ringwald     }
535*5fd0122aSMatthias Ringwald 
536*5fd0122aSMatthias Ringwald }
537*5fd0122aSMatthias Ringwald 
538*5fd0122aSMatthias Ringwald /* Backwards Compatibility Layer */
539*5fd0122aSMatthias Ringwald 
540*5fd0122aSMatthias Ringwald //*****************************************************************************
541*5fd0122aSMatthias Ringwald //
542*5fd0122aSMatthias Ringwald //! \brief Selects 4Pin Functionality
543*5fd0122aSMatthias Ringwald //!
544*5fd0122aSMatthias Ringwald //! This function should be invoked only in 4-wire mode. Invoking this function
545*5fd0122aSMatthias Ringwald //! has no effect in 3-wire mode.
546*5fd0122aSMatthias Ringwald //!
547*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
548*5fd0122aSMatthias Ringwald //! \param select4PinFunctionality selects 4 pin functionality
549*5fd0122aSMatthias Ringwald //!        Valid values are:
550*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_PREVENT_CONFLICTS_WITH_OTHER_MASTERS
551*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_ENABLE_SIGNAL_FOR_4WIRE_SLAVE
552*5fd0122aSMatthias Ringwald //!
553*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSTEM of \b UCAxCTLW0 register.
554*5fd0122aSMatthias Ringwald //!
555*5fd0122aSMatthias Ringwald //! \return None
556*5fd0122aSMatthias Ringwald //
557*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_select4PinFunctionality(uint32_t baseAddress,uint8_t select4PinFunctionality)558*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_select4PinFunctionality(uint32_t baseAddress,
559*5fd0122aSMatthias Ringwald         uint8_t select4PinFunctionality)
560*5fd0122aSMatthias Ringwald {
561*5fd0122aSMatthias Ringwald     ASSERT(
562*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_PREVENT_CONFLICTS_WITH_OTHER_MASTERS
563*5fd0122aSMatthias Ringwald                     == select4PinFunctionality)
564*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_ENABLE_SIGNAL_FOR_4WIRE_SLAVE
565*5fd0122aSMatthias Ringwald                     == select4PinFunctionality));
566*5fd0122aSMatthias Ringwald 
567*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->CTLW0 = (EUSCI_B_CMSIS(baseAddress)->CTLW0
568*5fd0122aSMatthias Ringwald             & ~EUSCI_B_CTLW0_STEM) | select4PinFunctionality;
569*5fd0122aSMatthias Ringwald }
570*5fd0122aSMatthias Ringwald 
571*5fd0122aSMatthias Ringwald //*****************************************************************************
572*5fd0122aSMatthias Ringwald //
573*5fd0122aSMatthias Ringwald //! \brief Initializes the SPI Master clock. At the end of this function call,
574*5fd0122aSMatthias Ringwald //! SPI module is left enabled.
575*5fd0122aSMatthias Ringwald //!
576*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
577*5fd0122aSMatthias Ringwald //! \param clockSourceFrequency is the frequency of the slected clock source
578*5fd0122aSMatthias Ringwald //! \param desiredSpiClock is the desired clock rate for SPI communication
579*5fd0122aSMatthias Ringwald //!
580*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCAxCTLW0 register.
581*5fd0122aSMatthias Ringwald //!
582*5fd0122aSMatthias Ringwald //! \return None
583*5fd0122aSMatthias Ringwald //
584*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_masterChangeClock(uint32_t baseAddress,uint32_t clockSourceFrequency,uint32_t desiredSpiClock)585*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_masterChangeClock(uint32_t baseAddress,
586*5fd0122aSMatthias Ringwald         uint32_t clockSourceFrequency, uint32_t desiredSpiClock)
587*5fd0122aSMatthias Ringwald {
588*5fd0122aSMatthias Ringwald     //Disable the USCI Module
589*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
590*5fd0122aSMatthias Ringwald 
591*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->BRW = (uint16_t) (clockSourceFrequency
592*5fd0122aSMatthias Ringwald             / desiredSpiClock);
593*5fd0122aSMatthias Ringwald 
594*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
595*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
596*5fd0122aSMatthias Ringwald }
597*5fd0122aSMatthias Ringwald 
598*5fd0122aSMatthias Ringwald //*****************************************************************************
599*5fd0122aSMatthias Ringwald //
600*5fd0122aSMatthias Ringwald //! \brief Initializes the SPI Slave block.
601*5fd0122aSMatthias Ringwald //!
602*5fd0122aSMatthias Ringwald //! Upon successful initialization of the SPI slave block, this function will
603*5fd0122aSMatthias Ringwald //! have initailized the slave block, but the SPI Slave block still remains
604*5fd0122aSMatthias Ringwald //! disabled and must be enabled with EUSCI_B_SPI_enable()
605*5fd0122aSMatthias Ringwald //!
606*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI Slave module.
607*5fd0122aSMatthias Ringwald //! \param msbFirst controls the direction of the receive and transmit shift
608*5fd0122aSMatthias Ringwald //!        register.
609*5fd0122aSMatthias Ringwald //!        Valid values are:
610*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_MSB_FIRST
611*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_LSB_FIRST [Default]
612*5fd0122aSMatthias Ringwald //! \param clockPhase is clock phase select.
613*5fd0122aSMatthias Ringwald //!        Valid values are:
614*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
615*5fd0122aSMatthias Ringwald //!           [Default]
616*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
617*5fd0122aSMatthias Ringwald //! \param clockPolarity is clock polarity select
618*5fd0122aSMatthias Ringwald //!        Valid values are:
619*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
620*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]
621*5fd0122aSMatthias Ringwald //! \param spiMode is SPI mode select
622*5fd0122aSMatthias Ringwald //!        Valid values are:
623*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_3PIN
624*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_HIGH
625*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW
626*5fd0122aSMatthias Ringwald //!
627*5fd0122aSMatthias Ringwald //! Modified bits are \b EUSCI_A_CTLW0_MSB, \b EUSCI_A_CTLW0_MST, \b EUSCI_A_CTLW0_SEVENBIT, \b EUSCI_A_CTLW0_CKPL, \b EUSCI_A_CTLW0_CKPH, \b
628*5fd0122aSMatthias Ringwald //! UCMODE and \b UCSWRST of \b UCAxCTLW0 register.
629*5fd0122aSMatthias Ringwald //!
630*5fd0122aSMatthias Ringwald //! \return true
631*5fd0122aSMatthias Ringwald //
632*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_slaveInit(uint32_t baseAddress,uint16_t msbFirst,uint16_t clockPhase,uint16_t clockPolarity,uint16_t spiMode)633*5fd0122aSMatthias Ringwald bool EUSCI_B_SPI_slaveInit(uint32_t baseAddress, uint16_t msbFirst,
634*5fd0122aSMatthias Ringwald         uint16_t clockPhase, uint16_t clockPolarity, uint16_t spiMode)
635*5fd0122aSMatthias Ringwald {
636*5fd0122aSMatthias Ringwald     ASSERT(
637*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_MSB_FIRST == msbFirst)
638*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_LSB_FIRST == msbFirst));
639*5fd0122aSMatthias Ringwald 
640*5fd0122aSMatthias Ringwald     ASSERT(
641*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
642*5fd0122aSMatthias Ringwald                     == clockPhase)
643*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
644*5fd0122aSMatthias Ringwald                     == clockPhase));
645*5fd0122aSMatthias Ringwald 
646*5fd0122aSMatthias Ringwald     ASSERT(
647*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH == clockPolarity)
648*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW
649*5fd0122aSMatthias Ringwald                     == clockPolarity));
650*5fd0122aSMatthias Ringwald 
651*5fd0122aSMatthias Ringwald     ASSERT(
652*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_3PIN == spiMode)
653*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_HIGH == spiMode)
654*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW == spiMode));
655*5fd0122aSMatthias Ringwald 
656*5fd0122aSMatthias Ringwald     //Disable USCI Module
657*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
658*5fd0122aSMatthias Ringwald 
659*5fd0122aSMatthias Ringwald     //Reset OFS_UCBxCTLW0 register
660*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->CTLW0 = (EUSCI_B_CMSIS(baseAddress)->CTLW0
661*5fd0122aSMatthias Ringwald             & ~(EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_MODE_3))
662*5fd0122aSMatthias Ringwald             | (clockPhase + clockPolarity + msbFirst + EUSCI_A_CTLW0_SYNC + spiMode);
663*5fd0122aSMatthias Ringwald 
664*5fd0122aSMatthias Ringwald     return true;
665*5fd0122aSMatthias Ringwald }
666*5fd0122aSMatthias Ringwald 
667*5fd0122aSMatthias Ringwald //*****************************************************************************
668*5fd0122aSMatthias Ringwald //
669*5fd0122aSMatthias Ringwald //! \brief Changes the SPI colock phase and polarity. At the end of this
670*5fd0122aSMatthias Ringwald //! function call, SPI module is left enabled.
671*5fd0122aSMatthias Ringwald //!
672*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
673*5fd0122aSMatthias Ringwald //! \param clockPhase is clock phase select.
674*5fd0122aSMatthias Ringwald //!        Valid values are:
675*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
676*5fd0122aSMatthias Ringwald //!           [Default]
677*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
678*5fd0122aSMatthias Ringwald //! \param clockPolarity is clock polarity select
679*5fd0122aSMatthias Ringwald //!        Valid values are:
680*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
681*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]
682*5fd0122aSMatthias Ringwald //!
683*5fd0122aSMatthias Ringwald //! Modified bits are \b EUSCI_A_CTLW0_CKPL, \b EUSCI_A_CTLW0_CKPH and \b UCSWRST of \b UCAxCTLW0
684*5fd0122aSMatthias Ringwald //! register.
685*5fd0122aSMatthias Ringwald //!
686*5fd0122aSMatthias Ringwald //! \return None
687*5fd0122aSMatthias Ringwald //
688*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_changeClockPhasePolarity(uint32_t baseAddress,uint16_t clockPhase,uint16_t clockPolarity)689*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_changeClockPhasePolarity(uint32_t baseAddress,
690*5fd0122aSMatthias Ringwald         uint16_t clockPhase, uint16_t clockPolarity)
691*5fd0122aSMatthias Ringwald {
692*5fd0122aSMatthias Ringwald 
693*5fd0122aSMatthias Ringwald     ASSERT(
694*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH == clockPolarity)
695*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW
696*5fd0122aSMatthias Ringwald                     == clockPolarity));
697*5fd0122aSMatthias Ringwald 
698*5fd0122aSMatthias Ringwald     ASSERT(
699*5fd0122aSMatthias Ringwald             (EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
700*5fd0122aSMatthias Ringwald                     == clockPhase)
701*5fd0122aSMatthias Ringwald             || (EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
702*5fd0122aSMatthias Ringwald                     == clockPhase));
703*5fd0122aSMatthias Ringwald 
704*5fd0122aSMatthias Ringwald     //Disable the USCI Module
705*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
706*5fd0122aSMatthias Ringwald 
707*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->CTLW0 = (EUSCI_B_CMSIS(baseAddress)->CTLW0
708*5fd0122aSMatthias Ringwald             & ~(EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_CKPL)) | (clockPhase + clockPolarity);
709*5fd0122aSMatthias Ringwald 
710*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
711*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
712*5fd0122aSMatthias Ringwald }
713*5fd0122aSMatthias Ringwald 
714*5fd0122aSMatthias Ringwald //*****************************************************************************
715*5fd0122aSMatthias Ringwald //
716*5fd0122aSMatthias Ringwald //! \brief Transmits a byte from the SPI Module.
717*5fd0122aSMatthias Ringwald //!
718*5fd0122aSMatthias Ringwald //! This function will place the supplied data into SPI trasmit data register
719*5fd0122aSMatthias Ringwald //! to start transmission.
720*5fd0122aSMatthias Ringwald //!
721*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
722*5fd0122aSMatthias Ringwald //! \param transmitData data to be transmitted from the SPI module
723*5fd0122aSMatthias Ringwald //!
724*5fd0122aSMatthias Ringwald //! \return None
725*5fd0122aSMatthias Ringwald //
726*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_transmitData(uint32_t baseAddress,uint8_t transmitData)727*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_transmitData(uint32_t baseAddress, uint8_t transmitData)
728*5fd0122aSMatthias Ringwald {
729*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->TXBUF = transmitData;
730*5fd0122aSMatthias Ringwald }
731*5fd0122aSMatthias Ringwald 
732*5fd0122aSMatthias Ringwald //*****************************************************************************
733*5fd0122aSMatthias Ringwald //
734*5fd0122aSMatthias Ringwald //! \brief Receives a byte that has been sent to the SPI Module.
735*5fd0122aSMatthias Ringwald //!
736*5fd0122aSMatthias Ringwald //! This function reads a byte of data from the SPI receive data Register.
737*5fd0122aSMatthias Ringwald //!
738*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
739*5fd0122aSMatthias Ringwald //!
740*5fd0122aSMatthias Ringwald //! \return Returns the byte received from by the SPI module, cast as an
741*5fd0122aSMatthias Ringwald //!         uint8_t.
742*5fd0122aSMatthias Ringwald //
743*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_receiveData(uint32_t baseAddress)744*5fd0122aSMatthias Ringwald uint8_t EUSCI_B_SPI_receiveData(uint32_t baseAddress)
745*5fd0122aSMatthias Ringwald {
746*5fd0122aSMatthias Ringwald     return EUSCI_B_CMSIS(baseAddress)->RXBUF;
747*5fd0122aSMatthias Ringwald }
748*5fd0122aSMatthias Ringwald 
749*5fd0122aSMatthias Ringwald //*****************************************************************************
750*5fd0122aSMatthias Ringwald //
751*5fd0122aSMatthias Ringwald //! \brief Enables individual SPI interrupt sources.
752*5fd0122aSMatthias Ringwald //!
753*5fd0122aSMatthias Ringwald //! Enables the indicated SPI interrupt sources.  Only the sources that are
754*5fd0122aSMatthias Ringwald //! enabled can be reflected to the processor interrupt; disabled sources have
755*5fd0122aSMatthias Ringwald //! no effect on the processor. Does not clear interrupt flags.
756*5fd0122aSMatthias Ringwald //!
757*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
758*5fd0122aSMatthias Ringwald //! \param mask is the bit mask of the interrupt sources to be enabled.
759*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
760*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_TRANSMIT_INTERRUPT
761*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_RECEIVE_INTERRUPT
762*5fd0122aSMatthias Ringwald //!
763*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIFG register and bits of \b UCAxIE register.
764*5fd0122aSMatthias Ringwald //!
765*5fd0122aSMatthias Ringwald //! \return None
766*5fd0122aSMatthias Ringwald //
767*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_enableInterrupt(uint32_t baseAddress,uint16_t mask)768*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_enableInterrupt(uint32_t baseAddress, uint16_t mask)
769*5fd0122aSMatthias Ringwald {
770*5fd0122aSMatthias Ringwald     ASSERT(
771*5fd0122aSMatthias Ringwald             !(mask
772*5fd0122aSMatthias Ringwald                     & ~(EUSCI_B_SPI_RECEIVE_INTERRUPT
773*5fd0122aSMatthias Ringwald                             | EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
774*5fd0122aSMatthias Ringwald 
775*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->IE |= mask;
776*5fd0122aSMatthias Ringwald }
777*5fd0122aSMatthias Ringwald 
778*5fd0122aSMatthias Ringwald //*****************************************************************************
779*5fd0122aSMatthias Ringwald //
780*5fd0122aSMatthias Ringwald //! \brief Disables individual SPI interrupt sources.
781*5fd0122aSMatthias Ringwald //!
782*5fd0122aSMatthias Ringwald //! Disables the indicated SPI interrupt sources. Only the sources that are
783*5fd0122aSMatthias Ringwald //! enabled can be reflected to the processor interrupt; disabled sources have
784*5fd0122aSMatthias Ringwald //! no effect on the processor.
785*5fd0122aSMatthias Ringwald //!
786*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
787*5fd0122aSMatthias Ringwald //! \param mask is the bit mask of the interrupt sources to be disabled.
788*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
789*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_TRANSMIT_INTERRUPT
790*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_RECEIVE_INTERRUPT
791*5fd0122aSMatthias Ringwald //!
792*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIE register.
793*5fd0122aSMatthias Ringwald //!
794*5fd0122aSMatthias Ringwald //! \return None
795*5fd0122aSMatthias Ringwald //
796*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_disableInterrupt(uint32_t baseAddress,uint16_t mask)797*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_disableInterrupt(uint32_t baseAddress, uint16_t mask)
798*5fd0122aSMatthias Ringwald {
799*5fd0122aSMatthias Ringwald     ASSERT(
800*5fd0122aSMatthias Ringwald             !(mask
801*5fd0122aSMatthias Ringwald                     & ~(EUSCI_B_SPI_RECEIVE_INTERRUPT
802*5fd0122aSMatthias Ringwald                             | EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
803*5fd0122aSMatthias Ringwald 
804*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->IE &= ~mask;
805*5fd0122aSMatthias Ringwald }
806*5fd0122aSMatthias Ringwald 
807*5fd0122aSMatthias Ringwald //*****************************************************************************
808*5fd0122aSMatthias Ringwald //
809*5fd0122aSMatthias Ringwald //! \brief Gets the current SPI interrupt status.
810*5fd0122aSMatthias Ringwald //!
811*5fd0122aSMatthias Ringwald //! This returns the interrupt status for the SPI module based on which flag is
812*5fd0122aSMatthias Ringwald //! passed.
813*5fd0122aSMatthias Ringwald //!
814*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
815*5fd0122aSMatthias Ringwald //! \param mask is the masked interrupt flag status to be returned.
816*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
817*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_TRANSMIT_INTERRUPT
818*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_RECEIVE_INTERRUPT
819*5fd0122aSMatthias Ringwald //!
820*5fd0122aSMatthias Ringwald //! \return Logical OR of any of the following:
821*5fd0122aSMatthias Ringwald //!         - \b EUSCI_B_SPI_TRANSMIT_INTERRUPT
822*5fd0122aSMatthias Ringwald //!         - \b EUSCI_B_SPI_RECEIVE_INTERRUPT
823*5fd0122aSMatthias Ringwald //!         \n indicating the status of the masked interrupts
824*5fd0122aSMatthias Ringwald //
825*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_getInterruptStatus(uint32_t baseAddress,uint8_t mask)826*5fd0122aSMatthias Ringwald uint8_t EUSCI_B_SPI_getInterruptStatus(uint32_t baseAddress, uint8_t mask)
827*5fd0122aSMatthias Ringwald {
828*5fd0122aSMatthias Ringwald     ASSERT(
829*5fd0122aSMatthias Ringwald             !(mask
830*5fd0122aSMatthias Ringwald                     & ~(EUSCI_B_SPI_RECEIVE_INTERRUPT
831*5fd0122aSMatthias Ringwald                             | EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
832*5fd0122aSMatthias Ringwald 
833*5fd0122aSMatthias Ringwald     return EUSCI_B_CMSIS(baseAddress)->IFG & mask;
834*5fd0122aSMatthias Ringwald }
835*5fd0122aSMatthias Ringwald 
836*5fd0122aSMatthias Ringwald //*****************************************************************************
837*5fd0122aSMatthias Ringwald //
838*5fd0122aSMatthias Ringwald //! \brief Clears the selected SPI interrupt status flag.
839*5fd0122aSMatthias Ringwald //!
840*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
841*5fd0122aSMatthias Ringwald //! \param mask is the masked interrupt flag to be cleared.
842*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
843*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_TRANSMIT_INTERRUPT
844*5fd0122aSMatthias Ringwald //!        - \b EUSCI_B_SPI_RECEIVE_INTERRUPT
845*5fd0122aSMatthias Ringwald //!
846*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIFG register.
847*5fd0122aSMatthias Ringwald //!
848*5fd0122aSMatthias Ringwald //! \return None
849*5fd0122aSMatthias Ringwald //
850*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_clearInterruptFlag(uint32_t baseAddress,uint16_t mask)851*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_clearInterruptFlag(uint32_t baseAddress, uint16_t mask)
852*5fd0122aSMatthias Ringwald {
853*5fd0122aSMatthias Ringwald     ASSERT(
854*5fd0122aSMatthias Ringwald             !(mask
855*5fd0122aSMatthias Ringwald                     & ~(EUSCI_B_SPI_RECEIVE_INTERRUPT
856*5fd0122aSMatthias Ringwald                             | EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
857*5fd0122aSMatthias Ringwald 
858*5fd0122aSMatthias Ringwald     EUSCI_B_CMSIS(baseAddress)->IFG &= ~mask;
859*5fd0122aSMatthias Ringwald }
860*5fd0122aSMatthias Ringwald 
861*5fd0122aSMatthias Ringwald //*****************************************************************************
862*5fd0122aSMatthias Ringwald //
863*5fd0122aSMatthias Ringwald //! \brief Enables the SPI block.
864*5fd0122aSMatthias Ringwald //!
865*5fd0122aSMatthias Ringwald //! This will enable operation of the SPI block.
866*5fd0122aSMatthias Ringwald //!
867*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
868*5fd0122aSMatthias Ringwald //!
869*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCBxCTLW0 register.
870*5fd0122aSMatthias Ringwald //!
871*5fd0122aSMatthias Ringwald //! \return None
872*5fd0122aSMatthias Ringwald //
873*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_enable(uint32_t baseAddress)874*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_enable(uint32_t baseAddress)
875*5fd0122aSMatthias Ringwald {
876*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
877*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
878*5fd0122aSMatthias Ringwald }
879*5fd0122aSMatthias Ringwald 
880*5fd0122aSMatthias Ringwald //*****************************************************************************
881*5fd0122aSMatthias Ringwald //
882*5fd0122aSMatthias Ringwald //! \brief Disables the SPI block.
883*5fd0122aSMatthias Ringwald //!
884*5fd0122aSMatthias Ringwald //! This will disable operation of the SPI block.
885*5fd0122aSMatthias Ringwald //!
886*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
887*5fd0122aSMatthias Ringwald //!
888*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCBxCTLW0 register.
889*5fd0122aSMatthias Ringwald //!
890*5fd0122aSMatthias Ringwald //! \return None
891*5fd0122aSMatthias Ringwald //
892*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_disable(uint32_t baseAddress)893*5fd0122aSMatthias Ringwald void EUSCI_B_SPI_disable(uint32_t baseAddress)
894*5fd0122aSMatthias Ringwald {
895*5fd0122aSMatthias Ringwald     //Set the UCSWRST bit to disable the USCI Module
896*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
897*5fd0122aSMatthias Ringwald }
898*5fd0122aSMatthias Ringwald 
899*5fd0122aSMatthias Ringwald //*****************************************************************************
900*5fd0122aSMatthias Ringwald //
901*5fd0122aSMatthias Ringwald //! \brief Returns the address of the RX Buffer of the SPI for the DMA module.
902*5fd0122aSMatthias Ringwald //!
903*5fd0122aSMatthias Ringwald //! Returns the address of the SPI RX Buffer. This can be used in conjunction
904*5fd0122aSMatthias Ringwald //! with the DMA to store the received data directly to memory.
905*5fd0122aSMatthias Ringwald //!
906*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
907*5fd0122aSMatthias Ringwald //!
908*5fd0122aSMatthias Ringwald //! \return the address of the RX Buffer
909*5fd0122aSMatthias Ringwald //
910*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_getReceiveBufferAddressForDMA(uint32_t baseAddress)911*5fd0122aSMatthias Ringwald uint32_t EUSCI_B_SPI_getReceiveBufferAddressForDMA(uint32_t baseAddress)
912*5fd0122aSMatthias Ringwald {
913*5fd0122aSMatthias Ringwald     return ((uint32_t)(&EUSCI_B_CMSIS(baseAddress)->RXBUF));
914*5fd0122aSMatthias Ringwald }
915*5fd0122aSMatthias Ringwald 
916*5fd0122aSMatthias Ringwald //*****************************************************************************
917*5fd0122aSMatthias Ringwald //
918*5fd0122aSMatthias Ringwald //! \brief Returns the address of the TX Buffer of the SPI for the DMA module.
919*5fd0122aSMatthias Ringwald //!
920*5fd0122aSMatthias Ringwald //! Returns the address of the SPI TX Buffer. This can be used in conjunction
921*5fd0122aSMatthias Ringwald //! with the DMA to obtain transmitted data directly from memory.
922*5fd0122aSMatthias Ringwald //!
923*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
924*5fd0122aSMatthias Ringwald //!
925*5fd0122aSMatthias Ringwald //! \return the address of the TX Buffer
926*5fd0122aSMatthias Ringwald //
927*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_getTransmitBufferAddressForDMA(uint32_t baseAddress)928*5fd0122aSMatthias Ringwald uint32_t EUSCI_B_SPI_getTransmitBufferAddressForDMA(uint32_t baseAddress)
929*5fd0122aSMatthias Ringwald {
930*5fd0122aSMatthias Ringwald     return ((uint32_t)(&EUSCI_B_CMSIS(baseAddress)->TXBUF));
931*5fd0122aSMatthias Ringwald }
932*5fd0122aSMatthias Ringwald 
933*5fd0122aSMatthias Ringwald //*****************************************************************************
934*5fd0122aSMatthias Ringwald //
935*5fd0122aSMatthias Ringwald //! \brief Indicates whether or not the SPI bus is busy.
936*5fd0122aSMatthias Ringwald //!
937*5fd0122aSMatthias Ringwald //! This function returns an indication of whether or not the SPI bus is
938*5fd0122aSMatthias Ringwald //! busy.This function checks the status of the bus via UCBUSY bit
939*5fd0122aSMatthias Ringwald //!
940*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_B_SPI module.
941*5fd0122aSMatthias Ringwald //!
942*5fd0122aSMatthias Ringwald //! \return true if busy, false otherwise
943*5fd0122aSMatthias Ringwald //
944*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_B_SPI_isBusy(uint32_t baseAddress)945*5fd0122aSMatthias Ringwald bool EUSCI_B_SPI_isBusy(uint32_t baseAddress)
946*5fd0122aSMatthias Ringwald {
947*5fd0122aSMatthias Ringwald     //Return the bus busy status.
948*5fd0122aSMatthias Ringwald     return BITBAND_PERI(EUSCI_B_CMSIS(baseAddress)->STATW, EUSCI_B_STATW_SPI_BUSY_OFS );
949*5fd0122aSMatthias Ringwald }
950*5fd0122aSMatthias Ringwald 
951*5fd0122aSMatthias Ringwald //*****************************************************************************
952*5fd0122aSMatthias Ringwald //
953*5fd0122aSMatthias Ringwald //! \brief Selects 4Pin Functionality
954*5fd0122aSMatthias Ringwald //!
955*5fd0122aSMatthias Ringwald //! This function should be invoked only in 4-wire mode. Invoking this function
956*5fd0122aSMatthias Ringwald //! has no effect in 3-wire mode.
957*5fd0122aSMatthias Ringwald //!
958*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
959*5fd0122aSMatthias Ringwald //! \param select4PinFunctionality selects 4 pin functionality
960*5fd0122aSMatthias Ringwald //!        Valid values are:
961*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_PREVENT_CONFLICTS_WITH_OTHER_MASTERS
962*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_ENABLE_SIGNAL_FOR_4WIRE_SLAVE
963*5fd0122aSMatthias Ringwald //!
964*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSTEM of \b UCAxCTLW0 register.
965*5fd0122aSMatthias Ringwald //!
966*5fd0122aSMatthias Ringwald //! \return None
967*5fd0122aSMatthias Ringwald //
968*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_select4PinFunctionality(uint32_t baseAddress,uint8_t select4PinFunctionality)969*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_select4PinFunctionality(uint32_t baseAddress,
970*5fd0122aSMatthias Ringwald         uint8_t select4PinFunctionality)
971*5fd0122aSMatthias Ringwald {
972*5fd0122aSMatthias Ringwald     ASSERT(
973*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_PREVENT_CONFLICTS_WITH_OTHER_MASTERS
974*5fd0122aSMatthias Ringwald                     == select4PinFunctionality)
975*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_ENABLE_SIGNAL_FOR_4WIRE_SLAVE
976*5fd0122aSMatthias Ringwald                     == select4PinFunctionality));
977*5fd0122aSMatthias Ringwald 
978*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->CTLW0 = (EUSCI_A_CMSIS(baseAddress)->CTLW0
979*5fd0122aSMatthias Ringwald             & ~EUSCI_A_CTLW0_STEM) | select4PinFunctionality;
980*5fd0122aSMatthias Ringwald }
981*5fd0122aSMatthias Ringwald 
982*5fd0122aSMatthias Ringwald //*****************************************************************************
983*5fd0122aSMatthias Ringwald //
984*5fd0122aSMatthias Ringwald //! \brief Initializes the SPI Master clock. At the end of this function call,
985*5fd0122aSMatthias Ringwald //! SPI module is left enabled.
986*5fd0122aSMatthias Ringwald //!
987*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
988*5fd0122aSMatthias Ringwald //! \param clockSourceFrequency is the frequency of the slected clock source
989*5fd0122aSMatthias Ringwald //! \param desiredSpiClock is the desired clock rate for SPI communication
990*5fd0122aSMatthias Ringwald //!
991*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCAxCTLW0 register.
992*5fd0122aSMatthias Ringwald //!
993*5fd0122aSMatthias Ringwald //! \return None
994*5fd0122aSMatthias Ringwald //
995*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_masterChangeClock(uint32_t baseAddress,uint32_t clockSourceFrequency,uint32_t desiredSpiClock)996*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_masterChangeClock(uint32_t baseAddress,
997*5fd0122aSMatthias Ringwald         uint32_t clockSourceFrequency, uint32_t desiredSpiClock)
998*5fd0122aSMatthias Ringwald {
999*5fd0122aSMatthias Ringwald     //Disable the USCI Module
1000*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
1001*5fd0122aSMatthias Ringwald 
1002*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->BRW = (uint16_t) (clockSourceFrequency
1003*5fd0122aSMatthias Ringwald             / desiredSpiClock);
1004*5fd0122aSMatthias Ringwald 
1005*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
1006*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
1007*5fd0122aSMatthias Ringwald }
1008*5fd0122aSMatthias Ringwald 
1009*5fd0122aSMatthias Ringwald //*****************************************************************************
1010*5fd0122aSMatthias Ringwald //
1011*5fd0122aSMatthias Ringwald //! \brief Initializes the SPI Slave block.
1012*5fd0122aSMatthias Ringwald //!
1013*5fd0122aSMatthias Ringwald //! Upon successful initialization of the SPI slave block, this function will
1014*5fd0122aSMatthias Ringwald //! have initailized the slave block, but the SPI Slave block still remains
1015*5fd0122aSMatthias Ringwald //! disabled and must be enabled with EUSCI_A_SPI_enable()
1016*5fd0122aSMatthias Ringwald //!
1017*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI Slave module.
1018*5fd0122aSMatthias Ringwald //! \param msbFirst controls the direction of the receive and transmit shift
1019*5fd0122aSMatthias Ringwald //!        register.
1020*5fd0122aSMatthias Ringwald //!        Valid values are:
1021*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_MSB_FIRST
1022*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_LSB_FIRST [Default]
1023*5fd0122aSMatthias Ringwald //! \param clockPhase is clock phase select.
1024*5fd0122aSMatthias Ringwald //!        Valid values are:
1025*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
1026*5fd0122aSMatthias Ringwald //!           [Default]
1027*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
1028*5fd0122aSMatthias Ringwald //! \param clockPolarity is clock polarity select
1029*5fd0122aSMatthias Ringwald //!        Valid values are:
1030*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
1031*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]
1032*5fd0122aSMatthias Ringwald //! \param spiMode is SPI mode select
1033*5fd0122aSMatthias Ringwald //!        Valid values are:
1034*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_3PIN
1035*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_HIGH
1036*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_LOW
1037*5fd0122aSMatthias Ringwald //!
1038*5fd0122aSMatthias Ringwald //! Modified bits are \b EUSCI_A_CTLW0_MSB, \b EUSCI_A_CTLW0_MST, \b EUSCI_A_CTLW0_SEVENBIT, \b EUSCI_A_CTLW0_CKPL, \b EUSCI_A_CTLW0_CKPH, \b
1039*5fd0122aSMatthias Ringwald //! UCMODE and \b UCSWRST of \b UCAxCTLW0 register.
1040*5fd0122aSMatthias Ringwald //!
1041*5fd0122aSMatthias Ringwald //! \return true
1042*5fd0122aSMatthias Ringwald //
1043*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_slaveInit(uint32_t baseAddress,uint16_t msbFirst,uint16_t clockPhase,uint16_t clockPolarity,uint16_t spiMode)1044*5fd0122aSMatthias Ringwald bool EUSCI_A_SPI_slaveInit(uint32_t baseAddress, uint16_t msbFirst,
1045*5fd0122aSMatthias Ringwald         uint16_t clockPhase, uint16_t clockPolarity, uint16_t spiMode)
1046*5fd0122aSMatthias Ringwald {
1047*5fd0122aSMatthias Ringwald     ASSERT(
1048*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_MSB_FIRST == msbFirst)
1049*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_LSB_FIRST == msbFirst));
1050*5fd0122aSMatthias Ringwald 
1051*5fd0122aSMatthias Ringwald     ASSERT(
1052*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
1053*5fd0122aSMatthias Ringwald                     == clockPhase)
1054*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
1055*5fd0122aSMatthias Ringwald                     == clockPhase));
1056*5fd0122aSMatthias Ringwald 
1057*5fd0122aSMatthias Ringwald     ASSERT(
1058*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH == clockPolarity)
1059*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW
1060*5fd0122aSMatthias Ringwald                     == clockPolarity));
1061*5fd0122aSMatthias Ringwald 
1062*5fd0122aSMatthias Ringwald     ASSERT(
1063*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_3PIN == spiMode)
1064*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_HIGH == spiMode)
1065*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_LOW == spiMode));
1066*5fd0122aSMatthias Ringwald 
1067*5fd0122aSMatthias Ringwald     //Disable USCI Module
1068*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
1069*5fd0122aSMatthias Ringwald 
1070*5fd0122aSMatthias Ringwald     //Reset OFS_UCAxCTLW0 register
1071*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->CTLW0 = (EUSCI_A_CMSIS(baseAddress)->CTLW0
1072*5fd0122aSMatthias Ringwald             & ~(EUSCI_A_CTLW0_MSB + EUSCI_A_CTLW0_SEVENBIT + EUSCI_A_CTLW0_MST + EUSCI_A_CTLW0_CKPL + EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_MODE_3))
1073*5fd0122aSMatthias Ringwald             | (clockPhase + clockPolarity + msbFirst + EUSCI_A_CTLW0_SYNC + spiMode);
1074*5fd0122aSMatthias Ringwald 
1075*5fd0122aSMatthias Ringwald     return true;
1076*5fd0122aSMatthias Ringwald }
1077*5fd0122aSMatthias Ringwald 
1078*5fd0122aSMatthias Ringwald //*****************************************************************************
1079*5fd0122aSMatthias Ringwald //
1080*5fd0122aSMatthias Ringwald //! \brief Changes the SPI colock phase and polarity. At the end of this
1081*5fd0122aSMatthias Ringwald //! function call, SPI module is left enabled.
1082*5fd0122aSMatthias Ringwald //!
1083*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1084*5fd0122aSMatthias Ringwald //! \param clockPhase is clock phase select.
1085*5fd0122aSMatthias Ringwald //!        Valid values are:
1086*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
1087*5fd0122aSMatthias Ringwald //!           [Default]
1088*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
1089*5fd0122aSMatthias Ringwald //! \param clockPolarity is clock polarity select
1090*5fd0122aSMatthias Ringwald //!        Valid values are:
1091*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH
1092*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]
1093*5fd0122aSMatthias Ringwald //!
1094*5fd0122aSMatthias Ringwald //! Modified bits are \b EUSCI_A_CTLW0_CKPL, \b EUSCI_A_CTLW0_CKPH and \b UCSWRST of \b UCAxCTLW0
1095*5fd0122aSMatthias Ringwald //! register.
1096*5fd0122aSMatthias Ringwald //!
1097*5fd0122aSMatthias Ringwald //! \return None
1098*5fd0122aSMatthias Ringwald //
1099*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_changeClockPhasePolarity(uint32_t baseAddress,uint16_t clockPhase,uint16_t clockPolarity)1100*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_changeClockPhasePolarity(uint32_t baseAddress,
1101*5fd0122aSMatthias Ringwald         uint16_t clockPhase, uint16_t clockPolarity)
1102*5fd0122aSMatthias Ringwald {
1103*5fd0122aSMatthias Ringwald 
1104*5fd0122aSMatthias Ringwald     ASSERT(
1105*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH == clockPolarity)
1106*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW
1107*5fd0122aSMatthias Ringwald                     == clockPolarity));
1108*5fd0122aSMatthias Ringwald 
1109*5fd0122aSMatthias Ringwald     ASSERT(
1110*5fd0122aSMatthias Ringwald             (EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT
1111*5fd0122aSMatthias Ringwald                     == clockPhase)
1112*5fd0122aSMatthias Ringwald             || (EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT
1113*5fd0122aSMatthias Ringwald                     == clockPhase));
1114*5fd0122aSMatthias Ringwald 
1115*5fd0122aSMatthias Ringwald     //Disable the USCI Module
1116*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
1117*5fd0122aSMatthias Ringwald 
1118*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->CTLW0 = (EUSCI_A_CMSIS(baseAddress)->CTLW0
1119*5fd0122aSMatthias Ringwald             & ~(EUSCI_A_CTLW0_CKPH + EUSCI_A_CTLW0_CKPL)) | (clockPhase + clockPolarity);
1120*5fd0122aSMatthias Ringwald 
1121*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
1122*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
1123*5fd0122aSMatthias Ringwald }
1124*5fd0122aSMatthias Ringwald 
1125*5fd0122aSMatthias Ringwald //*****************************************************************************
1126*5fd0122aSMatthias Ringwald //
1127*5fd0122aSMatthias Ringwald //! \brief Transmits a byte from the SPI Module.
1128*5fd0122aSMatthias Ringwald //!
1129*5fd0122aSMatthias Ringwald //! This function will place the supplied data into SPI trasmit data register
1130*5fd0122aSMatthias Ringwald //! to start transmission.
1131*5fd0122aSMatthias Ringwald //!
1132*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1133*5fd0122aSMatthias Ringwald //! \param transmitData data to be transmitted from the SPI module
1134*5fd0122aSMatthias Ringwald //!
1135*5fd0122aSMatthias Ringwald //! \return None
1136*5fd0122aSMatthias Ringwald //
1137*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_transmitData(uint32_t baseAddress,uint8_t transmitData)1138*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_transmitData(uint32_t baseAddress, uint8_t transmitData)
1139*5fd0122aSMatthias Ringwald {
1140*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->TXBUF = transmitData;
1141*5fd0122aSMatthias Ringwald }
1142*5fd0122aSMatthias Ringwald 
1143*5fd0122aSMatthias Ringwald //*****************************************************************************
1144*5fd0122aSMatthias Ringwald //
1145*5fd0122aSMatthias Ringwald //! \brief Receives a byte that has been sent to the SPI Module.
1146*5fd0122aSMatthias Ringwald //!
1147*5fd0122aSMatthias Ringwald //! This function reads a byte of data from the SPI receive data Register.
1148*5fd0122aSMatthias Ringwald //!
1149*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1150*5fd0122aSMatthias Ringwald //!
1151*5fd0122aSMatthias Ringwald //! \return Returns the byte received from by the SPI module, cast as an
1152*5fd0122aSMatthias Ringwald //!         uint8_t.
1153*5fd0122aSMatthias Ringwald //
1154*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_receiveData(uint32_t baseAddress)1155*5fd0122aSMatthias Ringwald uint8_t EUSCI_A_SPI_receiveData(uint32_t baseAddress)
1156*5fd0122aSMatthias Ringwald {
1157*5fd0122aSMatthias Ringwald     return EUSCI_A_CMSIS(baseAddress)->RXBUF;
1158*5fd0122aSMatthias Ringwald }
1159*5fd0122aSMatthias Ringwald 
1160*5fd0122aSMatthias Ringwald //*****************************************************************************
1161*5fd0122aSMatthias Ringwald //
1162*5fd0122aSMatthias Ringwald //! \brief Enables individual SPI interrupt sources.
1163*5fd0122aSMatthias Ringwald //!
1164*5fd0122aSMatthias Ringwald //! Enables the indicated SPI interrupt sources.  Only the sources that are
1165*5fd0122aSMatthias Ringwald //! enabled can be reflected to the processor interrupt; disabled sources have
1166*5fd0122aSMatthias Ringwald //! no effect on the processor. Does not clear interrupt flags.
1167*5fd0122aSMatthias Ringwald //!
1168*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1169*5fd0122aSMatthias Ringwald //! \param mask is the bit mask of the interrupt sources to be enabled.
1170*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
1171*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_TRANSMIT_INTERRUPT
1172*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_RECEIVE_INTERRUPT
1173*5fd0122aSMatthias Ringwald //!
1174*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIFG register and bits of \b UCAxIE register.
1175*5fd0122aSMatthias Ringwald //!
1176*5fd0122aSMatthias Ringwald //! \return None
1177*5fd0122aSMatthias Ringwald //
1178*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_enableInterrupt(uint32_t baseAddress,uint16_t mask)1179*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_enableInterrupt(uint32_t baseAddress, uint16_t mask)
1180*5fd0122aSMatthias Ringwald {
1181*5fd0122aSMatthias Ringwald     ASSERT(
1182*5fd0122aSMatthias Ringwald             !(mask
1183*5fd0122aSMatthias Ringwald                     & ~(EUSCI_A_SPI_RECEIVE_INTERRUPT
1184*5fd0122aSMatthias Ringwald                             | EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
1185*5fd0122aSMatthias Ringwald 
1186*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->IE |= mask;
1187*5fd0122aSMatthias Ringwald }
1188*5fd0122aSMatthias Ringwald 
1189*5fd0122aSMatthias Ringwald //*****************************************************************************
1190*5fd0122aSMatthias Ringwald //
1191*5fd0122aSMatthias Ringwald //! \brief Disables individual SPI interrupt sources.
1192*5fd0122aSMatthias Ringwald //!
1193*5fd0122aSMatthias Ringwald //! Disables the indicated SPI interrupt sources. Only the sources that are
1194*5fd0122aSMatthias Ringwald //! enabled can be reflected to the processor interrupt; disabled sources have
1195*5fd0122aSMatthias Ringwald //! no effect on the processor.
1196*5fd0122aSMatthias Ringwald //!
1197*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1198*5fd0122aSMatthias Ringwald //! \param mask is the bit mask of the interrupt sources to be disabled.
1199*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
1200*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_TRANSMIT_INTERRUPT
1201*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_RECEIVE_INTERRUPT
1202*5fd0122aSMatthias Ringwald //!
1203*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIE register.
1204*5fd0122aSMatthias Ringwald //!
1205*5fd0122aSMatthias Ringwald //! \return None
1206*5fd0122aSMatthias Ringwald //
1207*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_disableInterrupt(uint32_t baseAddress,uint16_t mask)1208*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_disableInterrupt(uint32_t baseAddress, uint16_t mask)
1209*5fd0122aSMatthias Ringwald {
1210*5fd0122aSMatthias Ringwald     ASSERT(
1211*5fd0122aSMatthias Ringwald             !(mask
1212*5fd0122aSMatthias Ringwald                     & ~(EUSCI_A_SPI_RECEIVE_INTERRUPT
1213*5fd0122aSMatthias Ringwald                             | EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
1214*5fd0122aSMatthias Ringwald 
1215*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->IE &= ~mask;
1216*5fd0122aSMatthias Ringwald }
1217*5fd0122aSMatthias Ringwald 
1218*5fd0122aSMatthias Ringwald //*****************************************************************************
1219*5fd0122aSMatthias Ringwald //
1220*5fd0122aSMatthias Ringwald //! \brief Gets the current SPI interrupt status.
1221*5fd0122aSMatthias Ringwald //!
1222*5fd0122aSMatthias Ringwald //! This returns the interrupt status for the SPI module based on which flag is
1223*5fd0122aSMatthias Ringwald //! passed.
1224*5fd0122aSMatthias Ringwald //!
1225*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1226*5fd0122aSMatthias Ringwald //! \param mask is the masked interrupt flag status to be returned.
1227*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
1228*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_TRANSMIT_INTERRUPT
1229*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_RECEIVE_INTERRUPT
1230*5fd0122aSMatthias Ringwald //!
1231*5fd0122aSMatthias Ringwald //! \return Logical OR of any of the following:
1232*5fd0122aSMatthias Ringwald //!         - \b EUSCI_A_SPI_TRANSMIT_INTERRUPT
1233*5fd0122aSMatthias Ringwald //!         - \b EUSCI_A_SPI_RECEIVE_INTERRUPT
1234*5fd0122aSMatthias Ringwald //!         \n indicating the status of the masked interrupts
1235*5fd0122aSMatthias Ringwald //
1236*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_getInterruptStatus(uint32_t baseAddress,uint8_t mask)1237*5fd0122aSMatthias Ringwald uint8_t EUSCI_A_SPI_getInterruptStatus(uint32_t baseAddress, uint8_t mask)
1238*5fd0122aSMatthias Ringwald {
1239*5fd0122aSMatthias Ringwald     ASSERT(
1240*5fd0122aSMatthias Ringwald             !(mask
1241*5fd0122aSMatthias Ringwald                     & ~(EUSCI_A_SPI_RECEIVE_INTERRUPT
1242*5fd0122aSMatthias Ringwald                             | EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
1243*5fd0122aSMatthias Ringwald 
1244*5fd0122aSMatthias Ringwald     return EUSCI_A_CMSIS(baseAddress)->IFG & mask;
1245*5fd0122aSMatthias Ringwald }
1246*5fd0122aSMatthias Ringwald 
1247*5fd0122aSMatthias Ringwald //*****************************************************************************
1248*5fd0122aSMatthias Ringwald //
1249*5fd0122aSMatthias Ringwald //! \brief Clears the selected SPI interrupt status flag.
1250*5fd0122aSMatthias Ringwald //!
1251*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1252*5fd0122aSMatthias Ringwald //! \param mask is the masked interrupt flag to be cleared.
1253*5fd0122aSMatthias Ringwald //!        Mask value is the logical OR of any of the following:
1254*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_TRANSMIT_INTERRUPT
1255*5fd0122aSMatthias Ringwald //!        - \b EUSCI_A_SPI_RECEIVE_INTERRUPT
1256*5fd0122aSMatthias Ringwald //!
1257*5fd0122aSMatthias Ringwald //! Modified bits of \b UCAxIFG register.
1258*5fd0122aSMatthias Ringwald //!
1259*5fd0122aSMatthias Ringwald //! \return None
1260*5fd0122aSMatthias Ringwald //
1261*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_clearInterruptFlag(uint32_t baseAddress,uint16_t mask)1262*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_clearInterruptFlag(uint32_t baseAddress, uint16_t mask)
1263*5fd0122aSMatthias Ringwald {
1264*5fd0122aSMatthias Ringwald     ASSERT(
1265*5fd0122aSMatthias Ringwald             !(mask
1266*5fd0122aSMatthias Ringwald                     & ~(EUSCI_A_SPI_RECEIVE_INTERRUPT
1267*5fd0122aSMatthias Ringwald                             | EUSCI_A_SPI_TRANSMIT_INTERRUPT)));
1268*5fd0122aSMatthias Ringwald 
1269*5fd0122aSMatthias Ringwald     EUSCI_A_CMSIS(baseAddress)->IFG &= ~mask;
1270*5fd0122aSMatthias Ringwald }
1271*5fd0122aSMatthias Ringwald 
1272*5fd0122aSMatthias Ringwald //*****************************************************************************
1273*5fd0122aSMatthias Ringwald //
1274*5fd0122aSMatthias Ringwald //! \brief Enables the SPI block.
1275*5fd0122aSMatthias Ringwald //!
1276*5fd0122aSMatthias Ringwald //! This will enable operation of the SPI block.
1277*5fd0122aSMatthias Ringwald //!
1278*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1279*5fd0122aSMatthias Ringwald //!
1280*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCAxCTLW0 register.
1281*5fd0122aSMatthias Ringwald //!
1282*5fd0122aSMatthias Ringwald //! \return None
1283*5fd0122aSMatthias Ringwald //
1284*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_enable(uint32_t baseAddress)1285*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_enable(uint32_t baseAddress)
1286*5fd0122aSMatthias Ringwald {
1287*5fd0122aSMatthias Ringwald     //Reset the UCSWRST bit to enable the USCI Module
1288*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 0;
1289*5fd0122aSMatthias Ringwald }
1290*5fd0122aSMatthias Ringwald 
1291*5fd0122aSMatthias Ringwald //*****************************************************************************
1292*5fd0122aSMatthias Ringwald //
1293*5fd0122aSMatthias Ringwald //! \brief Disables the SPI block.
1294*5fd0122aSMatthias Ringwald //!
1295*5fd0122aSMatthias Ringwald //! This will disable operation of the SPI block.
1296*5fd0122aSMatthias Ringwald //!
1297*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1298*5fd0122aSMatthias Ringwald //!
1299*5fd0122aSMatthias Ringwald //! Modified bits are \b UCSWRST of \b UCAxCTLW0 register.
1300*5fd0122aSMatthias Ringwald //!
1301*5fd0122aSMatthias Ringwald //! \return None
1302*5fd0122aSMatthias Ringwald //
1303*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_disable(uint32_t baseAddress)1304*5fd0122aSMatthias Ringwald void EUSCI_A_SPI_disable(uint32_t baseAddress)
1305*5fd0122aSMatthias Ringwald {
1306*5fd0122aSMatthias Ringwald     //Set the UCSWRST bit to disable the USCI Module
1307*5fd0122aSMatthias Ringwald     BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->CTLW0, EUSCI_A_CTLW0_SWRST_OFS) = 1;
1308*5fd0122aSMatthias Ringwald }
1309*5fd0122aSMatthias Ringwald 
1310*5fd0122aSMatthias Ringwald //*****************************************************************************
1311*5fd0122aSMatthias Ringwald //
1312*5fd0122aSMatthias Ringwald //! \brief Returns the address of the RX Buffer of the SPI for the DMA module.
1313*5fd0122aSMatthias Ringwald //!
1314*5fd0122aSMatthias Ringwald //! Returns the address of the SPI RX Buffer. This can be used in conjunction
1315*5fd0122aSMatthias Ringwald //! with the DMA to store the received data directly to memory.
1316*5fd0122aSMatthias Ringwald //!
1317*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1318*5fd0122aSMatthias Ringwald //!
1319*5fd0122aSMatthias Ringwald //! \return the address of the RX Buffer
1320*5fd0122aSMatthias Ringwald //
1321*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_getReceiveBufferAddressForDMA(uint32_t baseAddress)1322*5fd0122aSMatthias Ringwald uint32_t EUSCI_A_SPI_getReceiveBufferAddressForDMA(uint32_t baseAddress)
1323*5fd0122aSMatthias Ringwald {
1324*5fd0122aSMatthias Ringwald     return (uint32_t)&EUSCI_A_CMSIS(baseAddress)->RXBUF;
1325*5fd0122aSMatthias Ringwald }
1326*5fd0122aSMatthias Ringwald 
1327*5fd0122aSMatthias Ringwald //*****************************************************************************
1328*5fd0122aSMatthias Ringwald //
1329*5fd0122aSMatthias Ringwald //! \brief Returns the address of the TX Buffer of the SPI for the DMA module.
1330*5fd0122aSMatthias Ringwald //!
1331*5fd0122aSMatthias Ringwald //! Returns the address of the SPI TX Buffer. This can be used in conjunction
1332*5fd0122aSMatthias Ringwald //! with the DMA to obtain transmitted data directly from memory.
1333*5fd0122aSMatthias Ringwald //!
1334*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1335*5fd0122aSMatthias Ringwald //!
1336*5fd0122aSMatthias Ringwald //! \return the address of the TX Buffer
1337*5fd0122aSMatthias Ringwald //
1338*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_getTransmitBufferAddressForDMA(uint32_t baseAddress)1339*5fd0122aSMatthias Ringwald uint32_t EUSCI_A_SPI_getTransmitBufferAddressForDMA(uint32_t baseAddress)
1340*5fd0122aSMatthias Ringwald {
1341*5fd0122aSMatthias Ringwald     return (uint32_t)&EUSCI_A_CMSIS(baseAddress)->TXBUF;
1342*5fd0122aSMatthias Ringwald }
1343*5fd0122aSMatthias Ringwald 
1344*5fd0122aSMatthias Ringwald //*****************************************************************************
1345*5fd0122aSMatthias Ringwald //
1346*5fd0122aSMatthias Ringwald //! \brief Indicates whether or not the SPI bus is busy.
1347*5fd0122aSMatthias Ringwald //!
1348*5fd0122aSMatthias Ringwald //! This function returns an indication of whether or not the SPI bus is
1349*5fd0122aSMatthias Ringwald //! busy.This function checks the status of the bus via UCBUSY bit
1350*5fd0122aSMatthias Ringwald //!
1351*5fd0122aSMatthias Ringwald //! \param baseAddress is the base address of the EUSCI_A_SPI module.
1352*5fd0122aSMatthias Ringwald //!
1353*5fd0122aSMatthias Ringwald //! \return true if busy, false otherwise
1354*5fd0122aSMatthias Ringwald //*****************************************************************************
EUSCI_A_SPI_isBusy(uint32_t baseAddress)1355*5fd0122aSMatthias Ringwald bool EUSCI_A_SPI_isBusy(uint32_t baseAddress)
1356*5fd0122aSMatthias Ringwald {
1357*5fd0122aSMatthias Ringwald     //Return the bus busy status.
1358*5fd0122aSMatthias Ringwald     return BITBAND_PERI(EUSCI_A_CMSIS(baseAddress)->STATW, EUSCI_A_STATW_SPI_BUSY_OFS);
1359*5fd0122aSMatthias Ringwald }
1360