em_vcmp.c

Go to the documentation of this file.
00001 /***************************************************************************/
00034 #include "em_vcmp.h"
00035 #if defined(VCMP_COUNT) && (VCMP_COUNT > 0)
00036 
00037 #include "em_assert.h"
00038 
00039 /***************************************************************************/
00044 /***************************************************************************/
00050 /***************************************************************************/
00057 void VCMP_Init(const VCMP_Init_TypeDef *vcmpInit)
00058 {
00059   /* Verify input */
00060   EFM_ASSERT((vcmpInit->inactive == 0) || (vcmpInit->inactive == 1));
00061   EFM_ASSERT((vcmpInit->biasProg >= 0) && (vcmpInit->biasProg < 16));
00062 
00063   /* Configure Half Bias setting */
00064   if (vcmpInit->halfBias)
00065   {
00066     VCMP->CTRL |= VCMP_CTRL_HALFBIAS;
00067   }
00068   else
00069   {
00070     VCMP->CTRL &= ~(VCMP_CTRL_HALFBIAS);
00071   }
00072 
00073   /* Configure bias prog */
00074   VCMP->CTRL &= ~(_VCMP_CTRL_BIASPROG_MASK);
00075   VCMP->CTRL |= (vcmpInit->biasProg << _VCMP_CTRL_BIASPROG_SHIFT);
00076 
00077   /* Configure sense for falling edge */
00078   if (vcmpInit->irqFalling)
00079   {
00080     VCMP->CTRL |= VCMP_CTRL_IFALL;
00081   }
00082   else
00083   {
00084     VCMP->CTRL &= ~(VCMP_CTRL_IFALL);
00085   }
00086 
00087   /* Configure sense for rising edge */
00088   if (vcmpInit->irqRising)
00089   {
00090     VCMP->CTRL |= VCMP_CTRL_IRISE;
00091   }
00092   else
00093   {
00094     VCMP->CTRL &= ~(VCMP_CTRL_IRISE);
00095   }
00096 
00097   /* Configure warm-up time */
00098   VCMP->CTRL &= ~(_VCMP_CTRL_WARMTIME_MASK);
00099   VCMP->CTRL |= (vcmpInit->warmup << _VCMP_CTRL_WARMTIME_SHIFT);
00100 
00101   /* Configure hysteresis */
00102   switch (vcmpInit->hyst)
00103   {
00104   case vcmpHyst20mV:
00105     VCMP->CTRL |= VCMP_CTRL_HYSTEN;
00106     break;
00107   case vcmpHystNone:
00108     VCMP->CTRL &= ~(VCMP_CTRL_HYSTEN);
00109     break;
00110   default:
00111     break;
00112   }
00113 
00114   /* Configure inactive output value */
00115   VCMP->CTRL |= (vcmpInit->inactive << _VCMP_CTRL_INACTVAL_SHIFT);
00116 
00117   /* Configure trigger level */
00118   VCMP_TriggerSet(vcmpInit->triggerLevel);
00119 
00120   /* Enable or disable VCMP */
00121   if (vcmpInit->enable)
00122   {
00123     VCMP->CTRL |= VCMP_CTRL_EN;
00124   }
00125   else
00126   {
00127     VCMP->CTRL &= ~(VCMP_CTRL_EN);
00128   }
00129 
00130   /* If Low Power Reference is enabled, wait until VCMP is ready */
00131   /* before enabling it, see reference manual for deatils        */
00132   /* Configuring Low Power Ref without enable has no effect      */
00133   if(vcmpInit->lowPowerRef && vcmpInit->enable)
00134   {
00135     /* Poll for VCMP ready */
00136     while(!VCMP_Ready());
00137     VCMP_LowPowerRefSet(vcmpInit->lowPowerRef);
00138   }
00139 
00140   /* Clear edge interrupt */
00141   VCMP_IntClear(VCMP_IF_EDGE);
00142 }
00143 
00144 
00145 /***************************************************************************/
00152 void VCMP_LowPowerRefSet(bool enable)
00153 {
00154   if (enable)
00155   {
00156     VCMP->INPUTSEL |= VCMP_INPUTSEL_LPREF;
00157   }
00158   else
00159   {
00160     VCMP->INPUTSEL &= ~(VCMP_INPUTSEL_LPREF);
00161   }
00162 }
00163 
00164 
00165 /***************************************************************************/
00172 void VCMP_TriggerSet(int level)
00173 {
00174   /* Trigger range is 6 bits, value from 0-63 */
00175   EFM_ASSERT((level > 0) && (level < 64));
00176 
00177   /* Set trigger level */
00178   VCMP->INPUTSEL = (VCMP->INPUTSEL & ~(_VCMP_INPUTSEL_TRIGLEVEL_MASK)) |
00179                    (level << _VCMP_INPUTSEL_TRIGLEVEL_SHIFT);
00180 }
00181 
00182 
00185 #endif /* defined(VCMP_COUNT) && (VCMP_COUNT > 0) */