xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/adc14.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald /* 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