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