em_dac.h

Go to the documentation of this file.
00001 /***************************************************************************/
00034 #ifndef __EM_DAC_H
00035 #define __EM_DAC_H
00036 
00037 #include "em_device.h"
00038 #include "em_assert.h"
00039 
00040 #if defined(DAC_COUNT) && (DAC_COUNT > 0)
00041 
00042 #include <stdbool.h>
00043 
00044 #ifdef __cplusplus
00045 extern "C" {
00046 #endif
00047 
00048 
00049 /***************************************************************************/
00054 /***************************************************************************/
00062 #define DAC_REF_VALID(ref)    ((ref) == DAC0)
00063 
00066 /*******************************************************************************
00067  ********************************   ENUMS   ************************************
00068  ******************************************************************************/
00069 
00071 typedef enum
00072 {
00073   dacConvModeContinuous = _DAC_CTRL_CONVMODE_CONTINUOUS, 
00074   dacConvModeSampleHold = _DAC_CTRL_CONVMODE_SAMPLEHOLD, 
00075   dacConvModeSampleOff  = _DAC_CTRL_CONVMODE_SAMPLEOFF   
00076 } DAC_ConvMode_TypeDef;
00077 
00079 typedef enum
00080 {
00081   dacOutputDisable = _DAC_CTRL_OUTMODE_DISABLE, 
00082   dacOutputPin     = _DAC_CTRL_OUTMODE_PIN,     
00083   dacOutputADC     = _DAC_CTRL_OUTMODE_ADC,     
00084   dacOutputPinADC  = _DAC_CTRL_OUTMODE_PINADC   
00085 } DAC_Output_TypeDef;
00086 
00087 
00089 typedef enum
00090 {
00091   dacPRSSELCh0 = _DAC_CH0CTRL_PRSSEL_PRSCH0, 
00092   dacPRSSELCh1 = _DAC_CH0CTRL_PRSSEL_PRSCH1, 
00093   dacPRSSELCh2 = _DAC_CH0CTRL_PRSSEL_PRSCH2, 
00094   dacPRSSELCh3 = _DAC_CH0CTRL_PRSSEL_PRSCH3, 
00095   dacPRSSELCh4 = _DAC_CH0CTRL_PRSSEL_PRSCH4, 
00096   dacPRSSELCh5 = _DAC_CH0CTRL_PRSSEL_PRSCH5, 
00097   dacPRSSELCh6 = _DAC_CH0CTRL_PRSSEL_PRSCH6, 
00098   dacPRSSELCh7 = _DAC_CH0CTRL_PRSSEL_PRSCH7  
00099 } DAC_PRSSEL_TypeDef;
00100 
00101 
00103 typedef enum
00104 {
00105   dacRef1V25 = _DAC_CTRL_REFSEL_1V25, 
00106   dacRef2V5  = _DAC_CTRL_REFSEL_2V5,  
00107   dacRefVDD  = _DAC_CTRL_REFSEL_VDD   
00108 } DAC_Ref_TypeDef;
00109 
00110 
00112 typedef enum
00113 {
00114   dacRefresh8  = _DAC_CTRL_REFRSEL_8CYCLES,  
00115   dacRefresh16 = _DAC_CTRL_REFRSEL_16CYCLES, 
00116   dacRefresh32 = _DAC_CTRL_REFRSEL_32CYCLES, 
00117   dacRefresh64 = _DAC_CTRL_REFRSEL_64CYCLES  
00118 } DAC_Refresh_TypeDef;
00119 
00120 
00121 /*******************************************************************************
00122  *******************************   STRUCTS   ***********************************
00123  ******************************************************************************/
00124 
00126 typedef struct
00127 {
00129   DAC_Refresh_TypeDef  refresh;
00130 
00132   DAC_Ref_TypeDef      reference;
00133 
00135   DAC_Output_TypeDef   outMode;
00136 
00138   DAC_ConvMode_TypeDef convMode;
00139 
00144   uint8_t              prescale;
00145 
00147   bool                 lpEnable;
00148 
00150   bool                 ch0ResetPre;
00151 
00153   bool                 outEnablePRS;
00154 
00156   bool                 sineEnable;
00157 
00159   bool                 diff;
00160 } DAC_Init_TypeDef;
00161 
00163 #define DAC_INIT_DEFAULT                                                 \
00164   { dacRefresh8,              /* Refresh every 8 prescaled cycles. */    \
00165     dacRef1V25,               /* 1.25V internal reference. */            \
00166     dacOutputPin,             /* Output to pin only. */                  \
00167     dacConvModeContinuous,    /* Continuous mode. */                     \
00168     0,                        /* No prescaling. */                       \
00169     false,                    /* Do not enable low pass filter. */       \
00170     false,                    /* Do not reset prescaler on ch0 start. */ \
00171     false,                    /* DAC output enable always on. */         \
00172     false,                    /* Disable sine mode. */                   \
00173     false                     /* Single ended mode. */                   \
00174   }
00175 
00176 
00178 typedef struct
00179 {
00181   bool               enable;
00182 
00187   bool               prsEnable;
00188 
00193   bool               refreshEnable;
00194 
00199   DAC_PRSSEL_TypeDef prsSel;
00200 } DAC_InitChannel_TypeDef;
00201 
00203 #define DAC_INITCHANNEL_DEFAULT                                           \
00204   { false,              /* Leave channel disabled when init done. */      \
00205     false,              /* Disable PRS triggering. */                     \
00206     false,              /* Channel not refreshed automatically. */        \
00207     dacPRSSELCh0        /* Select PRS ch0 (if PRS triggering enabled). */ \
00208   }
00209 
00210 
00211 /*******************************************************************************
00212  *****************************   PROTOTYPES   **********************************
00213  ******************************************************************************/
00214 
00215 void DAC_Enable(DAC_TypeDef *dac, unsigned int ch, bool enable);
00216 void DAC_Init(DAC_TypeDef *dac, const DAC_Init_TypeDef *init);
00217 void DAC_InitChannel(DAC_TypeDef *dac,
00218                      const DAC_InitChannel_TypeDef *init,
00219                      unsigned int ch);
00220 void DAC_ChannelOutputSet(DAC_TypeDef *dac,
00221                           unsigned int channel,
00222                           uint32_t     value);
00223 
00224 /***************************************************************************/
00238 __STATIC_INLINE void DAC_Channel0OutputSet( DAC_TypeDef *dac,
00239                                             uint32_t     value )
00240 {
00241   EFM_ASSERT(value<=_DAC_CH0DATA_MASK);
00242   dac->CH0DATA = value;
00243 }
00244 
00245 
00246 /***************************************************************************/
00260 __STATIC_INLINE void DAC_Channel1OutputSet( DAC_TypeDef *dac,
00261                                             uint32_t     value )
00262 {
00263   EFM_ASSERT(value<=_DAC_CH1DATA_MASK);
00264   dac->CH1DATA = value;
00265 }
00266 
00267 
00268 /***************************************************************************/
00279 __STATIC_INLINE void DAC_IntClear(DAC_TypeDef *dac, uint32_t flags)
00280 {
00281   dac->IFC = flags;
00282 }
00283 
00284 
00285 /***************************************************************************/
00296 __STATIC_INLINE void DAC_IntDisable(DAC_TypeDef *dac, uint32_t flags)
00297 {
00298   dac->IEN &= ~(flags);
00299 }
00300 
00301 
00302 /***************************************************************************/
00318 __STATIC_INLINE void DAC_IntEnable(DAC_TypeDef *dac, uint32_t flags)
00319 {
00320   dac->IEN |= flags;
00321 }
00322 
00323 
00324 /***************************************************************************/
00338 __STATIC_INLINE uint32_t DAC_IntGet(DAC_TypeDef *dac)
00339 {
00340   return(dac->IF);
00341 }
00342 
00343 
00344 /***************************************************************************/
00355 __STATIC_INLINE void DAC_IntSet(DAC_TypeDef *dac, uint32_t flags)
00356 {
00357   dac->IFS = flags;
00358 }
00359 
00360 uint8_t DAC_PrescaleCalc(uint32_t dacFreq, uint32_t hfperFreq);
00361 void DAC_Reset(DAC_TypeDef *dac);
00362 
00366 #ifdef __cplusplus
00367 }
00368 #endif
00369 
00370 #endif /* defined(DAC_COUNT) && (DAC_COUNT > 0) */
00371 
00372 #endif /* __EM_DAC_H */