em_adc.h

Go to the documentation of this file.
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  ********************************   ENUMS   ************************************
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   /* Differential mode disabled */
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   /* TBD: Use define when available */
00220   adcSingleInpATEST    = 15,                                
00222   /* Differential mode enabled */
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   /* TBD: Use define when available */
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  *******************************   STRUCTS   ***********************************
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,                /* 2x oversampling (if enabled). */       \
00304     adcLPFilterBypass,             /* No input filter selected. */           \
00305     adcWarmupNormal,               /* ADC shutdown after each conversion. */ \
00306     _ADC_CTRL_TIMEBASE_DEFAULT,    /* Use HW default value. */               \
00307     _ADC_CTRL_PRESC_DEFAULT,       /* Use HW default value. */               \
00308     false                          /* Do not use tailgate. */                \
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,              /* PRS ch0 (if enabled). */                          \
00357     adcAcqTime1,               /* 1 ADC_CLK cycle acquisition time. */              \
00358     adcRef1V25,                /* 1.25V internal reference. */                      \
00359     adcRes12Bit,               /* 12 bit resolution. */                             \
00360     0,                         /* No input selected. */                             \
00361     false,                     /* Single ended input. */                            \
00362     false,                     /* PRS disabled. */                                  \
00363     false,                     /* Right adjust. */                                  \
00364     false                      /* Deactivate conversion after one scan sequence. */ \
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,              /* PRS ch0 (if enabled). */                          \
00411     adcAcqTime1,               /* 1 ADC_CLK cycle acquisition time. */              \
00412     adcRef1V25,                /* 1.25V internal reference. */                      \
00413     adcRes12Bit,               /* 12 bit resolution. */                             \
00414     adcSingleInpCh0,           /* CH0 input selected. */                            \
00415     false,                     /* Single ended input. */                            \
00416     false,                     /* PRS disabled. */                                  \
00417     false,                     /* Right adjust. */                                  \
00418     false                      /* Deactivate conversion after one scan sequence. */ \
00419   }
00420 
00421 
00422 /*******************************************************************************
00423  *****************************   PROTOTYPES   **********************************
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 /* defined(ADC_COUNT) && (ADC_COUNT > 0) */
00586 #endif /* __SILICON_LABS_EM_ADC_H_ */