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
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
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
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