360 lines
14 KiB
C
360 lines
14 KiB
C
//*****************************************************************************
|
|
//
|
|
// am_hal_adc.h
|
|
//! @file
|
|
//!
|
|
//! @brief Functions for interfacing with the Analog to Digital Converter
|
|
//!
|
|
//! @addtogroup adc1 Analog-to-Digital Converter (ADC)
|
|
//! @ingroup apollo1hal
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Copyright (c) 2020, Ambiq Micro
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are met:
|
|
//
|
|
// 1. Redistributions of source code must retain the above copyright notice,
|
|
// this list of conditions and the following disclaimer.
|
|
//
|
|
// 2. Redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution.
|
|
//
|
|
// 3. Neither the name of the copyright holder nor the names of its
|
|
// contributors may be used to endorse or promote products derived from this
|
|
// software without specific prior written permission.
|
|
//
|
|
// Third party software included in this distribution is subject to the
|
|
// additional license terms as defined in the /docs/licenses directory.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
// POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
// This is part of revision 2.4.2 of the AmbiqSuite Development Package.
|
|
//
|
|
//*****************************************************************************
|
|
#ifndef AM_HAL_ADC_H
|
|
#define AM_HAL_ADC_H
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Clock Selection
|
|
//! @brief These macros may be used to set the ADC module's clock source.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_CLOCK_OFF AM_REG_ADC_CFG_CLKSEL_OFF
|
|
#define AM_HAL_ADC_CLOCK_12MHZ AM_REG_ADC_CFG_CLKSEL_12MHZ
|
|
#define AM_HAL_ADC_CLOCK_6MHZ AM_REG_ADC_CFG_CLKSEL_6MHZ
|
|
#define AM_HAL_ADC_CLOCK_3MHZ AM_REG_ADC_CFG_CLKSEL_3MHZ
|
|
#define AM_HAL_ADC_CLOCK_1_5MHZ AM_REG_ADC_CFG_CLKSEL_1_5MHZ
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Trigger Settings
|
|
//! @brief ADC trigger setting macros.
|
|
//!
|
|
//! These macros alter the ADC's trigger source and trigger polarity. Note that
|
|
//! the external trigger setting needs to be ORed with a POS or NEG option to
|
|
//! define the desired trigger polarity.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_TRIGGER_FALL AM_REG_ADC_CFG_TRIGPOL_FALLING_EDGE
|
|
#define AM_HAL_ADC_TRIGGER_RISE AM_REG_ADC_CFG_TRIGPOL_RISING_EDGE
|
|
#define AM_HAL_ADC_TRIGGER_SOFT AM_REG_ADC_CFG_TRIGSEL(8)
|
|
#define AM_HAL_ADC_TRIGGER_EXT(n) AM_REG_ADC_CFG_TRIGSEL(n)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Reference Settings
|
|
//! @brief ADC reference voltage setting macros.
|
|
//!
|
|
//! These macros control the ADC reference voltage source.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_REF_VDD AM_REG_ADC_CFG_REFSEL_VDD
|
|
#define AM_HAL_ADC_REF_EXT AM_REG_ADC_CFG_REFSEL_ADCREF
|
|
#define AM_HAL_ADC_REF_INT AM_REG_ADC_CFG_REFSEL_INTERNAL
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Sample mode
|
|
//! @brief ADC sample mode settings
|
|
//!
|
|
//! These macros control the maximum allowable sample rate of the ADC.
|
|
//! Selecting a higher maximum sample rate will cause the microcontroller to
|
|
//! allocate more current to the ADC. It is recommended that this setting is
|
|
//! kept at the lowest possible value unless the application requires a faster
|
|
//! sample rate.
|
|
//!
|
|
//! There are only two allowable settings to the mode register.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_MODE_125KSPS AM_REG_ADC_CFG_OPMODE(0)
|
|
#define AM_HAL_ADC_MODE_1MSPS AM_REG_ADC_CFG_OPMODE(2)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Low Power Mode
|
|
//! @brief ADC power conservation settings.
|
|
//!
|
|
//! These macros select the power state to enter between active scans. Each low
|
|
//! power mode has it's own set of timing constraints. Please see the datasheet
|
|
//! for additional timing information on each power mode.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_LPMODE_NONE AM_REG_ADC_CFG_LPMODE(0)
|
|
#define AM_HAL_ADC_LPMODE_1 AM_REG_ADC_CFG_LPMODE(1)
|
|
#define AM_HAL_ADC_LPMODE_2 AM_REG_ADC_CFG_LPMODE(2)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @brief Enable repeating scan mode.
|
|
//!
|
|
//! Use this macro to enable repeating scans using a timer.
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_REPEAT AM_REG_ADC_CFG_RPTEN(1)
|
|
#define AM_HAL_ADC_NO_REPEAT AM_REG_ADC_CFG_RPTEN(0)
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @brief Power On Temp Sensor
|
|
//!
|
|
//! Use this macro to turn on the temp sensor
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_PON_TEMP AM_REG_ADC_CFG_TMPSPWR_EN
|
|
#define AM_HAL_ADC_POFF_TEMP AM_REG_ADC_CFG_TMPSPWR_DIS
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @brief Set ADC window limits.
|
|
//!
|
|
//! Use this macro to set the window limits on the ADC.
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_WINDOW(upper, lower) \
|
|
((upper << 16) | (lower & 0xFFFF))
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Slot configuration
|
|
//! @brief Slot configuration macros
|
|
//!
|
|
//! These macros may be used to configure an individual ADC slot.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_SLOT_AVG_1 AM_REG_ADC_SL0CFG_ADSEL0(0)
|
|
#define AM_HAL_ADC_SLOT_AVG_2 AM_REG_ADC_SL0CFG_ADSEL0(1)
|
|
#define AM_HAL_ADC_SLOT_AVG_4 AM_REG_ADC_SL0CFG_ADSEL0(2)
|
|
#define AM_HAL_ADC_SLOT_AVG_8 AM_REG_ADC_SL0CFG_ADSEL0(3)
|
|
#define AM_HAL_ADC_SLOT_AVG_16 AM_REG_ADC_SL0CFG_ADSEL0(4)
|
|
#define AM_HAL_ADC_SLOT_AVG_32 AM_REG_ADC_SL0CFG_ADSEL0(5)
|
|
#define AM_HAL_ADC_SLOT_AVG_64 AM_REG_ADC_SL0CFG_ADSEL0(6)
|
|
#define AM_HAL_ADC_SLOT_AVG_128 AM_REG_ADC_SL0CFG_ADSEL0(7)
|
|
|
|
#define AM_HAL_ADC_SLOT_HOLD_1 AM_REG_ADC_SL0CFG_THSEL0(0)
|
|
#define AM_HAL_ADC_SLOT_HOLD_2 AM_REG_ADC_SL0CFG_THSEL0(1)
|
|
#define AM_HAL_ADC_SLOT_HOLD_4 AM_REG_ADC_SL0CFG_THSEL0(2)
|
|
#define AM_HAL_ADC_SLOT_HOLD_8 AM_REG_ADC_SL0CFG_THSEL0(3)
|
|
#define AM_HAL_ADC_SLOT_HOLD_16 AM_REG_ADC_SL0CFG_THSEL0(4)
|
|
#define AM_HAL_ADC_SLOT_HOLD_32 AM_REG_ADC_SL0CFG_THSEL0(5)
|
|
#define AM_HAL_ADC_SLOT_HOLD_64 AM_REG_ADC_SL0CFG_THSEL0(6)
|
|
#define AM_HAL_ADC_SLOT_HOLD_128 AM_REG_ADC_SL0CFG_THSEL0(7)
|
|
|
|
#define AM_HAL_ADC_SLOT_CHANNEL(n) AM_REG_ADC_SL0CFG_CHSEL0(n)
|
|
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT0 AM_REG_ADC_SL0CFG_CHSEL0_EXT0
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT1 AM_REG_ADC_SL0CFG_CHSEL0_EXT1
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT2 AM_REG_ADC_SL0CFG_CHSEL0_EXT2
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT3 AM_REG_ADC_SL0CFG_CHSEL0_EXT3
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT4 AM_REG_ADC_SL0CFG_CHSEL0_EXT4
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT5 AM_REG_ADC_SL0CFG_CHSEL0_EXT5
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT6 AM_REG_ADC_SL0CFG_CHSEL0_EXT6
|
|
#define AM_HAL_ADC_SLOT_CHSEL_EXT7 AM_REG_ADC_SL0CFG_CHSEL0_EXT7
|
|
#define AM_HAL_ADC_SLOT_CHSEL_TEMP AM_REG_ADC_SL0CFG_CHSEL0_TEMP
|
|
#define AM_HAL_ADC_SLOT_CHSEL_VDD AM_REG_ADC_SL0CFG_CHSEL0_VDD
|
|
#define AM_HAL_ADC_SLOT_CHSEL_VSS AM_REG_ADC_SL0CFG_CHSEL0_VSS
|
|
#define AM_HAL_ADC_SLOT_CHSEL_VBATT AM_REG_ADC_SL0CFG_CHSEL0_VBATT
|
|
|
|
#define AM_HAL_ADC_SLOT_WINDOW_EN AM_REG_ADC_SL0CFG_WCEN0(1)
|
|
#define AM_HAL_ADC_SLOT_ENABLE AM_REG_ADC_SL0CFG_SLEN0(1)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Interrupt Status Bits
|
|
//! @brief Interrupt Status Bits for enable/disble use
|
|
//!
|
|
//! These macros may be used to enable an individual ADC interrupt cause.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_INTEN_WCINC AM_REG_ADC_INTEN_WCINC(1)
|
|
#define AM_HAL_ADC_INTEN_WCEXC AM_REG_ADC_INTEN_WCEXC(1)
|
|
#define AM_HAL_ADC_INTEN_FIFOOVR2 AM_REG_ADC_INTEN_FIFOOVR2(1)
|
|
#define AM_HAL_ADC_INTEN_FIFOOVR1 AM_REG_ADC_INTEN_FIFOOVR1(1)
|
|
#define AM_HAL_ADC_INTEN_SCNCMP AM_REG_ADC_INTEN_SCNCMP(1)
|
|
#define AM_HAL_ADC_INTEN_CNVCMP AM_REG_ADC_INTEN_CNVCMP(1)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @name Temperature Trim Value Locations
|
|
//! @brief Temperature calibration trim value locations in OTP.
|
|
//!
|
|
//! These macros are used to access the temperature trim values in OTP.
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
#define AM_HAL_ADC_CALIB_AMBIENT_ADDR (0x5002004C)
|
|
#define AM_HAL_ADC_CALIB_AMBIENT_OFFSET (0x0000004C)
|
|
#define AM_HAL_ADC_CALIB_TEMP_ADDR (0x50020050)
|
|
#define AM_HAL_ADC_CALIB_TEMP_OFFSET (0x00000050)
|
|
#define AM_HAL_ADC_CALIB_ADC_OFFSET_ADDR (0x50020054)
|
|
#define AM_HAL_ADC_CALIB_ADC_OFFSET_OFFSET (0x00000054)
|
|
//! @}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @brief Configuration structure for the ADC.
|
|
//
|
|
//*****************************************************************************
|
|
typedef struct
|
|
{
|
|
//
|
|
//! Select the ADC Clock source using one of the clock source macros.
|
|
//
|
|
uint32_t ui32Clock;
|
|
|
|
//
|
|
//! Select the ADC trigger source using a trigger source macro.
|
|
//
|
|
uint32_t ui32TriggerConfig;
|
|
|
|
//
|
|
//! Use a macro to select the ADC reference voltage.
|
|
//
|
|
uint32_t ui32Reference;
|
|
|
|
//
|
|
//! Use a macro to choose a maximum sample rate setting.
|
|
//
|
|
uint32_t ui32MaxSampleRate;
|
|
|
|
//
|
|
//! Use a macro to choose the power mode for the ADC's idle state.
|
|
//
|
|
uint32_t ui32PowerMode;
|
|
|
|
//
|
|
//! Use the Repeat macro to enable repeating samples using Timer3A
|
|
//
|
|
uint32_t ui32Repeat;
|
|
|
|
//
|
|
//! Power on the Temperature Sensor
|
|
//
|
|
uint32_t ui32POnTemp;
|
|
|
|
//
|
|
//! Set the ADC window limits using the window limit macro.
|
|
//
|
|
uint32_t ui32Window;
|
|
}
|
|
am_hal_adc_config_t;
|
|
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! @brief FIFO read value structure for the ADC.
|
|
//
|
|
//*****************************************************************************
|
|
typedef struct
|
|
{
|
|
//
|
|
//! Interrupt status bits at the time the FIFO was read
|
|
//
|
|
uint8_t ui8IntStatus;
|
|
|
|
//
|
|
//! 3 bit Slot # returning data for this FIFO read
|
|
//
|
|
uint8_t ui8Slot;
|
|
|
|
//
|
|
//! 16 bit (10.6) ADC data from this FIFO read
|
|
//
|
|
uint16_t ui16Data;
|
|
}
|
|
am_hal_adc_fifo_read_t;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// External function definitions
|
|
//
|
|
//*****************************************************************************
|
|
extern void am_hal_adc_config(am_hal_adc_config_t *psConfig);
|
|
extern void am_hal_adc_window_set(uint32_t ui32Upper, uint32_t ui32Lower);
|
|
extern void am_hal_adc_slot_config(uint32_t ui32SlotNumber,
|
|
uint32_t ui32SlotConfig);
|
|
|
|
extern uint32_t am_hal_adc_fifo_read(am_hal_adc_fifo_read_t *psFifoReadValue);
|
|
extern void am_hal_adc_trigger(void);
|
|
extern void am_hal_adc_enable(void);
|
|
extern void am_hal_adc_disable(void);
|
|
extern void am_hal_adc_batt_load_enable(void);
|
|
extern void am_hal_adc_batt_load_disable(void);
|
|
extern void am_hal_adc_int_enable(uint32_t ui32Interrupt);
|
|
extern uint32_t am_hal_adc_int_enable_get(void);
|
|
extern void am_hal_adc_int_disable(uint32_t ui32Interrupt);
|
|
extern void am_hal_adc_int_clear(uint32_t ui32Interrupt);
|
|
extern void am_hal_adc_int_set(uint32_t ui32Interrupt);
|
|
extern uint32_t am_hal_adc_int_status_get(bool bEnabledOnly);
|
|
extern float am_hal_adc_volts_to_celsius(float fVoltage);
|
|
extern bool am_hal_adc_temp_trims_get(float * pfTemp, float * pfVoltage, float * pfOffsetV);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // AM_HAL_ADC_H
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// End Doxygen group.
|
|
//! @}
|
|
//
|
|
//*****************************************************************************
|