123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- #include "fsl_adc16.h"
- static uint32_t ADC16_GetInstance(ADC_Type *base);
- static ADC_Type *const s_adc16Bases[] = ADC_BASE_PTRS;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- static const clock_ip_name_t s_adc16Clocks[] = ADC16_CLOCKS;
- #endif
- static uint32_t ADC16_GetInstance(ADC_Type *base)
- {
- uint32_t instance;
-
- for (instance = 0; instance < ARRAY_SIZE(s_adc16Bases); instance++)
- {
- if (s_adc16Bases[instance] == base)
- {
- break;
- }
- }
- assert(instance < ARRAY_SIZE(s_adc16Bases));
- return instance;
- }
- void ADC16_Init(ADC_Type *base, const adc16_config_t *config)
- {
- assert(NULL != config);
- uint32_t tmp32;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
-
- CLOCK_EnableClock(s_adc16Clocks[ADC16_GetInstance(base)]);
- #endif
-
- tmp32 = ADC_CFG1_ADICLK(config->clockSource) | ADC_CFG1_MODE(config->resolution);
- if (kADC16_LongSampleDisabled != config->longSampleMode)
- {
- tmp32 |= ADC_CFG1_ADLSMP_MASK;
- }
- tmp32 |= ADC_CFG1_ADIV(config->clockDivider);
- if (config->enableLowPower)
- {
- tmp32 |= ADC_CFG1_ADLPC_MASK;
- }
- base->CFG1 = tmp32;
-
- tmp32 = base->CFG2 & ~(ADC_CFG2_ADACKEN_MASK | ADC_CFG2_ADHSC_MASK | ADC_CFG2_ADLSTS_MASK);
- if (kADC16_LongSampleDisabled != config->longSampleMode)
- {
- tmp32 |= ADC_CFG2_ADLSTS(config->longSampleMode);
- }
- if (config->enableHighSpeed)
- {
- tmp32 |= ADC_CFG2_ADHSC_MASK;
- }
- if (config->enableAsynchronousClock)
- {
- tmp32 |= ADC_CFG2_ADACKEN_MASK;
- }
- base->CFG2 = tmp32;
-
- tmp32 = base->SC2 & ~(ADC_SC2_REFSEL_MASK);
- tmp32 |= ADC_SC2_REFSEL(config->referenceVoltageSource);
- base->SC2 = tmp32;
-
- if (config->enableContinuousConversion)
- {
- base->SC3 |= ADC_SC3_ADCO_MASK;
- }
- else
- {
- base->SC3 &= ~ADC_SC3_ADCO_MASK;
- }
- }
- void ADC16_Deinit(ADC_Type *base)
- {
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
-
- CLOCK_DisableClock(s_adc16Clocks[ADC16_GetInstance(base)]);
- #endif
- }
- void ADC16_GetDefaultConfig(adc16_config_t *config)
- {
- assert(NULL != config);
- config->referenceVoltageSource = kADC16_ReferenceVoltageSourceVref;
- config->clockSource = kADC16_ClockSourceAsynchronousClock;
- config->enableAsynchronousClock = true;
- config->clockDivider = kADC16_ClockDivider8;
- config->resolution = kADC16_ResolutionSE12Bit;
- config->longSampleMode = kADC16_LongSampleDisabled;
- config->enableHighSpeed = false;
- config->enableLowPower = false;
- config->enableContinuousConversion = false;
- }
- #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
- status_t ADC16_DoAutoCalibration(ADC_Type *base)
- {
- bool bHWTrigger = false;
- volatile uint32_t tmp32;
- status_t status = kStatus_Success;
-
- if (0U != (ADC_SC2_ADTRG_MASK & base->SC2))
- {
- bHWTrigger = true;
- base->SC2 &= ~ADC_SC2_ADTRG_MASK;
- }
-
- base->SC3 |= ADC_SC3_CAL_MASK | ADC_SC3_CALF_MASK;
- while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(base, 0U)))
- {
-
- if (0U != (kADC16_CalibrationFailedFlag & ADC16_GetStatusFlags(base)))
- {
- status = kStatus_Fail;
- break;
- }
- }
- tmp32 = base->R[0];
-
- if (bHWTrigger)
- {
- base->SC2 |= ADC_SC2_ADTRG_MASK;
- }
-
- if (0U != (kADC16_CalibrationFailedFlag & ADC16_GetStatusFlags(base)))
- {
- status = kStatus_Fail;
- }
- if (kStatus_Success != status)
- {
- return status;
- }
-
- tmp32 = base->CLP0 + base->CLP1 + base->CLP2 + base->CLP3 + base->CLP4 + base->CLPS;
- tmp32 = 0x8000U | (tmp32 >> 1U);
- base->PG = tmp32;
- #if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
- tmp32 = base->CLM0 + base->CLM1 + base->CLM2 + base->CLM3 + base->CLM4 + base->CLMS;
- tmp32 = 0x8000U | (tmp32 >> 1U);
- base->MG = tmp32;
- #endif
- return kStatus_Success;
- }
- #endif
- #if defined(FSL_FEATURE_ADC16_HAS_MUX_SELECT) && FSL_FEATURE_ADC16_HAS_MUX_SELECT
- void ADC16_SetChannelMuxMode(ADC_Type *base, adc16_channel_mux_mode_t mode)
- {
- if (kADC16_ChannelMuxA == mode)
- {
- base->CFG2 &= ~ADC_CFG2_MUXSEL_MASK;
- }
- else
- {
- base->CFG2 |= ADC_CFG2_MUXSEL_MASK;
- }
- }
- #endif
- void ADC16_SetHardwareCompareConfig(ADC_Type *base, const adc16_hardware_compare_config_t *config)
- {
- uint32_t tmp32 = base->SC2 & ~(ADC_SC2_ACFE_MASK | ADC_SC2_ACFGT_MASK | ADC_SC2_ACREN_MASK);
- if (!config)
- {
- base->SC2 = tmp32;
- return;
- }
-
- tmp32 |= ADC_SC2_ACFE_MASK;
-
- switch (config->hardwareCompareMode)
- {
- case kADC16_HardwareCompareMode0:
- break;
- case kADC16_HardwareCompareMode1:
- tmp32 |= ADC_SC2_ACFGT_MASK;
- break;
- case kADC16_HardwareCompareMode2:
- tmp32 |= ADC_SC2_ACREN_MASK;
- break;
- case kADC16_HardwareCompareMode3:
- tmp32 |= ADC_SC2_ACFGT_MASK | ADC_SC2_ACREN_MASK;
- break;
- default:
- break;
- }
- base->SC2 = tmp32;
-
- base->CV1 = ADC_CV1_CV(config->value1);
- base->CV2 = ADC_CV2_CV(config->value2);
- }
- #if defined(FSL_FEATURE_ADC16_HAS_HW_AVERAGE) && FSL_FEATURE_ADC16_HAS_HW_AVERAGE
- void ADC16_SetHardwareAverage(ADC_Type *base, adc16_hardware_average_mode_t mode)
- {
- uint32_t tmp32 = base->SC3 & ~(ADC_SC3_AVGE_MASK | ADC_SC3_AVGS_MASK);
- if (kADC16_HardwareAverageDisabled != mode)
- {
- tmp32 |= ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(mode);
- }
- base->SC3 = tmp32;
- }
- #endif
- #if defined(FSL_FEATURE_ADC16_HAS_PGA) && FSL_FEATURE_ADC16_HAS_PGA
- void ADC16_SetPGAConfig(ADC_Type *base, const adc16_pga_config_t *config)
- {
- uint32_t tmp32;
- if (!config)
- {
- base->PGA = 0U;
- return;
- }
-
- tmp32 = ADC_PGA_PGAEN_MASK | ADC_PGA_PGAG(config->pgaGain);
-
- if (config->enableRunInNormalMode)
- {
- tmp32 |= ADC_PGA_PGALPb_MASK;
- }
- #if defined(FSL_FEATURE_ADC16_HAS_PGA_CHOPPING) && FSL_FEATURE_ADC16_HAS_PGA_CHOPPING
- if (config->disablePgaChopping)
- {
- tmp32 |= ADC_PGA_PGACHPb_MASK;
- }
- #endif
- #if defined(FSL_FEATURE_ADC16_HAS_PGA_OFFSET_MEASUREMENT) && FSL_FEATURE_ADC16_HAS_PGA_OFFSET_MEASUREMENT
- if (config->enableRunInOffsetMeasurement)
- {
- tmp32 |= ADC_PGA_PGAOFSM_MASK;
- }
- #endif
- base->PGA = tmp32;
- }
- #endif
- uint32_t ADC16_GetStatusFlags(ADC_Type *base)
- {
- uint32_t ret = 0;
- if (0U != (base->SC2 & ADC_SC2_ADACT_MASK))
- {
- ret |= kADC16_ActiveFlag;
- }
- #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
- if (0U != (base->SC3 & ADC_SC3_CALF_MASK))
- {
- ret |= kADC16_CalibrationFailedFlag;
- }
- #endif
- return ret;
- }
- void ADC16_ClearStatusFlags(ADC_Type *base, uint32_t mask)
- {
- #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
- if (0U != (mask & kADC16_CalibrationFailedFlag))
- {
- base->SC3 |= ADC_SC3_CALF_MASK;
- }
- #endif
- }
- void ADC16_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc16_channel_config_t *config)
- {
- assert(channelGroup < ADC_SC1_COUNT);
- assert(NULL != config);
- uint32_t sc1 = ADC_SC1_ADCH(config->channelNumber);
- #if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
-
- if (config->enableDifferentialConversion)
- {
- sc1 |= ADC_SC1_DIFF_MASK;
- }
- #endif
-
- if (config->enableInterruptOnConversionCompleted)
- {
- sc1 |= ADC_SC1_AIEN_MASK;
- }
- base->SC1[channelGroup] = sc1;
- }
- uint32_t ADC16_GetChannelStatusFlags(ADC_Type *base, uint32_t channelGroup)
- {
- assert(channelGroup < ADC_SC1_COUNT);
- uint32_t ret = 0U;
- if (0U != (base->SC1[channelGroup] & ADC_SC1_COCO_MASK))
- {
- ret |= kADC16_ChannelConversionDoneFlag;
- }
- return ret;
- }
|