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 /* Standard Includes */
33*5fd0122aSMatthias Ringwald #include <stdint.h>
34*5fd0122aSMatthias Ringwald #include <stdbool.h>
35*5fd0122aSMatthias Ringwald
36*5fd0122aSMatthias Ringwald /* DriverLib Includes */
37*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/adc14.h>
38*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
39*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
40*5fd0122aSMatthias Ringwald
41*5fd0122aSMatthias Ringwald /* Statics */
42*5fd0122aSMatthias Ringwald static volatile uint32_t* const _ctlRegs[32] =
43*5fd0122aSMatthias Ringwald { &ADC14->MCTL[0], &ADC14->MCTL[1], &ADC14->MCTL[2], &ADC14->MCTL[3],
44*5fd0122aSMatthias Ringwald &ADC14->MCTL[4], &ADC14->MCTL[5], &ADC14->MCTL[6], &ADC14->MCTL[7],
45*5fd0122aSMatthias Ringwald &ADC14->MCTL[8], &ADC14->MCTL[9], &ADC14->MCTL[10],
46*5fd0122aSMatthias Ringwald &ADC14->MCTL[11], &ADC14->MCTL[12], &ADC14->MCTL[13],
47*5fd0122aSMatthias Ringwald &ADC14->MCTL[14], &ADC14->MCTL[15], &ADC14->MCTL[16],
48*5fd0122aSMatthias Ringwald &ADC14->MCTL[17], &ADC14->MCTL[18], &ADC14->MCTL[19],
49*5fd0122aSMatthias Ringwald &ADC14->MCTL[20], &ADC14->MCTL[21], &ADC14->MCTL[22],
50*5fd0122aSMatthias Ringwald &ADC14->MCTL[23], &ADC14->MCTL[24], &ADC14->MCTL[25],
51*5fd0122aSMatthias Ringwald &ADC14->MCTL[26], &ADC14->MCTL[27], &ADC14->MCTL[28],
52*5fd0122aSMatthias Ringwald &ADC14->MCTL[29], &ADC14->MCTL[30], &ADC14->MCTL[31] };
53*5fd0122aSMatthias Ringwald
_getIndexForMemRegister(uint32_t reg)54*5fd0122aSMatthias Ringwald static uint_fast8_t _getIndexForMemRegister(uint32_t reg)
55*5fd0122aSMatthias Ringwald {
56*5fd0122aSMatthias Ringwald switch (reg)
57*5fd0122aSMatthias Ringwald {
58*5fd0122aSMatthias Ringwald case ADC_MEM0:
59*5fd0122aSMatthias Ringwald return 0;
60*5fd0122aSMatthias Ringwald case ADC_MEM1:
61*5fd0122aSMatthias Ringwald return 1;
62*5fd0122aSMatthias Ringwald case ADC_MEM2:
63*5fd0122aSMatthias Ringwald return 2;
64*5fd0122aSMatthias Ringwald case ADC_MEM3:
65*5fd0122aSMatthias Ringwald return 3;
66*5fd0122aSMatthias Ringwald case ADC_MEM4:
67*5fd0122aSMatthias Ringwald return 4;
68*5fd0122aSMatthias Ringwald case ADC_MEM5:
69*5fd0122aSMatthias Ringwald return 5;
70*5fd0122aSMatthias Ringwald case ADC_MEM6:
71*5fd0122aSMatthias Ringwald return 6;
72*5fd0122aSMatthias Ringwald case ADC_MEM7:
73*5fd0122aSMatthias Ringwald return 7;
74*5fd0122aSMatthias Ringwald case ADC_MEM8:
75*5fd0122aSMatthias Ringwald return 8;
76*5fd0122aSMatthias Ringwald case ADC_MEM9:
77*5fd0122aSMatthias Ringwald return 9;
78*5fd0122aSMatthias Ringwald case ADC_MEM10:
79*5fd0122aSMatthias Ringwald return 10;
80*5fd0122aSMatthias Ringwald case ADC_MEM11:
81*5fd0122aSMatthias Ringwald return 11;
82*5fd0122aSMatthias Ringwald case ADC_MEM12:
83*5fd0122aSMatthias Ringwald return 12;
84*5fd0122aSMatthias Ringwald case ADC_MEM13:
85*5fd0122aSMatthias Ringwald return 13;
86*5fd0122aSMatthias Ringwald case ADC_MEM14:
87*5fd0122aSMatthias Ringwald return 14;
88*5fd0122aSMatthias Ringwald case ADC_MEM15:
89*5fd0122aSMatthias Ringwald return 15;
90*5fd0122aSMatthias Ringwald case ADC_MEM16:
91*5fd0122aSMatthias Ringwald return 16;
92*5fd0122aSMatthias Ringwald case ADC_MEM17:
93*5fd0122aSMatthias Ringwald return 17;
94*5fd0122aSMatthias Ringwald case ADC_MEM18:
95*5fd0122aSMatthias Ringwald return 18;
96*5fd0122aSMatthias Ringwald case ADC_MEM19:
97*5fd0122aSMatthias Ringwald return 19;
98*5fd0122aSMatthias Ringwald case ADC_MEM20:
99*5fd0122aSMatthias Ringwald return 20;
100*5fd0122aSMatthias Ringwald case ADC_MEM21:
101*5fd0122aSMatthias Ringwald return 21;
102*5fd0122aSMatthias Ringwald case ADC_MEM22:
103*5fd0122aSMatthias Ringwald return 22;
104*5fd0122aSMatthias Ringwald case ADC_MEM23:
105*5fd0122aSMatthias Ringwald return 23;
106*5fd0122aSMatthias Ringwald case ADC_MEM24:
107*5fd0122aSMatthias Ringwald return 24;
108*5fd0122aSMatthias Ringwald case ADC_MEM25:
109*5fd0122aSMatthias Ringwald return 25;
110*5fd0122aSMatthias Ringwald case ADC_MEM26:
111*5fd0122aSMatthias Ringwald return 26;
112*5fd0122aSMatthias Ringwald case ADC_MEM27:
113*5fd0122aSMatthias Ringwald return 27;
114*5fd0122aSMatthias Ringwald case ADC_MEM28:
115*5fd0122aSMatthias Ringwald return 28;
116*5fd0122aSMatthias Ringwald case ADC_MEM29:
117*5fd0122aSMatthias Ringwald return 29;
118*5fd0122aSMatthias Ringwald case ADC_MEM30:
119*5fd0122aSMatthias Ringwald return 30;
120*5fd0122aSMatthias Ringwald case ADC_MEM31:
121*5fd0122aSMatthias Ringwald return 31;
122*5fd0122aSMatthias Ringwald default:
123*5fd0122aSMatthias Ringwald ASSERT(false);
124*5fd0122aSMatthias Ringwald return ADC_INVALID_MEM;
125*5fd0122aSMatthias Ringwald
126*5fd0122aSMatthias Ringwald }
127*5fd0122aSMatthias Ringwald }
128*5fd0122aSMatthias Ringwald
129*5fd0122aSMatthias Ringwald //*****************************************************************************
130*5fd0122aSMatthias Ringwald //
131*5fd0122aSMatthias Ringwald //!
132*5fd0122aSMatthias Ringwald //! Returns a boolean value that tells if conversion is active/running or is
133*5fd0122aSMatthias Ringwald //! not acMSP432 ted.
134*5fd0122aSMatthias Ringwald //!
135*5fd0122aSMatthias Ringwald //! Originally a public function, but moved to static. External customers should
136*5fd0122aSMatthias Ringwald //! use the ADC14_isBusy function.
137*5fd0122aSMatthias Ringwald //!
138*5fd0122aSMatthias Ringwald //! \return true if conversion is active, false otherwise
139*5fd0122aSMatthias Ringwald //
140*5fd0122aSMatthias Ringwald //*****************************************************************************
ADCIsConversionRunning(void)141*5fd0122aSMatthias Ringwald static bool ADCIsConversionRunning(void)
142*5fd0122aSMatthias Ringwald {
143*5fd0122aSMatthias Ringwald return BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_BUSY_OFS);
144*5fd0122aSMatthias Ringwald }
145*5fd0122aSMatthias Ringwald
ADC14_enableModule(void)146*5fd0122aSMatthias Ringwald void ADC14_enableModule(void)
147*5fd0122aSMatthias Ringwald {
148*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_ON_OFS) = 1;
149*5fd0122aSMatthias Ringwald }
150*5fd0122aSMatthias Ringwald
ADC14_disableModule(void)151*5fd0122aSMatthias Ringwald bool ADC14_disableModule(void)
152*5fd0122aSMatthias Ringwald {
153*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
154*5fd0122aSMatthias Ringwald return false;
155*5fd0122aSMatthias Ringwald
156*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_ON_OFS) = 0;
157*5fd0122aSMatthias Ringwald
158*5fd0122aSMatthias Ringwald return true;
159*5fd0122aSMatthias Ringwald }
160*5fd0122aSMatthias Ringwald
ADC14_enableSampleTimer(uint32_t multiSampleConvert)161*5fd0122aSMatthias Ringwald bool ADC14_enableSampleTimer(uint32_t multiSampleConvert)
162*5fd0122aSMatthias Ringwald {
163*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
164*5fd0122aSMatthias Ringwald return false;
165*5fd0122aSMatthias Ringwald
166*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_SHP_OFS) = 1;
167*5fd0122aSMatthias Ringwald
168*5fd0122aSMatthias Ringwald if (multiSampleConvert == ADC_MANUAL_ITERATION)
169*5fd0122aSMatthias Ringwald {
170*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_MSC_OFS) = 0;
171*5fd0122aSMatthias Ringwald } else
172*5fd0122aSMatthias Ringwald {
173*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_MSC_OFS) = 1;
174*5fd0122aSMatthias Ringwald }
175*5fd0122aSMatthias Ringwald
176*5fd0122aSMatthias Ringwald return true;
177*5fd0122aSMatthias Ringwald }
178*5fd0122aSMatthias Ringwald
ADC14_disableSampleTimer(void)179*5fd0122aSMatthias Ringwald bool ADC14_disableSampleTimer(void)
180*5fd0122aSMatthias Ringwald {
181*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
182*5fd0122aSMatthias Ringwald return false;
183*5fd0122aSMatthias Ringwald
184*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_SHP_OFS) = 0;
185*5fd0122aSMatthias Ringwald
186*5fd0122aSMatthias Ringwald return true;
187*5fd0122aSMatthias Ringwald }
188*5fd0122aSMatthias Ringwald
ADC14_initModule(uint32_t clockSource,uint32_t clockPredivider,uint32_t clockDivider,uint32_t internalChannelMask)189*5fd0122aSMatthias Ringwald bool ADC14_initModule(uint32_t clockSource, uint32_t clockPredivider,
190*5fd0122aSMatthias Ringwald uint32_t clockDivider, uint32_t internalChannelMask)
191*5fd0122aSMatthias Ringwald {
192*5fd0122aSMatthias Ringwald ASSERT(
193*5fd0122aSMatthias Ringwald clockSource == ADC_CLOCKSOURCE_ADCOSC
194*5fd0122aSMatthias Ringwald || clockSource == ADC_CLOCKSOURCE_SYSOSC
195*5fd0122aSMatthias Ringwald || clockSource == ADC_CLOCKSOURCE_ACLK
196*5fd0122aSMatthias Ringwald || clockSource == ADC_CLOCKSOURCE_MCLK
197*5fd0122aSMatthias Ringwald || clockSource == ADC_CLOCKSOURCE_SMCLK
198*5fd0122aSMatthias Ringwald || clockSource == ADC_CLOCKSOURCE_HSMCLK);
199*5fd0122aSMatthias Ringwald
200*5fd0122aSMatthias Ringwald ASSERT(
201*5fd0122aSMatthias Ringwald clockPredivider == ADC_PREDIVIDER_1
202*5fd0122aSMatthias Ringwald || clockPredivider == ADC_PREDIVIDER_4
203*5fd0122aSMatthias Ringwald || clockPredivider == ADC_PREDIVIDER_32
204*5fd0122aSMatthias Ringwald || clockPredivider == ADC_PREDIVIDER_64);
205*5fd0122aSMatthias Ringwald
206*5fd0122aSMatthias Ringwald ASSERT(
207*5fd0122aSMatthias Ringwald clockDivider == ADC_DIVIDER_1 || clockDivider == ADC_DIVIDER_2
208*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_3
209*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_4
210*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_5
211*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_6
212*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_7
213*5fd0122aSMatthias Ringwald || clockDivider == ADC_DIVIDER_8);
214*5fd0122aSMatthias Ringwald
215*5fd0122aSMatthias Ringwald ASSERT(
216*5fd0122aSMatthias Ringwald !(internalChannelMask
217*5fd0122aSMatthias Ringwald & ~(ADC_MAPINTCH3 | ADC_MAPINTCH2 | ADC_MAPINTCH1
218*5fd0122aSMatthias Ringwald | ADC_MAPINTCH0 | ADC_TEMPSENSEMAP | ADC_BATTMAP)));
219*5fd0122aSMatthias Ringwald
220*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
221*5fd0122aSMatthias Ringwald return false;
222*5fd0122aSMatthias Ringwald
223*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0
224*5fd0122aSMatthias Ringwald & ~(ADC14_CTL0_PDIV_MASK | ADC14_CTL0_DIV_MASK | ADC14_CTL0_SSEL_MASK))
225*5fd0122aSMatthias Ringwald | clockDivider | clockPredivider | clockSource;
226*5fd0122aSMatthias Ringwald
227*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1
228*5fd0122aSMatthias Ringwald & ~(ADC_MAPINTCH3 | ADC_MAPINTCH2 | ADC_MAPINTCH1 | ADC_MAPINTCH0
229*5fd0122aSMatthias Ringwald | ADC_TEMPSENSEMAP | ADC_BATTMAP)) | internalChannelMask;
230*5fd0122aSMatthias Ringwald
231*5fd0122aSMatthias Ringwald return true;
232*5fd0122aSMatthias Ringwald }
233*5fd0122aSMatthias Ringwald
ADC14_setResolution(uint32_t resolution)234*5fd0122aSMatthias Ringwald void ADC14_setResolution(uint32_t resolution)
235*5fd0122aSMatthias Ringwald {
236*5fd0122aSMatthias Ringwald ASSERT(
237*5fd0122aSMatthias Ringwald resolution == ADC_8BIT || resolution == ADC_10BIT
238*5fd0122aSMatthias Ringwald || resolution == ADC_12BIT || resolution == ADC_14BIT);
239*5fd0122aSMatthias Ringwald
240*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1 & ~ADC14_CTL1_RES_MASK) | resolution;
241*5fd0122aSMatthias Ringwald }
242*5fd0122aSMatthias Ringwald
ADC14_getResolution(void)243*5fd0122aSMatthias Ringwald uint_fast32_t ADC14_getResolution(void)
244*5fd0122aSMatthias Ringwald {
245*5fd0122aSMatthias Ringwald return ADC14->CTL1 & ADC14_CTL1_RES_MASK;
246*5fd0122aSMatthias Ringwald }
247*5fd0122aSMatthias Ringwald
ADC14_setSampleHoldTrigger(uint32_t source,bool invertSignal)248*5fd0122aSMatthias Ringwald bool ADC14_setSampleHoldTrigger(uint32_t source, bool invertSignal)
249*5fd0122aSMatthias Ringwald {
250*5fd0122aSMatthias Ringwald
251*5fd0122aSMatthias Ringwald ASSERT(
252*5fd0122aSMatthias Ringwald source == ADC_TRIGGER_ADCSC || source == ADC_TRIGGER_SOURCE1
253*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE2
254*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE3
255*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE4
256*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE5
257*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE6
258*5fd0122aSMatthias Ringwald || source == ADC_TRIGGER_SOURCE7);
259*5fd0122aSMatthias Ringwald
260*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
261*5fd0122aSMatthias Ringwald return false;
262*5fd0122aSMatthias Ringwald
263*5fd0122aSMatthias Ringwald if (invertSignal)
264*5fd0122aSMatthias Ringwald {
265*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0
266*5fd0122aSMatthias Ringwald & ~(ADC14_CTL0_ISSH | ADC14_CTL0_SHS_MASK)) | source
267*5fd0122aSMatthias Ringwald | ADC14_CTL0_ISSH;
268*5fd0122aSMatthias Ringwald } else
269*5fd0122aSMatthias Ringwald {
270*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0
271*5fd0122aSMatthias Ringwald & ~(ADC14_CTL0_ISSH | ADC14_CTL0_SHS_MASK)) | source;
272*5fd0122aSMatthias Ringwald }
273*5fd0122aSMatthias Ringwald
274*5fd0122aSMatthias Ringwald return true;
275*5fd0122aSMatthias Ringwald }
276*5fd0122aSMatthias Ringwald
ADC14_setSampleHoldTime(uint32_t firstPulseWidth,uint32_t secondPulseWidth)277*5fd0122aSMatthias Ringwald bool ADC14_setSampleHoldTime(uint32_t firstPulseWidth,
278*5fd0122aSMatthias Ringwald uint32_t secondPulseWidth)
279*5fd0122aSMatthias Ringwald {
280*5fd0122aSMatthias Ringwald ASSERT(
281*5fd0122aSMatthias Ringwald firstPulseWidth == ADC_PULSE_WIDTH_4
282*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_8
283*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_16
284*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_32
285*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_64
286*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_96
287*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_128
288*5fd0122aSMatthias Ringwald || firstPulseWidth == ADC_PULSE_WIDTH_192);
289*5fd0122aSMatthias Ringwald
290*5fd0122aSMatthias Ringwald ASSERT(
291*5fd0122aSMatthias Ringwald secondPulseWidth == ADC_PULSE_WIDTH_4
292*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_8
293*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_16
294*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_32
295*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_64
296*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_96
297*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_128
298*5fd0122aSMatthias Ringwald || secondPulseWidth == ADC_PULSE_WIDTH_192);
299*5fd0122aSMatthias Ringwald
300*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
301*5fd0122aSMatthias Ringwald return false;
302*5fd0122aSMatthias Ringwald
303*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0
304*5fd0122aSMatthias Ringwald & ~(ADC14_CTL0_SHT0_MASK | ADC14_CTL0_SHT1_MASK)) | secondPulseWidth
305*5fd0122aSMatthias Ringwald | (firstPulseWidth >> 4);
306*5fd0122aSMatthias Ringwald
307*5fd0122aSMatthias Ringwald return true;
308*5fd0122aSMatthias Ringwald }
309*5fd0122aSMatthias Ringwald
ADC14_configureMultiSequenceMode(uint32_t memoryStart,uint32_t memoryEnd,bool repeatMode)310*5fd0122aSMatthias Ringwald bool ADC14_configureMultiSequenceMode(uint32_t memoryStart, uint32_t memoryEnd,
311*5fd0122aSMatthias Ringwald bool repeatMode)
312*5fd0122aSMatthias Ringwald {
313*5fd0122aSMatthias Ringwald uint32_t ii;
314*5fd0122aSMatthias Ringwald
315*5fd0122aSMatthias Ringwald ASSERT(
316*5fd0122aSMatthias Ringwald _getIndexForMemRegister(memoryStart) != ADC_INVALID_MEM
317*5fd0122aSMatthias Ringwald && _getIndexForMemRegister(memoryEnd) != ADC_INVALID_MEM);
318*5fd0122aSMatthias Ringwald
319*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
320*5fd0122aSMatthias Ringwald return false;
321*5fd0122aSMatthias Ringwald
322*5fd0122aSMatthias Ringwald /* Clearing out any lingering EOS */
323*5fd0122aSMatthias Ringwald for (ii = 0; ii < 32; ii++)
324*5fd0122aSMatthias Ringwald {
325*5fd0122aSMatthias Ringwald BITBAND_PERI(*(_ctlRegs[ii]), ADC14_MCTLN_EOS_OFS) = 0;
326*5fd0122aSMatthias Ringwald }
327*5fd0122aSMatthias Ringwald
328*5fd0122aSMatthias Ringwald uint_fast8_t memEndIndex = _getIndexForMemRegister(memoryEnd);
329*5fd0122aSMatthias Ringwald if (memEndIndex != ADC_INVALID_MEM)
330*5fd0122aSMatthias Ringwald {
331*5fd0122aSMatthias Ringwald /* Setting Start/Stop locations */
332*5fd0122aSMatthias Ringwald BITBAND_PERI(
333*5fd0122aSMatthias Ringwald (*(_ctlRegs[memEndIndex])),
334*5fd0122aSMatthias Ringwald ADC14_MCTLN_EOS_OFS) = 1;
335*5fd0122aSMatthias Ringwald
336*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1 & ~(ADC14_CTL1_CSTARTADD_MASK))
337*5fd0122aSMatthias Ringwald | (_getIndexForMemRegister(memoryStart) << 16);
338*5fd0122aSMatthias Ringwald
339*5fd0122aSMatthias Ringwald /* Setting multiple sample mode */
340*5fd0122aSMatthias Ringwald if (!repeatMode)
341*5fd0122aSMatthias Ringwald {
342*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0 & ~(ADC14_CTL0_CONSEQ_MASK))
343*5fd0122aSMatthias Ringwald | (ADC14_CTL0_CONSEQ_1);
344*5fd0122aSMatthias Ringwald } else
345*5fd0122aSMatthias Ringwald {
346*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0 & ~(ADC14_CTL0_CONSEQ_MASK))
347*5fd0122aSMatthias Ringwald | (ADC14_CTL0_CONSEQ_3);
348*5fd0122aSMatthias Ringwald }
349*5fd0122aSMatthias Ringwald
350*5fd0122aSMatthias Ringwald return true;
351*5fd0122aSMatthias Ringwald }
352*5fd0122aSMatthias Ringwald else
353*5fd0122aSMatthias Ringwald {
354*5fd0122aSMatthias Ringwald return false;
355*5fd0122aSMatthias Ringwald }
356*5fd0122aSMatthias Ringwald }
357*5fd0122aSMatthias Ringwald
ADC14_configureSingleSampleMode(uint32_t memoryDestination,bool repeatMode)358*5fd0122aSMatthias Ringwald bool ADC14_configureSingleSampleMode(uint32_t memoryDestination,
359*5fd0122aSMatthias Ringwald bool repeatMode)
360*5fd0122aSMatthias Ringwald {
361*5fd0122aSMatthias Ringwald ASSERT(_getIndexForMemRegister(memoryDestination) != 32);
362*5fd0122aSMatthias Ringwald
363*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
364*5fd0122aSMatthias Ringwald return false;
365*5fd0122aSMatthias Ringwald
366*5fd0122aSMatthias Ringwald /* Setting the destination register */
367*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1 & ~(ADC14_CTL1_CSTARTADD_MASK))
368*5fd0122aSMatthias Ringwald | (_getIndexForMemRegister(memoryDestination) << 16);
369*5fd0122aSMatthias Ringwald
370*5fd0122aSMatthias Ringwald /* Setting single sample mode */
371*5fd0122aSMatthias Ringwald if (!repeatMode)
372*5fd0122aSMatthias Ringwald {
373*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0 & ~(ADC14_CTL0_CONSEQ_MASK))
374*5fd0122aSMatthias Ringwald | (ADC14_CTL0_CONSEQ_0);
375*5fd0122aSMatthias Ringwald } else
376*5fd0122aSMatthias Ringwald {
377*5fd0122aSMatthias Ringwald ADC14->CTL0 = (ADC14->CTL0 & ~(ADC14_CTL0_CONSEQ_MASK))
378*5fd0122aSMatthias Ringwald | (ADC14_CTL0_CONSEQ_2);
379*5fd0122aSMatthias Ringwald }
380*5fd0122aSMatthias Ringwald
381*5fd0122aSMatthias Ringwald return true;
382*5fd0122aSMatthias Ringwald }
383*5fd0122aSMatthias Ringwald
ADC14_enableConversion(void)384*5fd0122aSMatthias Ringwald bool ADC14_enableConversion(void)
385*5fd0122aSMatthias Ringwald {
386*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning() || !BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_ON_OFS))
387*5fd0122aSMatthias Ringwald return false;
388*5fd0122aSMatthias Ringwald
389*5fd0122aSMatthias Ringwald ADC14->CTL0 |= (ADC14_CTL0_ENC);
390*5fd0122aSMatthias Ringwald
391*5fd0122aSMatthias Ringwald return true;
392*5fd0122aSMatthias Ringwald }
393*5fd0122aSMatthias Ringwald
ADC14_toggleConversionTrigger(void)394*5fd0122aSMatthias Ringwald bool ADC14_toggleConversionTrigger(void)
395*5fd0122aSMatthias Ringwald {
396*5fd0122aSMatthias Ringwald if (!BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_ON_OFS))
397*5fd0122aSMatthias Ringwald return false;
398*5fd0122aSMatthias Ringwald
399*5fd0122aSMatthias Ringwald if (BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_SC_OFS))
400*5fd0122aSMatthias Ringwald {
401*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_SC_OFS) = 0;
402*5fd0122aSMatthias Ringwald } else
403*5fd0122aSMatthias Ringwald {
404*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_SC_OFS) = 1;
405*5fd0122aSMatthias Ringwald }
406*5fd0122aSMatthias Ringwald
407*5fd0122aSMatthias Ringwald return true;
408*5fd0122aSMatthias Ringwald }
409*5fd0122aSMatthias Ringwald
ADC14_disableConversion(void)410*5fd0122aSMatthias Ringwald void ADC14_disableConversion(void)
411*5fd0122aSMatthias Ringwald {
412*5fd0122aSMatthias Ringwald ADC14->CTL0 &= ~(ADC14_CTL0_SC | ADC14_CTL0_ENC);
413*5fd0122aSMatthias Ringwald }
414*5fd0122aSMatthias Ringwald
ADC14_isBusy(void)415*5fd0122aSMatthias Ringwald bool ADC14_isBusy(void)
416*5fd0122aSMatthias Ringwald {
417*5fd0122aSMatthias Ringwald return BITBAND_PERI(ADC14->CTL0, ADC14_CTL0_BUSY_OFS);
418*5fd0122aSMatthias Ringwald }
419*5fd0122aSMatthias Ringwald
ADC14_configureConversionMemory(uint32_t memorySelect,uint32_t refSelect,uint32_t channelSelect,bool differntialMode)420*5fd0122aSMatthias Ringwald bool ADC14_configureConversionMemory(uint32_t memorySelect, uint32_t refSelect,
421*5fd0122aSMatthias Ringwald uint32_t channelSelect, bool differntialMode)
422*5fd0122aSMatthias Ringwald {
423*5fd0122aSMatthias Ringwald uint32_t currentReg, ii;
424*5fd0122aSMatthias Ringwald uint32_t *curReg;
425*5fd0122aSMatthias Ringwald
426*5fd0122aSMatthias Ringwald /* Initialization */
427*5fd0122aSMatthias Ringwald ii = 1;
428*5fd0122aSMatthias Ringwald currentReg = 0x01;
429*5fd0122aSMatthias Ringwald
430*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
431*5fd0122aSMatthias Ringwald return false;
432*5fd0122aSMatthias Ringwald
433*5fd0122aSMatthias Ringwald while (memorySelect != 0)
434*5fd0122aSMatthias Ringwald {
435*5fd0122aSMatthias Ringwald if (!(memorySelect & ii))
436*5fd0122aSMatthias Ringwald {
437*5fd0122aSMatthias Ringwald ii = ii << 1;
438*5fd0122aSMatthias Ringwald continue;
439*5fd0122aSMatthias Ringwald }
440*5fd0122aSMatthias Ringwald
441*5fd0122aSMatthias Ringwald currentReg = memorySelect & ii;
442*5fd0122aSMatthias Ringwald memorySelect &= ~ii;
443*5fd0122aSMatthias Ringwald ii = ii << 1;
444*5fd0122aSMatthias Ringwald
445*5fd0122aSMatthias Ringwald uint_fast8_t currRegIndex = _getIndexForMemRegister(currentReg);
446*5fd0122aSMatthias Ringwald if (currRegIndex != ADC_INVALID_MEM)
447*5fd0122aSMatthias Ringwald {
448*5fd0122aSMatthias Ringwald curReg = (uint32_t*) _ctlRegs[currRegIndex];
449*5fd0122aSMatthias Ringwald
450*5fd0122aSMatthias Ringwald if (differntialMode)
451*5fd0122aSMatthias Ringwald {
452*5fd0122aSMatthias Ringwald (*curReg) = ((*curReg)
453*5fd0122aSMatthias Ringwald & ~(ADC14_MCTLN_VRSEL_MASK | ADC14_MCTLN_INCH_MASK
454*5fd0122aSMatthias Ringwald | ADC14_MCTLN_DIF))
455*5fd0122aSMatthias Ringwald | (channelSelect | refSelect | ADC14_MCTLN_DIF);
456*5fd0122aSMatthias Ringwald } else
457*5fd0122aSMatthias Ringwald {
458*5fd0122aSMatthias Ringwald (*curReg) = ((*curReg)
459*5fd0122aSMatthias Ringwald & ~(ADC14_MCTLN_VRSEL_MASK | ADC14_MCTLN_INCH_MASK
460*5fd0122aSMatthias Ringwald | ADC14_MCTLN_DIF)) | (channelSelect | refSelect);
461*5fd0122aSMatthias Ringwald }
462*5fd0122aSMatthias Ringwald }
463*5fd0122aSMatthias Ringwald else
464*5fd0122aSMatthias Ringwald {
465*5fd0122aSMatthias Ringwald return false;
466*5fd0122aSMatthias Ringwald }
467*5fd0122aSMatthias Ringwald }
468*5fd0122aSMatthias Ringwald
469*5fd0122aSMatthias Ringwald return true;
470*5fd0122aSMatthias Ringwald }
471*5fd0122aSMatthias Ringwald
ADC14_enableComparatorWindow(uint32_t memorySelect,uint32_t windowSelect)472*5fd0122aSMatthias Ringwald bool ADC14_enableComparatorWindow(uint32_t memorySelect, uint32_t windowSelect)
473*5fd0122aSMatthias Ringwald {
474*5fd0122aSMatthias Ringwald uint32_t currentReg, ii;
475*5fd0122aSMatthias Ringwald uint32_t *curRegPoint;
476*5fd0122aSMatthias Ringwald
477*5fd0122aSMatthias Ringwald /* Initialization */
478*5fd0122aSMatthias Ringwald ii = 1;
479*5fd0122aSMatthias Ringwald currentReg = 0x01;
480*5fd0122aSMatthias Ringwald
481*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
482*5fd0122aSMatthias Ringwald return false;
483*5fd0122aSMatthias Ringwald
484*5fd0122aSMatthias Ringwald while (memorySelect != 0)
485*5fd0122aSMatthias Ringwald {
486*5fd0122aSMatthias Ringwald if (!(memorySelect & ii))
487*5fd0122aSMatthias Ringwald {
488*5fd0122aSMatthias Ringwald ii = ii << 1;
489*5fd0122aSMatthias Ringwald continue;
490*5fd0122aSMatthias Ringwald }
491*5fd0122aSMatthias Ringwald
492*5fd0122aSMatthias Ringwald currentReg = memorySelect & ii;
493*5fd0122aSMatthias Ringwald memorySelect &= ~ii;
494*5fd0122aSMatthias Ringwald ii = ii << 1;
495*5fd0122aSMatthias Ringwald
496*5fd0122aSMatthias Ringwald uint_fast8_t currRegIndex = _getIndexForMemRegister(currentReg);
497*5fd0122aSMatthias Ringwald if (currRegIndex != ADC_INVALID_MEM)
498*5fd0122aSMatthias Ringwald {
499*5fd0122aSMatthias Ringwald curRegPoint =
500*5fd0122aSMatthias Ringwald (uint32_t*) _ctlRegs[currRegIndex];
501*5fd0122aSMatthias Ringwald
502*5fd0122aSMatthias Ringwald if (windowSelect == ADC_COMP_WINDOW0)
503*5fd0122aSMatthias Ringwald {
504*5fd0122aSMatthias Ringwald (*curRegPoint) = ((*curRegPoint)
505*5fd0122aSMatthias Ringwald & ~(ADC14_MCTLN_WINC | ADC14_MCTLN_WINCTH))
506*5fd0122aSMatthias Ringwald | (ADC14_MCTLN_WINC);
507*5fd0122aSMatthias Ringwald } else if (windowSelect == ADC_COMP_WINDOW1)
508*5fd0122aSMatthias Ringwald {
509*5fd0122aSMatthias Ringwald (*curRegPoint) |= ADC14_MCTLN_WINC | ADC14_MCTLN_WINCTH;
510*5fd0122aSMatthias Ringwald }
511*5fd0122aSMatthias Ringwald }
512*5fd0122aSMatthias Ringwald else
513*5fd0122aSMatthias Ringwald {
514*5fd0122aSMatthias Ringwald return false;
515*5fd0122aSMatthias Ringwald }
516*5fd0122aSMatthias Ringwald
517*5fd0122aSMatthias Ringwald }
518*5fd0122aSMatthias Ringwald
519*5fd0122aSMatthias Ringwald return true;
520*5fd0122aSMatthias Ringwald }
521*5fd0122aSMatthias Ringwald
ADC14_disableComparatorWindow(uint32_t memorySelect)522*5fd0122aSMatthias Ringwald bool ADC14_disableComparatorWindow(uint32_t memorySelect)
523*5fd0122aSMatthias Ringwald {
524*5fd0122aSMatthias Ringwald uint32_t currentReg, ii;
525*5fd0122aSMatthias Ringwald
526*5fd0122aSMatthias Ringwald /* Initialization */
527*5fd0122aSMatthias Ringwald ii = 1;
528*5fd0122aSMatthias Ringwald currentReg = 0x01;
529*5fd0122aSMatthias Ringwald
530*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
531*5fd0122aSMatthias Ringwald return false;
532*5fd0122aSMatthias Ringwald
533*5fd0122aSMatthias Ringwald while (memorySelect != 0)
534*5fd0122aSMatthias Ringwald {
535*5fd0122aSMatthias Ringwald if (!(memorySelect & ii))
536*5fd0122aSMatthias Ringwald {
537*5fd0122aSMatthias Ringwald ii = ii << 1;
538*5fd0122aSMatthias Ringwald continue;
539*5fd0122aSMatthias Ringwald }
540*5fd0122aSMatthias Ringwald
541*5fd0122aSMatthias Ringwald currentReg = memorySelect & ii;
542*5fd0122aSMatthias Ringwald memorySelect &= ~ii;
543*5fd0122aSMatthias Ringwald ii = ii << 1;
544*5fd0122aSMatthias Ringwald
545*5fd0122aSMatthias Ringwald (*(_ctlRegs[_getIndexForMemRegister(currentReg)])) &=
546*5fd0122aSMatthias Ringwald ~ADC14_MCTLN_WINC;
547*5fd0122aSMatthias Ringwald
548*5fd0122aSMatthias Ringwald }
549*5fd0122aSMatthias Ringwald
550*5fd0122aSMatthias Ringwald return true;
551*5fd0122aSMatthias Ringwald }
552*5fd0122aSMatthias Ringwald
ADC14_setComparatorWindowValue(uint32_t window,int16_t low,int16_t high)553*5fd0122aSMatthias Ringwald bool ADC14_setComparatorWindowValue(uint32_t window, int16_t low, int16_t high)
554*5fd0122aSMatthias Ringwald {
555*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
556*5fd0122aSMatthias Ringwald return false;
557*5fd0122aSMatthias Ringwald
558*5fd0122aSMatthias Ringwald if(BITBAND_PERI(ADC14->CTL1, ADC14_CTL1_DF_OFS))
559*5fd0122aSMatthias Ringwald {
560*5fd0122aSMatthias Ringwald low = ((low << 2) | (0x8000 & low)) & 0xFFFC;
561*5fd0122aSMatthias Ringwald high = ((high << 2) | (0x8000 & high)) & 0xFFFC;
562*5fd0122aSMatthias Ringwald }
563*5fd0122aSMatthias Ringwald
564*5fd0122aSMatthias Ringwald if (window == ADC_COMP_WINDOW0)
565*5fd0122aSMatthias Ringwald {
566*5fd0122aSMatthias Ringwald ADC14->HI0 = (high);
567*5fd0122aSMatthias Ringwald ADC14->LO0 = (low);
568*5fd0122aSMatthias Ringwald
569*5fd0122aSMatthias Ringwald } else if (window == ADC_COMP_WINDOW1)
570*5fd0122aSMatthias Ringwald {
571*5fd0122aSMatthias Ringwald ADC14->HI1 = (high);
572*5fd0122aSMatthias Ringwald ADC14->LO1 = (low);
573*5fd0122aSMatthias Ringwald
574*5fd0122aSMatthias Ringwald } else
575*5fd0122aSMatthias Ringwald {
576*5fd0122aSMatthias Ringwald ASSERT(false);
577*5fd0122aSMatthias Ringwald return false;
578*5fd0122aSMatthias Ringwald }
579*5fd0122aSMatthias Ringwald
580*5fd0122aSMatthias Ringwald return true;
581*5fd0122aSMatthias Ringwald }
582*5fd0122aSMatthias Ringwald
ADC14_setResultFormat(uint32_t resultFormat)583*5fd0122aSMatthias Ringwald bool ADC14_setResultFormat(uint32_t resultFormat)
584*5fd0122aSMatthias Ringwald {
585*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
586*5fd0122aSMatthias Ringwald return false;
587*5fd0122aSMatthias Ringwald
588*5fd0122aSMatthias Ringwald if (resultFormat == ADC_UNSIGNED_BINARY)
589*5fd0122aSMatthias Ringwald {
590*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL1, ADC14_CTL1_DF_OFS) = 0;
591*5fd0122aSMatthias Ringwald } else if (resultFormat == ADC_SIGNED_BINARY)
592*5fd0122aSMatthias Ringwald {
593*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL1, ADC14_CTL1_DF_OFS) = 1;
594*5fd0122aSMatthias Ringwald } else
595*5fd0122aSMatthias Ringwald {
596*5fd0122aSMatthias Ringwald ASSERT(false);
597*5fd0122aSMatthias Ringwald }
598*5fd0122aSMatthias Ringwald
599*5fd0122aSMatthias Ringwald return true;
600*5fd0122aSMatthias Ringwald }
601*5fd0122aSMatthias Ringwald
ADC14_getResult(uint32_t memorySelect)602*5fd0122aSMatthias Ringwald uint_fast16_t ADC14_getResult(uint32_t memorySelect)
603*5fd0122aSMatthias Ringwald {
604*5fd0122aSMatthias Ringwald uint_fast8_t memSelIndex = _getIndexForMemRegister(memorySelect);
605*5fd0122aSMatthias Ringwald if (memSelIndex != ADC_INVALID_MEM)
606*5fd0122aSMatthias Ringwald {
607*5fd0122aSMatthias Ringwald return *((uint16_t*) (_ctlRegs[memSelIndex]
608*5fd0122aSMatthias Ringwald + 0x20));
609*5fd0122aSMatthias Ringwald }
610*5fd0122aSMatthias Ringwald else
611*5fd0122aSMatthias Ringwald {
612*5fd0122aSMatthias Ringwald return 0;
613*5fd0122aSMatthias Ringwald }
614*5fd0122aSMatthias Ringwald }
615*5fd0122aSMatthias Ringwald
ADC14_getMultiSequenceResult(uint16_t * res)616*5fd0122aSMatthias Ringwald void ADC14_getMultiSequenceResult(uint16_t* res)
617*5fd0122aSMatthias Ringwald {
618*5fd0122aSMatthias Ringwald
619*5fd0122aSMatthias Ringwald uint32_t startIndex, ii;
620*5fd0122aSMatthias Ringwald
621*5fd0122aSMatthias Ringwald startIndex = (ADC14->CTL1 & ADC14_CTL1_CSTARTADD_MASK)>>16;
622*5fd0122aSMatthias Ringwald
623*5fd0122aSMatthias Ringwald for (ii = startIndex; ii < 32; ii++)
624*5fd0122aSMatthias Ringwald {
625*5fd0122aSMatthias Ringwald res[ii] = ADC14->MEM[ii];
626*5fd0122aSMatthias Ringwald
627*5fd0122aSMatthias Ringwald if(ADC14->MCTL[ii] & ADC14_MCTLN_EOS)
628*5fd0122aSMatthias Ringwald break;
629*5fd0122aSMatthias Ringwald
630*5fd0122aSMatthias Ringwald }
631*5fd0122aSMatthias Ringwald
632*5fd0122aSMatthias Ringwald }
633*5fd0122aSMatthias Ringwald
ADC14_getResultArray(uint32_t memoryStart,uint32_t memoryEnd,uint16_t * res)634*5fd0122aSMatthias Ringwald void ADC14_getResultArray(uint32_t memoryStart, uint32_t memoryEnd,
635*5fd0122aSMatthias Ringwald uint16_t* res)
636*5fd0122aSMatthias Ringwald {
637*5fd0122aSMatthias Ringwald uint32_t ii = 0;
638*5fd0122aSMatthias Ringwald uint32_t *firstPoint, *secondPoint;
639*5fd0122aSMatthias Ringwald
640*5fd0122aSMatthias Ringwald bool foundEnd = false;
641*5fd0122aSMatthias Ringwald
642*5fd0122aSMatthias Ringwald uint_fast8_t memStartIndex, memEndIndex;
643*5fd0122aSMatthias Ringwald
644*5fd0122aSMatthias Ringwald memStartIndex = _getIndexForMemRegister(memoryStart);
645*5fd0122aSMatthias Ringwald memEndIndex = _getIndexForMemRegister(memoryEnd);
646*5fd0122aSMatthias Ringwald
647*5fd0122aSMatthias Ringwald ASSERT(
648*5fd0122aSMatthias Ringwald _getIndexForMemRegister(memoryStart) != ADC_INVALID_MEM
649*5fd0122aSMatthias Ringwald && _getIndexForMemRegister(memoryEnd) != ADC_INVALID_MEM);
650*5fd0122aSMatthias Ringwald
651*5fd0122aSMatthias Ringwald if (memStartIndex != ADC_INVALID_MEM && memEndIndex!= ADC_INVALID_MEM) {
652*5fd0122aSMatthias Ringwald firstPoint = (uint32_t*) _ctlRegs[memStartIndex];
653*5fd0122aSMatthias Ringwald secondPoint = (uint32_t*) _ctlRegs[memEndIndex];
654*5fd0122aSMatthias Ringwald
655*5fd0122aSMatthias Ringwald while (!foundEnd)
656*5fd0122aSMatthias Ringwald {
657*5fd0122aSMatthias Ringwald if (firstPoint == secondPoint)
658*5fd0122aSMatthias Ringwald {
659*5fd0122aSMatthias Ringwald foundEnd = true;
660*5fd0122aSMatthias Ringwald }
661*5fd0122aSMatthias Ringwald
662*5fd0122aSMatthias Ringwald res[ii] = *(((uint16_t*) firstPoint) + 0x40);
663*5fd0122aSMatthias Ringwald
664*5fd0122aSMatthias Ringwald if (firstPoint == _ctlRegs[31])
665*5fd0122aSMatthias Ringwald firstPoint = (uint32_t*) _ctlRegs[0];
666*5fd0122aSMatthias Ringwald else
667*5fd0122aSMatthias Ringwald firstPoint += 0x04;
668*5fd0122aSMatthias Ringwald }
669*5fd0122aSMatthias Ringwald }
670*5fd0122aSMatthias Ringwald }
671*5fd0122aSMatthias Ringwald
ADC14_enableReferenceBurst(void)672*5fd0122aSMatthias Ringwald bool ADC14_enableReferenceBurst(void)
673*5fd0122aSMatthias Ringwald {
674*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
675*5fd0122aSMatthias Ringwald return false;
676*5fd0122aSMatthias Ringwald
677*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL1, ADC14_CTL1_REFBURST_OFS) = 1;
678*5fd0122aSMatthias Ringwald
679*5fd0122aSMatthias Ringwald return true;
680*5fd0122aSMatthias Ringwald }
681*5fd0122aSMatthias Ringwald
ADC14_disableReferenceBurst(void)682*5fd0122aSMatthias Ringwald bool ADC14_disableReferenceBurst(void)
683*5fd0122aSMatthias Ringwald {
684*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
685*5fd0122aSMatthias Ringwald return false;
686*5fd0122aSMatthias Ringwald
687*5fd0122aSMatthias Ringwald BITBAND_PERI(ADC14->CTL1, ADC14_CTL1_REFBURST_OFS) = 0;
688*5fd0122aSMatthias Ringwald
689*5fd0122aSMatthias Ringwald return true;
690*5fd0122aSMatthias Ringwald }
691*5fd0122aSMatthias Ringwald
ADC14_setPowerMode(uint32_t adcPowerMode)692*5fd0122aSMatthias Ringwald bool ADC14_setPowerMode(uint32_t adcPowerMode)
693*5fd0122aSMatthias Ringwald {
694*5fd0122aSMatthias Ringwald if (ADCIsConversionRunning())
695*5fd0122aSMatthias Ringwald return false;
696*5fd0122aSMatthias Ringwald
697*5fd0122aSMatthias Ringwald switch (adcPowerMode)
698*5fd0122aSMatthias Ringwald {
699*5fd0122aSMatthias Ringwald case ADC_UNRESTRICTED_POWER_MODE:
700*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1 & ~(ADC14_CTL1_PWRMD_MASK))
701*5fd0122aSMatthias Ringwald | (ADC14_CTL1_PWRMD_0);
702*5fd0122aSMatthias Ringwald break;
703*5fd0122aSMatthias Ringwald case ADC_ULTRA_LOW_POWER_MODE:
704*5fd0122aSMatthias Ringwald ADC14->CTL1 = (ADC14->CTL1 & ~(ADC14_CTL1_PWRMD_MASK))
705*5fd0122aSMatthias Ringwald | (ADC14_CTL1_PWRMD_2);
706*5fd0122aSMatthias Ringwald break;
707*5fd0122aSMatthias Ringwald default:
708*5fd0122aSMatthias Ringwald ASSERT(false);
709*5fd0122aSMatthias Ringwald return false;
710*5fd0122aSMatthias Ringwald }
711*5fd0122aSMatthias Ringwald
712*5fd0122aSMatthias Ringwald return true;
713*5fd0122aSMatthias Ringwald }
714*5fd0122aSMatthias Ringwald
ADC14_enableInterrupt(uint_fast64_t mask)715*5fd0122aSMatthias Ringwald void ADC14_enableInterrupt(uint_fast64_t mask)
716*5fd0122aSMatthias Ringwald {
717*5fd0122aSMatthias Ringwald uint32_t stat = mask & 0xFFFFFFFF;
718*5fd0122aSMatthias Ringwald
719*5fd0122aSMatthias Ringwald ADC14->IER0 |= stat;
720*5fd0122aSMatthias Ringwald stat = (mask >> 32);
721*5fd0122aSMatthias Ringwald ADC14->IER1 |= (stat);
722*5fd0122aSMatthias Ringwald }
723*5fd0122aSMatthias Ringwald
ADC14_disableInterrupt(uint_fast64_t mask)724*5fd0122aSMatthias Ringwald void ADC14_disableInterrupt(uint_fast64_t mask)
725*5fd0122aSMatthias Ringwald {
726*5fd0122aSMatthias Ringwald uint32_t stat = mask & 0xFFFFFFFF;
727*5fd0122aSMatthias Ringwald
728*5fd0122aSMatthias Ringwald ADC14->IER0 &= ~stat;
729*5fd0122aSMatthias Ringwald stat = (mask >> 32);
730*5fd0122aSMatthias Ringwald ADC14->IER1 &= ~(stat);
731*5fd0122aSMatthias Ringwald }
732*5fd0122aSMatthias Ringwald
ADC14_getInterruptStatus(void)733*5fd0122aSMatthias Ringwald uint_fast64_t ADC14_getInterruptStatus(void)
734*5fd0122aSMatthias Ringwald {
735*5fd0122aSMatthias Ringwald uint_fast64_t status = ADC14->IFGR1;
736*5fd0122aSMatthias Ringwald return ((status << 32) | ADC14->IFGR0);
737*5fd0122aSMatthias Ringwald }
738*5fd0122aSMatthias Ringwald
ADC14_getEnabledInterruptStatus(void)739*5fd0122aSMatthias Ringwald uint_fast64_t ADC14_getEnabledInterruptStatus(void)
740*5fd0122aSMatthias Ringwald {
741*5fd0122aSMatthias Ringwald uint_fast64_t stat = ADC14->IER1;
742*5fd0122aSMatthias Ringwald
743*5fd0122aSMatthias Ringwald return ADC14_getInterruptStatus() & ((stat << 32) | ADC14->IER0);
744*5fd0122aSMatthias Ringwald
745*5fd0122aSMatthias Ringwald }
746*5fd0122aSMatthias Ringwald
ADC14_clearInterruptFlag(uint_fast64_t mask)747*5fd0122aSMatthias Ringwald void ADC14_clearInterruptFlag(uint_fast64_t mask)
748*5fd0122aSMatthias Ringwald {
749*5fd0122aSMatthias Ringwald uint32_t stat = mask & 0xFFFFFFFF;
750*5fd0122aSMatthias Ringwald
751*5fd0122aSMatthias Ringwald ADC14->CLRIFGR0 |= stat;
752*5fd0122aSMatthias Ringwald stat = (mask >> 32);
753*5fd0122aSMatthias Ringwald ADC14->CLRIFGR1 |= (stat);
754*5fd0122aSMatthias Ringwald }
755*5fd0122aSMatthias Ringwald
ADC14_registerInterrupt(void (* intHandler)(void))756*5fd0122aSMatthias Ringwald void ADC14_registerInterrupt(void (*intHandler)(void))
757*5fd0122aSMatthias Ringwald {
758*5fd0122aSMatthias Ringwald //
759*5fd0122aSMatthias Ringwald // Register the interrupt handler, returning an error if an error occurs.
760*5fd0122aSMatthias Ringwald //
761*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(INT_ADC14, intHandler);
762*5fd0122aSMatthias Ringwald
763*5fd0122aSMatthias Ringwald //
764*5fd0122aSMatthias Ringwald // Enable the ADC interrupt.
765*5fd0122aSMatthias Ringwald //
766*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(INT_ADC14);
767*5fd0122aSMatthias Ringwald }
768*5fd0122aSMatthias Ringwald
ADC14_unregisterInterrupt(void)769*5fd0122aSMatthias Ringwald void ADC14_unregisterInterrupt(void)
770*5fd0122aSMatthias Ringwald {
771*5fd0122aSMatthias Ringwald //
772*5fd0122aSMatthias Ringwald // Disable the interrupt.
773*5fd0122aSMatthias Ringwald //
774*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(INT_ADC14);
775*5fd0122aSMatthias Ringwald
776*5fd0122aSMatthias Ringwald //
777*5fd0122aSMatthias Ringwald // Unregister the interrupt handler.
778*5fd0122aSMatthias Ringwald //
779*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(INT_ADC14);
780*5fd0122aSMatthias Ringwald }
781*5fd0122aSMatthias Ringwald
782