00001
00034 #ifndef __SILICON_LABS_EM_ADC_H_
00035 #define __SILICON_LABS_EM_ADC_H_
00036
00037 #include "em_device.h"
00038 #if defined(ADC_COUNT) && (ADC_COUNT > 0)
00039
00040 #include <stdbool.h>
00041
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046
00051
00056
00057
00058
00059
00061 typedef enum
00062 {
00063 adcAcqTime1 = _ADC_SINGLECTRL_AT_1CYCLE,
00064 adcAcqTime2 = _ADC_SINGLECTRL_AT_2CYCLES,
00065 adcAcqTime4 = _ADC_SINGLECTRL_AT_4CYCLES,
00066 adcAcqTime8 = _ADC_SINGLECTRL_AT_8CYCLES,
00067 adcAcqTime16 = _ADC_SINGLECTRL_AT_16CYCLES,
00068 adcAcqTime32 = _ADC_SINGLECTRL_AT_32CYCLES,
00069 adcAcqTime64 = _ADC_SINGLECTRL_AT_64CYCLES,
00070 adcAcqTime128 = _ADC_SINGLECTRL_AT_128CYCLES,
00071 adcAcqTime256 = _ADC_SINGLECTRL_AT_256CYCLES
00072 } ADC_AcqTime_TypeDef;
00073
00074
00076 typedef enum
00077 {
00079 adcLPFilterBypass = _ADC_CTRL_LPFMODE_BYPASS,
00080
00082 adcLPFilterRC = _ADC_CTRL_LPFMODE_RCFILT,
00083
00085 adcLPFilterDeCap = _ADC_CTRL_LPFMODE_DECAP
00086 } ADC_LPFilter_TypeDef;
00087
00088
00090 typedef enum
00091 {
00093 adcOvsRateSel2 = _ADC_CTRL_OVSRSEL_X2,
00094
00096 adcOvsRateSel4 = _ADC_CTRL_OVSRSEL_X4,
00097
00099 adcOvsRateSel8 = _ADC_CTRL_OVSRSEL_X8,
00100
00102 adcOvsRateSel16 = _ADC_CTRL_OVSRSEL_X16,
00103
00105 adcOvsRateSel32 = _ADC_CTRL_OVSRSEL_X32,
00106
00108 adcOvsRateSel64 = _ADC_CTRL_OVSRSEL_X64,
00109
00111 adcOvsRateSel128 = _ADC_CTRL_OVSRSEL_X128,
00112
00114 adcOvsRateSel256 = _ADC_CTRL_OVSRSEL_X256,
00115
00117 adcOvsRateSel512 = _ADC_CTRL_OVSRSEL_X512,
00118
00120 adcOvsRateSel1024 = _ADC_CTRL_OVSRSEL_X1024,
00121
00123 adcOvsRateSel2048 = _ADC_CTRL_OVSRSEL_X2048,
00124
00126 adcOvsRateSel4096 = _ADC_CTRL_OVSRSEL_X4096
00127 } ADC_OvsRateSel_TypeDef;
00128
00129
00131 typedef enum
00132 {
00133 adcPRSSELCh0 = _ADC_SINGLECTRL_PRSSEL_PRSCH0,
00134 adcPRSSELCh1 = _ADC_SINGLECTRL_PRSSEL_PRSCH1,
00135 adcPRSSELCh2 = _ADC_SINGLECTRL_PRSSEL_PRSCH2,
00136 adcPRSSELCh3 = _ADC_SINGLECTRL_PRSSEL_PRSCH3,
00137 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH4 )
00138 adcPRSSELCh4 = _ADC_SINGLECTRL_PRSSEL_PRSCH4,
00139 #endif
00140 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH5 )
00141 adcPRSSELCh5 = _ADC_SINGLECTRL_PRSSEL_PRSCH5,
00142 #endif
00143 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH6 )
00144 adcPRSSELCh6 = _ADC_SINGLECTRL_PRSSEL_PRSCH6,
00145 #endif
00146 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH7 )
00147 adcPRSSELCh7 = _ADC_SINGLECTRL_PRSSEL_PRSCH7,
00148 #endif
00149 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH8 )
00150 adcPRSSELCh8 = _ADC_SINGLECTRL_PRSSEL_PRSCH8,
00151 #endif
00152 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH9 )
00153 adcPRSSELCh9 = _ADC_SINGLECTRL_PRSSEL_PRSCH9,
00154 #endif
00155 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH10 )
00156 adcPRSSELCh10 = _ADC_SINGLECTRL_PRSSEL_PRSCH10,
00157 #endif
00158 #if defined( _ADC_SINGLECTRL_PRSSEL_PRSCH11 )
00159 adcPRSSELCh11 = _ADC_SINGLECTRL_PRSSEL_PRSCH11,
00160 #endif
00161 } ADC_PRSSEL_TypeDef;
00162
00163
00165 typedef enum
00166 {
00168 adcRef1V25 = _ADC_SINGLECTRL_REF_1V25,
00169
00171 adcRef2V5 = _ADC_SINGLECTRL_REF_2V5,
00172
00174 adcRefVDD = _ADC_SINGLECTRL_REF_VDD,
00175
00177 adcRef5VDIFF = _ADC_SINGLECTRL_REF_5VDIFF,
00178
00180 adcRefExtSingle = _ADC_SINGLECTRL_REF_EXTSINGLE,
00181
00183 adcRef2xExtDiff = _ADC_SINGLECTRL_REF_2XEXTDIFF,
00184
00186 adcRef2xVDD = _ADC_SINGLECTRL_REF_2XVDD
00187 } ADC_Ref_TypeDef;
00188
00189
00191 typedef enum
00192 {
00193 adcRes12Bit = _ADC_SINGLECTRL_RES_12BIT,
00194 adcRes8Bit = _ADC_SINGLECTRL_RES_8BIT,
00195 adcRes6Bit = _ADC_SINGLECTRL_RES_6BIT,
00196 adcResOVS = _ADC_SINGLECTRL_RES_OVS
00197 } ADC_Res_TypeDef;
00198
00199
00201 typedef enum
00202 {
00203
00204 adcSingleInpCh0 = _ADC_SINGLECTRL_INPUTSEL_CH0,
00205 adcSingleInpCh1 = _ADC_SINGLECTRL_INPUTSEL_CH1,
00206 adcSingleInpCh2 = _ADC_SINGLECTRL_INPUTSEL_CH2,
00207 adcSingleInpCh3 = _ADC_SINGLECTRL_INPUTSEL_CH3,
00208 adcSingleInpCh4 = _ADC_SINGLECTRL_INPUTSEL_CH4,
00209 adcSingleInpCh5 = _ADC_SINGLECTRL_INPUTSEL_CH5,
00210 adcSingleInpCh6 = _ADC_SINGLECTRL_INPUTSEL_CH6,
00211 adcSingleInpCh7 = _ADC_SINGLECTRL_INPUTSEL_CH7,
00212 adcSingleInpTemp = _ADC_SINGLECTRL_INPUTSEL_TEMP,
00213 adcSingleInpVDDDiv3 = _ADC_SINGLECTRL_INPUTSEL_VDDDIV3,
00214 adcSingleInpVDD = _ADC_SINGLECTRL_INPUTSEL_VDD,
00215 adcSingleInpVSS = _ADC_SINGLECTRL_INPUTSEL_VSS,
00216 adcSingleInpVrefDiv2 = _ADC_SINGLECTRL_INPUTSEL_VREFDIV2,
00217 adcSingleInpDACOut0 = _ADC_SINGLECTRL_INPUTSEL_DAC0OUT0,
00218 adcSingleInpDACOut1 = _ADC_SINGLECTRL_INPUTSEL_DAC0OUT1,
00219
00220 adcSingleInpATEST = 15,
00222
00223 adcSingleInpCh0Ch1 = _ADC_SINGLECTRL_INPUTSEL_CH0CH1,
00224 adcSingleInpCh2Ch3 = _ADC_SINGLECTRL_INPUTSEL_CH2CH3,
00225 adcSingleInpCh4Ch5 = _ADC_SINGLECTRL_INPUTSEL_CH4CH5,
00226 adcSingleInpCh6Ch7 = _ADC_SINGLECTRL_INPUTSEL_CH6CH7,
00227
00228 adcSingleInpDiff0 = 4
00229 } ADC_SingleInput_TypeDef;
00230
00231
00233 typedef enum
00234 {
00236 adcStartSingle = ADC_CMD_SINGLESTART,
00237
00239 adcStartScan = ADC_CMD_SCANSTART,
00240
00245 adcStartScanAndSingle = ADC_CMD_SCANSTART | ADC_CMD_SINGLESTART
00246 } ADC_Start_TypeDef;
00247
00248
00250 typedef enum
00251 {
00253 adcWarmupNormal = _ADC_CTRL_WARMUPMODE_NORMAL,
00254
00256 adcWarmupFastBG = _ADC_CTRL_WARMUPMODE_FASTBG,
00257
00259 adcWarmupKeepScanRefWarm = _ADC_CTRL_WARMUPMODE_KEEPSCANREFWARM,
00260
00262 adcWarmupKeepADCWarm = _ADC_CTRL_WARMUPMODE_KEEPADCWARM
00263 } ADC_Warmup_TypeDef;
00264
00265
00266
00267
00268
00269
00271 typedef struct
00272 {
00277 ADC_OvsRateSel_TypeDef ovsRateSel;
00278
00280 ADC_LPFilter_TypeDef lpfMode;
00281
00283 ADC_Warmup_TypeDef warmUpMode;
00284
00292 uint8_t timebase;
00293
00295 uint8_t prescale;
00296
00298 bool tailgate;
00299 } ADC_Init_TypeDef;
00300
00302 #define ADC_INIT_DEFAULT \
00303 { adcOvsRateSel2, \
00304 adcLPFilterBypass, \
00305 adcWarmupNormal, \
00306 _ADC_CTRL_TIMEBASE_DEFAULT, \
00307 _ADC_CTRL_PRESC_DEFAULT, \
00308 false \
00309 }
00310
00311
00313 typedef struct
00314 {
00319 ADC_PRSSEL_TypeDef prsSel;
00320
00322 ADC_AcqTime_TypeDef acqTime;
00323
00328 ADC_Ref_TypeDef reference;
00329
00331 ADC_Res_TypeDef resolution;
00332
00339 uint32_t input;
00340
00342 bool diff;
00343
00345 bool prsEnable;
00346
00348 bool leftAdjust;
00349
00351 bool rep;
00352 } ADC_InitScan_TypeDef;
00353
00355 #define ADC_INITSCAN_DEFAULT \
00356 { adcPRSSELCh0, \
00357 adcAcqTime1, \
00358 adcRef1V25, \
00359 adcRes12Bit, \
00360 0, \
00361 false, \
00362 false, \
00363 false, \
00364 false \
00365 }
00366
00367
00369 typedef struct
00370 {
00375 ADC_PRSSEL_TypeDef prsSel;
00376
00378 ADC_AcqTime_TypeDef acqTime;
00379
00384 ADC_Ref_TypeDef reference;
00385
00387 ADC_Res_TypeDef resolution;
00388
00393 ADC_SingleInput_TypeDef input;
00394
00396 bool diff;
00397
00399 bool prsEnable;
00400
00402 bool leftAdjust;
00403
00405 bool rep;
00406 } ADC_InitSingle_TypeDef;
00407
00409 #define ADC_INITSINGLE_DEFAULT \
00410 { adcPRSSELCh0, \
00411 adcAcqTime1, \
00412 adcRef1V25, \
00413 adcRes12Bit, \
00414 adcSingleInpCh0, \
00415 false, \
00416 false, \
00417 false, \
00418 false \
00419 }
00420
00421
00422
00423
00424
00425
00426
00439 __STATIC_INLINE uint32_t ADC_DataSingleGet(ADC_TypeDef *adc)
00440 {
00441 return(adc->SINGLEDATA);
00442 }
00443
00444
00445
00455 __STATIC_INLINE uint32_t ADC_DataScanGet(ADC_TypeDef *adc)
00456 {
00457 return(adc->SCANDATA);
00458 }
00459
00460
00461 void ADC_Init(ADC_TypeDef *adc, const ADC_Init_TypeDef *init);
00462 void ADC_InitScan(ADC_TypeDef *adc, const ADC_InitScan_TypeDef *init);
00463 void ADC_InitSingle(ADC_TypeDef *adc, const ADC_InitSingle_TypeDef *init);
00464
00465
00476 __STATIC_INLINE void ADC_IntClear(ADC_TypeDef *adc, uint32_t flags)
00477 {
00478 adc->IFC = flags;
00479 }
00480
00481
00482
00493 __STATIC_INLINE void ADC_IntDisable(ADC_TypeDef *adc, uint32_t flags)
00494 {
00495 adc->IEN &= ~(flags);
00496 }
00497
00498
00499
00515 __STATIC_INLINE void ADC_IntEnable(ADC_TypeDef *adc, uint32_t flags)
00516 {
00517 adc->IEN |= flags;
00518 }
00519
00520
00521
00535 __STATIC_INLINE uint32_t ADC_IntGet(ADC_TypeDef *adc)
00536 {
00537 return(adc->IF);
00538 }
00539
00540
00541
00552 __STATIC_INLINE void ADC_IntSet(ADC_TypeDef *adc, uint32_t flags)
00553 {
00554 adc->IFS = flags;
00555 }
00556
00557 uint8_t ADC_PrescaleCalc(uint32_t adcFreq, uint32_t hfperFreq);
00558
00559
00560
00570 __STATIC_INLINE void ADC_Start(ADC_TypeDef *adc, ADC_Start_TypeDef cmd)
00571 {
00572 adc->CMD = (uint32_t)cmd;
00573 }
00574
00575 void ADC_Reset(ADC_TypeDef *adc);
00576 uint8_t ADC_TimebaseCalc(uint32_t hfperFreq);
00577
00581 #ifdef __cplusplus
00582 }
00583 #endif
00584
00585 #endif
00586 #endif