MAX32655 Peripheral Driver API
Peripheral Driver API for the MAX32655
adc.h
1 
6 /* ****************************************************************************
7  * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a
10  * copy of this software and associated documentation files (the "Software"),
11  * to deal in the Software without restriction, including without limitation
12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  * and/or sell copies of the Software, and to permit persons to whom the
14  * Software is furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included
17  * in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22  * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
23  * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  * OTHER DEALINGS IN THE SOFTWARE.
26  *
27  * Except as contained in this notice, the name of Maxim Integrated
28  * Products, Inc. shall not be used except as stated in the Maxim Integrated
29  * Products, Inc. Branding Policy.
30  *
31  * The mere transfer of this software does not imply any licenses
32  * of trade secrets, proprietary technology, copyrights, patents,
33  * trademarks, maskwork rights, or any other form of intellectual
34  * property whatsoever. Maxim Integrated Products, Inc. retains all
35  * ownership rights.
36  *
37  * $Date: 2018-08-28 17:03:02 -0500 (Tue, 28 Aug 2018) $
38  * $Revision: 37424 $
39  *
40  *************************************************************************** */
41 
42 /* Define to prevent redundant inclusion */
43 #ifndef _ADC_H_
44 #define _ADC_H_
45 
46 /* **** Includes **** */
47 #include <stdint.h>
48 #include "adc_regs.h"
49 #include "mcr_regs.h"
50 
51 #ifdef __cplusplus
52 extern "C" {
53 #endif
54 
55 // Macros to select ADC channels
56 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN0 ((uint32_t)(0x00000000UL))
57 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN1 ((uint32_t)(0x00000001UL))
58 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN2 ((uint32_t)(0x00000002UL))
59 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN3 ((uint32_t)(0x00000003UL))
60 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN4 ((uint32_t)(0x00000004UL))
61 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN5 ((uint32_t)(0x00000005UL))
62 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN6 ((uint32_t)(0x00000006UL))
63 #define MXC_V_ADC_CTRL_ADC_CHSEL_AIN7 ((uint32_t)(0x00000007UL))
64 #define MXC_V_ADC_CTRL_ADC_CHSEL_VCOREA ((uint32_t)(0x00000008UL))
65 #define MXC_V_ADC_CTRL_ADC_CHSEL_VCOREB ((uint32_t)(0x00000009UL))
66 #define MXC_V_ADC_CTRL_ADC_CHSEL_VRXOUT ((uint32_t)(0x0000000AUL))
67 #define MXC_V_ADC_CTRL_ADC_CHSEL_VTXOUT ((uint32_t)(0x0000000BUL))
68 #define MXC_V_ADC_CTRL_ADC_CHSEL_VDDA ((uint32_t)(0x0000000CUL))
69 #define MXC_V_ADC_CTRL_ADC_CHSEL_VDDB ((uint32_t)(0x0000000DUL))
70 #define MXC_V_ADC_CTRL_ADC_CHSEL_VDDI0 ((uint32_t)(0x0000000EUL))
71 #define MXC_V_ADC_CTRL_ADC_CHSEL_VDDI0H ((uint32_t)(0x0000000FUL))
72 #define MXC_V_ADC_CTRL_ADC_CHSEL_VREGI ((uint32_t)(0x00000010UL))
73 
74 
75 /***************************************************************************************************************
76  DATA STRUCTURES FOR ADC INITIALIZATION
77 ***************************************************************************************************************/
81 typedef enum {
82  MXC_ADC_CH_0 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN0, // Select Channel 0
83  MXC_ADC_CH_1 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN1, // Select Channel 1
84  MXC_ADC_CH_2 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN2, // Select Channel 2
85  MXC_ADC_CH_3 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN3, // Select Channel 3
86  MXC_ADC_CH_4 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN4, // Channel 0 divided by 5
87  MXC_ADC_CH_5 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN5, // Channel 1 divided by 5
88  MXC_ADC_CH_6 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN6, // VDDB divided by 4
89  MXC_ADC_CH_7 = MXC_V_ADC_CTRL_ADC_CHSEL_AIN7, // VDD18 input select
90  MXC_ADC_CH_VCOREA = MXC_V_ADC_CTRL_ADC_CHSEL_VCOREA, // VDD12 input select
91  MXC_ADC_CH_VCOREB = MXC_V_ADC_CTRL_ADC_CHSEL_VCOREB,
92  MXC_ADC_CH_VRXOUT = MXC_V_ADC_CTRL_ADC_CHSEL_VRXOUT, // VRTC divided by 2
93  MXC_ADC_CH_VTXOUT = MXC_V_ADC_CTRL_ADC_CHSEL_VTXOUT, // TMON input select
94  MXC_ADC_CH_VDDA = MXC_V_ADC_CTRL_ADC_CHSEL_VDDA,
95  MXC_ADC_CH_VDDB = MXC_V_ADC_CTRL_ADC_CHSEL_VDDB,
96  MXC_ADC_CH_VDDIO = MXC_V_ADC_CTRL_ADC_CHSEL_VDDI0,
97  MXC_ADC_CH_VDDIOH = MXC_V_ADC_CTRL_ADC_CHSEL_VDDI0H,
98  MXC_ADC_CH_VREGI = MXC_V_ADC_CTRL_ADC_CHSEL_VREGI,
99 } mxc_adc_chsel_t;
100 
101 #if 0
102 
105 typedef enum {
106  MXC_ADC_COMP_0 = MXC_F_MCR_AINCOMP_AINCOMP0PD,
107  MXC_ADC_COMP_1 = MXC_F_MCR_AINCOMP_AINCOMP1PD,
108  MXC_ADC_COMP_2 = MXC_F_MCR_AINCOMP_AINCOMP2PD,
109  MXC_ADC_COMP_3 = MXC_F_MCR_AINCOMP_AINCOMP3PD,
110  MXC_ADC_COMP_HYST_0 = 1 << MXC_F_MCR_AINCOMP_AINCOMPHYST_POS, //Refer to the V HYST specification in the data sheet electrical characteristics
111  // for the values corresponding to this field value.
112  MXC_ADC_COMP_HYST_1 = 2 << MXC_F_MCR_AINCOMP_AINCOMPHYST_POS, //Refer to the V HYST specification in the data sheet electrical characteristics
113  // for the values corresponding to this field value.
114 } mxc_adc_comp_t;
115 #endif
116 
121 typedef enum {
122  MXC_ADC_MONITOR_0,
123  MXC_ADC_MONITOR_1,
124  MXC_ADC_MONITOR_2,
125  MXC_ADC_MONITOR_3,
126 } mxc_adc_monitor_t;
127 
132 typedef enum {
133  MXC_ADC_SCALE_2X, // ADC Scale by 2x (this scales ADC Reference by 1/2)
134  MXC_ADC_SCALE_1, // ADC Scale by 1x (no scaling)
135  MXC_ADC_SCALE_2, // ADC Scale by 1/2
136  MXC_ADC_SCALE_3, // ADC Scale by 1/3
137  MXC_ADC_SCALE_4, // ADC Scale by 1/4
138  MXC_ADC_SCALE_6, // ADC Scale by 1/6 (this uses 1/3 and an additional 1/2 scaling)
139  MXC_ADC_SCALE_8, // ADC Scale by 1/8 (this uses 1/4 and an additional 1/2 scaling)
140 } mxc_adc_scale_t;
141 
145 typedef enum {
146  MXC_ADC_REF_INT, // Selects internal bandgap reference
147  MXC_ADC_REF_EXT, // Selects external reference pins
148 } mxc_adc_ref_t;
149 
150 // Callback used when a conversion event is complete
151 typedef void (*mxc_adc_complete_cb_t) (void * req, int error);
152 
153 
154 // Callback used when a monitor detects that a channel has reached a limit
155 typedef void (*mxc_adc_monitor_cb_t) (void * req, int error);
156 
157 // Used to set up a monitor to watch a channel
158 typedef struct {
159  mxc_adc_monitor_t monitor; // Monitor to use
160  mxc_adc_scale_t scale; // Channel scale to use (if external channel)
161  mxc_adc_chsel_t channel; // Channel to use
162  int lowThreshold; // Low Threshold for monitor (RAW ADC counts)
163  int highThreshold; // High Threshold for monitor (RAW ADC counts)
164  mxc_adc_monitor_cb_t callback;// Function to call when the channel crosses threshold
165 } mxc_adc_monitor_req_t;
166 
167 typedef struct {
168  mxc_adc_chsel_t channel; // Channel to use
169  mxc_adc_scale_t scale; // Channel scale to use (if external channel)
170  int rawADCValue; // Result of the conversion
171  mxc_adc_complete_cb_t callback;// Function to call when callback is complete
172 } mxc_adc_conversion_req_t;
173 
174 
180 int MXC_ADC_Init (void);
181 
187 int MXC_ADC_Shutdown (void);
188 
194 int MXC_ADC_Busy (void);
195 
201 void MXC_ADC_EnableInt (uint32_t flags);
202 
208 void MXC_ADC_DisableInt (uint32_t flags);
209 
215 int MXC_ADC_GetFlags (void);
216 
222 void MXC_ADC_ClearFlags (uint32_t flags);
223 
231 int MXC_ADC_SetConversionSpeed (uint32_t hz);
232 
238 int MXC_ADC_GetConversionSpeed (void);
239 
245 void MXC_ADC_SetDataAlignment (int msbJustify);
246 
247 // Internal channels are approx. known and have fixed scaling
248 // Externals channels can be scaled with standard scaling (1-4x)
249 // Or by using a separate 1/2 input scale, or a 1/2 ref scale (total range 0.5-8x)
255 void MXC_ADC_SetExtScale (mxc_adc_scale_t scale);
256 
262 void MXC_ADC_RefSelect (mxc_adc_ref_t ref);
263 
270 void MXC_ADC_EnableMonitor (mxc_adc_monitor_t monitors);
271 
278 void MXC_ADC_DisableMonitor (mxc_adc_monitor_t monitors);
279 
287 void MXC_ADC_SetMonitorHighThreshold (mxc_adc_monitor_t monitor, uint32_t threshold);
288 
296 int MXC_ADC_GetMonitorHighThreshold (mxc_adc_monitor_t monitor);
297 
305 void MXC_ADC_SetMonitorLowThreshold (mxc_adc_monitor_t monitor, uint32_t threshold);
306 
314 int MXC_ADC_GetMonitorLowThreshold (mxc_adc_monitor_t monitor);
315 
323 void MXC_ADC_SetMonitorChannel (mxc_adc_monitor_t monitor, mxc_adc_chsel_t channel);
324 
332 int MXC_ADC_GetMonitorChannel (mxc_adc_monitor_t monitor);
333 
334 // Monitor a channel and call the callback if it hits a limit
342 void MXC_ADC_EnableMonitorAsync (mxc_adc_monitor_t monitor, mxc_adc_monitor_cb_t callback);
343 
349 void MXC_ADC_DisableMonitorAsync (mxc_adc_monitor_t monitor);
350 
359 int MXC_ADC_StartConversion (mxc_adc_chsel_t channel);
360 
372 int MXC_ADC_StartConversionAsync (mxc_adc_chsel_t channel, mxc_adc_complete_cb_t callback);
373 
380 int MXC_ADC_Handler (void);
381 
390 int MXC_ADC_Convert (mxc_adc_conversion_req_t req);
391 
401 int MXC_ADC_ConvertAsync (mxc_adc_conversion_req_t req);
402 
408 void MXC_ADC_Monitor (mxc_adc_monitor_req_t req);
409 
417 void MXC_ADC_MonitorAsync (mxc_adc_monitor_req_t req);
418 
424 void MXC_ADC_EnableComparators (uint32_t mask);
425 
431 void MXC_ADC_DisableComparators (uint32_t mask);
432 
439 int MXC_ADC_GetData (uint16_t *outdata);
442 #ifdef __cplusplus
443 }
444 #endif
445 
446 #endif /* _ADC_H_ */