em_opamp.c

Go to the documentation of this file.
00001 /**************************************************************************/
00034 #include "em_device.h"
00035 #if defined( OPAMP_PRESENT ) && ( OPAMP_COUNT == 1 )
00036 
00037 #include "em_system.h"
00038 #include "em_assert.h"
00039 #include "em_opamp.h"
00040 
00041 /***************************************************************************/
00047 /***************************************************************************/
00193 /*******************************************************************************
00194  **************************   GLOBAL FUNCTIONS   *******************************
00195  ******************************************************************************/
00196 
00197 /***************************************************************************/
00207 void OPAMP_Disable( DAC_TypeDef *dac, OPAMP_TypeDef opa )
00208 {
00209   EFM_ASSERT( DAC_REF_VALID( dac ) );
00210   EFM_ASSERT( DAC_OPA_VALID( opa ) );
00211 
00212   if ( opa == OPA0 )
00213   {
00214     dac->CH0CTRL &= ~DAC_CH0CTRL_EN;
00215     dac->OPACTRL &= ~DAC_OPACTRL_OPA0EN;
00216   }
00217   else if ( opa == OPA1 )
00218   {
00219     dac->CH1CTRL &= ~DAC_CH1CTRL_EN;
00220     dac->OPACTRL &= ~DAC_OPACTRL_OPA1EN;
00221   }
00222   else /* OPA2 */
00223   {
00224     dac->OPACTRL &= ~DAC_OPACTRL_OPA2EN;
00225   }
00226 }
00227 
00228 
00229 /***************************************************************************/
00268 void OPAMP_Enable( DAC_TypeDef *dac, OPAMP_TypeDef opa, const OPAMP_Init_TypeDef *init )
00269 {
00270   uint32_t offset;
00271 
00272   EFM_ASSERT( DAC_REF_VALID( dac ) );
00273   EFM_ASSERT( DAC_OPA_VALID( opa ) );
00274   EFM_ASSERT( init->bias <= ( _DAC_BIASPROG_BIASPROG_MASK  >>
00275                               _DAC_BIASPROG_BIASPROG_SHIFT    ) );
00276 
00277   if ( opa == OPA0 )
00278   {
00279     EFM_ASSERT( ( init->outPen & ~_DAC_OPA0MUX_OUTPEN_MASK ) == 0 );
00280 
00281     dac->BIASPROG = ( dac->BIASPROG
00282                       & ~( _DAC_BIASPROG_BIASPROG_MASK             |
00283                             DAC_BIASPROG_HALFBIAS                    )  ) |
00284                     ( init->bias      << _DAC_BIASPROG_BIASPROG_SHIFT   ) |
00285                     ( init->halfBias   ? DAC_BIASPROG_HALFBIAS      : 0 );
00286 
00287     if ( init->defaultOffset )
00288     {
00289       offset = SYSTEM_GetCalibrationValue( &dac->CAL );
00290       dac->CAL = ( dac->CAL & ~_DAC_CAL_CH0OFFSET_MASK ) |
00291                  ( offset   &  _DAC_CAL_CH0OFFSET_MASK );
00292     }
00293     else
00294     {
00295       EFM_ASSERT( init->offset <= ( _DAC_CAL_CH0OFFSET_MASK >>
00296                                     _DAC_CAL_CH0OFFSET_SHIFT   ) );
00297 
00298       dac->CAL = ( dac->CAL      & ~_DAC_CAL_CH0OFFSET_MASK  ) |
00299                  ( init->offset <<  _DAC_CAL_CH0OFFSET_SHIFT );
00300     }
00301 
00302     dac->OPA0MUX  = (uint32_t)init->resSel                                |
00303                     (uint32_t)init->outMode                               |
00304                     init->outPen                                          |
00305                     (uint32_t)init->resInMux                              |
00306                     (uint32_t)init->negSel                                |
00307                     (uint32_t)init->posSel                                |
00308                     ( init->nextOut     ? DAC_OPA0MUX_NEXTOUT       : 0 ) |
00309                     ( init->npEn        ? DAC_OPA0MUX_NPEN          : 0 ) |
00310                     ( init->ppEn        ? DAC_OPA0MUX_PPEN          : 0 );
00311 
00312     dac->CH0CTRL |= DAC_CH0CTRL_EN;
00313     dac->OPACTRL  = ( dac->OPACTRL
00314                       & ~(  DAC_OPACTRL_OPA0SHORT                  |
00315                            _DAC_OPACTRL_OPA0LPFDIS_MASK            |
00316                             DAC_OPACTRL_OPA0HCMDIS                   )  ) |
00317                     ( init->shortInputs ?  DAC_OPACTRL_OPA0SHORT    : 0 ) |
00318                     ( init->lpfPosPadDisable ?
00319                                      DAC_OPACTRL_OPA0LPFDIS_PLPFDIS : 0 ) |
00320                     ( init->lpfNegPadDisable ?
00321                                      DAC_OPACTRL_OPA0LPFDIS_NLPFDIS : 0 ) |
00322                     ( init->hcmDisable  ?  DAC_OPACTRL_OPA0HCMDIS   : 0 ) |
00323                     ( DAC_OPACTRL_OPA0EN                                );
00324   }
00325   else if ( opa == OPA1 )
00326   {
00327     EFM_ASSERT( ( init->outPen & ~_DAC_OPA1MUX_OUTPEN_MASK ) == 0 );
00328 
00329     dac->BIASPROG = ( dac->BIASPROG
00330                       & ~( _DAC_BIASPROG_BIASPROG_MASK             |
00331                             DAC_BIASPROG_HALFBIAS                    )  ) |
00332                     ( init->bias      << _DAC_BIASPROG_BIASPROG_SHIFT   ) |
00333                     ( init->halfBias   ? DAC_BIASPROG_HALFBIAS      : 0 );
00334 
00335     if ( init->defaultOffset )
00336     {
00337       offset = SYSTEM_GetCalibrationValue( &dac->CAL );
00338       dac->CAL = ( dac->CAL & ~_DAC_CAL_CH1OFFSET_MASK ) |
00339                  ( offset   &  _DAC_CAL_CH1OFFSET_MASK );
00340     }
00341     else
00342     {
00343       EFM_ASSERT( init->offset <= ( _DAC_CAL_CH1OFFSET_MASK >>
00344                                     _DAC_CAL_CH1OFFSET_SHIFT   ) );
00345 
00346       dac->CAL = ( dac->CAL      & ~_DAC_CAL_CH1OFFSET_MASK  ) |
00347                  ( init->offset <<  _DAC_CAL_CH1OFFSET_SHIFT );
00348     }
00349 
00350     dac->OPA1MUX  = (uint32_t)init->resSel                                |
00351                     (uint32_t)init->outMode                               |
00352                     init->outPen                                          |
00353                     (uint32_t)init->resInMux                              |
00354                     (uint32_t)init->negSel                                |
00355                     (uint32_t)init->posSel                                |
00356                     ( init->nextOut     ? DAC_OPA1MUX_NEXTOUT       : 0 ) |
00357                     ( init->npEn        ? DAC_OPA1MUX_NPEN          : 0 ) |
00358                     ( init->ppEn        ? DAC_OPA1MUX_PPEN          : 0 );
00359 
00360     dac->CH1CTRL |= DAC_CH1CTRL_EN;
00361     dac->OPACTRL  = ( dac->OPACTRL
00362                       & ~(  DAC_OPACTRL_OPA1SHORT                  |
00363                            _DAC_OPACTRL_OPA1LPFDIS_MASK            |
00364                              DAC_OPACTRL_OPA1HCMDIS                  )  ) |
00365                     ( init->shortInputs ?  DAC_OPACTRL_OPA1SHORT    : 0 ) |
00366                     ( init->lpfPosPadDisable ?
00367                                      DAC_OPACTRL_OPA1LPFDIS_PLPFDIS : 0 ) |
00368                     ( init->lpfNegPadDisable ?
00369                                      DAC_OPACTRL_OPA1LPFDIS_NLPFDIS : 0 ) |
00370                     ( init->hcmDisable  ?  DAC_OPACTRL_OPA1HCMDIS   : 0 ) |
00371                     ( DAC_OPACTRL_OPA1EN                                );
00372   }
00373   else /* OPA2 */
00374   {
00375     EFM_ASSERT( ( init->posSel == DAC_OPA2MUX_POSSEL_DISABLE ) ||
00376                 ( init->posSel == DAC_OPA2MUX_POSSEL_POSPAD  ) ||
00377                 ( init->posSel == DAC_OPA2MUX_POSSEL_OPA1INP ) ||
00378                 ( init->posSel == DAC_OPA2MUX_POSSEL_OPATAP  )    );
00379 
00380     EFM_ASSERT( ( init->outMode & ~DAC_OPA2MUX_OUTMODE ) == 0 );
00381 
00382     EFM_ASSERT( ( init->outPen & ~_DAC_OPA2MUX_OUTPEN_MASK ) == 0 );
00383 
00384     dac->BIASPROG = ( dac->BIASPROG
00385                       & ~( _DAC_BIASPROG_OPA2BIASPROG_MASK         |
00386                             DAC_BIASPROG_OPA2HALFBIAS                )  ) |
00387                     ( init->bias   << _DAC_BIASPROG_OPA2BIASPROG_SHIFT  ) |
00388                     ( init->halfBias   ? DAC_BIASPROG_OPA2HALFBIAS  : 0 );
00389 
00390     if ( init->defaultOffset )
00391     {
00392       offset = SYSTEM_GetCalibrationValue( &dac->OPAOFFSET );
00393       dac->OPAOFFSET = ( dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK ) |
00394                        ( offset         &  _DAC_OPAOFFSET_OPA2OFFSET_MASK );
00395     }
00396     else
00397     {
00398       EFM_ASSERT( init->offset <= ( _DAC_OPAOFFSET_OPA2OFFSET_MASK >>
00399                                     _DAC_OPAOFFSET_OPA2OFFSET_SHIFT   ) );
00400       dac->OPAOFFSET = ( dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK ) |
00401                        ( init->offset <<  _DAC_OPAOFFSET_OPA2OFFSET_SHIFT );
00402     }
00403 
00404     dac->OPA2MUX  = (uint32_t)init->resSel                                |
00405                     (uint32_t)init->outMode                               |
00406                     init->outPen                                          |
00407                     (uint32_t)init->resInMux                              |
00408                     (uint32_t)init->negSel                                |
00409                     (uint32_t)init->posSel                                |
00410                     ( init->nextOut     ? DAC_OPA2MUX_NEXTOUT       : 0 ) |
00411                     ( init->npEn        ? DAC_OPA2MUX_NPEN          : 0 ) |
00412                     ( init->ppEn        ? DAC_OPA2MUX_PPEN          : 0 );
00413 
00414     dac->OPACTRL  = ( dac->OPACTRL
00415                       & ~(  DAC_OPACTRL_OPA2SHORT                  |
00416                            _DAC_OPACTRL_OPA2LPFDIS_MASK            |
00417                             DAC_OPACTRL_OPA2HCMDIS                   )  ) |
00418                     ( init->shortInputs ?  DAC_OPACTRL_OPA2SHORT    : 0 ) |
00419                     ( init->lpfPosPadDisable ?
00420                                      DAC_OPACTRL_OPA2LPFDIS_PLPFDIS : 0 ) |
00421                     ( init->lpfNegPadDisable ?
00422                                      DAC_OPACTRL_OPA2LPFDIS_NLPFDIS : 0 ) |
00423                     ( init->hcmDisable  ?  DAC_OPACTRL_OPA2HCMDIS   : 0 ) |
00424                     ( DAC_OPACTRL_OPA2EN                                );
00425   }
00426 }
00427 
00431 #endif /* defined( OPAMP_PRESENT ) && ( OPAMP_COUNT == 1 ) */