bleSDK_expansion_board/drivers/api/sadc.h

294 lines
11 KiB
C
Raw Permalink Normal View History

/**
****************************************************************************************
*
* @file sadc.h
*
* @brief Header file - SADC(ADC) Driver
*
****************************************************************************************
*/
#ifndef _SADC_H_
#define _SADC_H_
#include <stdint.h>
/*
* DEFINES
****************************************************************************************
*/
enum sadc_chnl_set
{
// 0~4: Special Power Pads
SADC_CH_VDD33 = 0, // VDD33/2
SADC_CH_VBK = 1, // PAD_VBK
SADC_CH_VDD12 = 2, // PAD_VDD12
SADC_CH_PGAOUT = 3,
SADC_CH_MICIN = 4,
// 5~14: ADCIN0 ~ ADCIN9(Single ended channel)
SADC_CH_AIN0 = 5, // PA00 or PA11
SADC_CH_AIN1 = 6, // PA01 or PA12
SADC_CH_AIN2 = 7, // PA02 or PA13
SADC_CH_AIN3 = 8, // PA04
SADC_CH_AIN4 = 9, // PA05 or PA14
SADC_CH_AIN5 = 10, // PA06 or PA15
SADC_CH_AIN6 = 11, // PA07 or PA16
SADC_CH_AIN7 = 12, // PA08
SADC_CH_AIN8 = 13, // PA09
SADC_CH_AIN9 = 14, // PA10
// 15: RF RSSI sample
SADC_CH_RFRSV = 15, // RF.RF_RSV[3:0]
};
enum sadc_rf_rsv
{
SADC_RF_TEMP = 0x1, // 4'b0001
SADC_RF_BANDGAP = 0x2, // 4'b0010
SADC_RF_RSSI = 0x4, // 4'b0100
SADC_RF_VDDIF = 0x8, // 4'b1000
};
enum sadc_ana_ctrl
{
// bit0 - SADC Enable
SADC_EN_POS = 0,
SADC_EN_BIT = (1 << SADC_EN_POS),
// bit[2:1] - Vref Trim
SADC_VREF_TRIM_LSB = 1,
SADC_VREF_TRIM_1V2 = (0 << SADC_VREF_TRIM_LSB),
SADC_VREF_TRIM_1V8 = (1 << SADC_VREF_TRIM_LSB),
SADC_VREF_TRIM_2V4 = (2 << SADC_VREF_TRIM_LSB),
SADC_VREF_TRIM_3V0 = (3 << SADC_VREF_TRIM_LSB),
// bit[5:3] - ibsel cmp 15uA~105uA, step in 15uA
SADC_IBSEL_CMP_LSB = 3,
SADC_IBSEL_CMP_015UA = (0 << SADC_IBSEL_CMP_LSB),
SADC_IBSEL_CMP_105UA = (7 << SADC_IBSEL_CMP_LSB),
// bit[8:6] - ibsel vcm 15uA~105uA, step in 15uA
SADC_IBSEL_VCM_LSB = 6,
SADC_IBSEL_VCM_015UA = (0 << SADC_IBSEL_VCM_LSB),
SADC_IBSEL_VCM_105UA = (7 << SADC_IBSEL_VCM_LSB),
// bit[11:9] - ibsel Vref 15uA~105uA, step in 15uA
SADC_IBSEL_VREF_LSB = 9,
SADC_IBSEL_VREF_015UA = (0 << SADC_IBSEL_VREF_LSB),
SADC_IBSEL_VREF_105UA = (7 << SADC_IBSEL_VREF_LSB),
// bit[14:12] - ibsel buf 15uA~105uA, step in 15uA
SADC_IBSEL_BUF_LSB = 12,
SADC_IBSEL_BUF_015UA = (0 << SADC_IBSEL_BUF_LSB),
SADC_IBSEL_BUF_105UA = (7 << SADC_IBSEL_BUF_LSB),
// bit15 - SADC Vref gen from VBG or VDDA
SADC_VREF_POS = 15,
SADC_VREF_VDD = (0 << SADC_VREF_POS),
SADC_VREF_VBG = (1 << SADC_VREF_POS),
// bit[17:16] - SADC precision or range
SADC_CALCAP_LSB = 16,
SADC_CALCAP_PRECISION = (1 << SADC_CALCAP_LSB),
SADC_CALCAP_RANGE = (3 << SADC_CALCAP_LSB),
// bit[19:18] - SADC single ended tie to GND or VREF
SADC_CALOS_POS = 18,
SADC_CALOS_GND = (0 << SADC_CALOS_POS),
SADC_CALOS_VREF = (1 << SADC_CALOS_POS),
// bit20 - SADC bypass input buffer
SADC_INBUF_BYPSS_POS = 20,
SADC_INBUF_BYPSS_BIT = (1 << SADC_INBUF_BYPSS_POS),
};
#define SADC_IBSEL_CMP(sel) ((sel) << SADC_IBSEL_CMP_LSB)
#define SADC_IBSEL_VCM(sel) ((sel) << SADC_IBSEL_VCM_LSB)
#define SADC_IBSEL_VREF(sel) ((sel) << SADC_IBSEL_VREF_LSB)
#define SADC_IBSEL_BUF(sel) ((sel) << SADC_IBSEL_BUF_LSB)
#define SADC_ANA_DFLT (SADC_VREF_VBG | SADC_CALCAP_PRECISION | SADC_IBSEL_BUF(3) | SADC_IBSEL_VREF(3) \
| SADC_IBSEL_VCM(3) | SADC_IBSEL_CMP(3) | SADC_VREF_TRIM_2V4 | SADC_EN_BIT)
#define SADC_ANA_VREF_1V2 (SADC_VREF_VBG | SADC_CALCAP_PRECISION | SADC_IBSEL_BUF(3) | SADC_IBSEL_VREF(3) \
| SADC_IBSEL_VCM(3) | SADC_IBSEL_CMP(3) | SADC_VREF_TRIM_1V2 | SADC_EN_BIT)
#define SADC_ANA_VREF_2V4 (SADC_VREF_VBG | SADC_CALCAP_PRECISION | SADC_IBSEL_BUF(3) | SADC_IBSEL_VREF(3) \
| SADC_IBSEL_VCM(3) | SADC_IBSEL_CMP(3) | SADC_VREF_TRIM_2V4 | SADC_EN_BIT)
#define SADC_ANA_VREF_VDD (SADC_VREF_VDD | SADC_CALCAP_PRECISION | SADC_IBSEL_BUF(3) | SADC_IBSEL_VREF(3) \
| SADC_IBSEL_VCM(3) | SADC_IBSEL_CMP(3) | SADC_EN_BIT)
enum sadc_mic_sel
{
// bit0 - Analog microphone connect mode
SADC_MIC_MODE_POS = 0,
SADC_MIC_MODE_CAP = (0 << SADC_MIC_MODE_POS),
SADC_MIC_MODE_NO_CAP = (1 << SADC_MIC_MODE_POS),
// bit1 - Micbias powerdown signal
SADC_MIC_PWD_POS = 1,
SADC_MIC_PWD_BIT = (1 << SADC_MIC_PWD_POS),
// bit[8:2] - Micbias output voltage trimming signal
SADC_MIC_TRIM_LSB = 2,
SADC_MIC_TRIM_MSK = (0x7F << SADC_MIC_TRIM_LSB),
// bit9 - Micbias Internal voltage reference(0:750mV, 1:1.5V)
SADC_MIC_VREF_POS = 9,
SADC_MIC_VREF_750MV = (0 << SADC_MIC_VREF_POS),
SADC_MIC_VREF_1V5 = (1 << SADC_MIC_VREF_POS),
// bit[11:10] - pga voltage trimming signal
SADC_PGA_BIAS_LSB = 10,
SADC_PGA_BIAS_MSK = (0x03 << SADC_PGA_BIAS_LSB),
// bit12 - pga enable signal
SADC_PGA_EN_POS = 12,
SADC_PGA_EN_BIT = (1 << SADC_PGA_EN_POS),
// bit[17:13] - pga voltage trimming signal
SADC_PGA_VOL_LSB = 13,
SADC_PGA_VOL_MSK = (0x1F << SADC_PGA_VOL_LSB),
// bit18 - pga Internal voltage reference(0:750mV, 1:1.5V)
SADC_PGA_VREF_POS = 18,
SADC_PGA_VREF_750MV = (0 << SADC_PGA_VREF_POS),
SADC_PGA_VREF_1V5 = (1 << SADC_PGA_VREF_POS),
};
#define SADC_MIC_TRIM(val) ((val) << SADC_MIC_TRIM_LSB)
#define SADC_PGA_BIAS(val) ((val) << SADC_PGA_BIAS_LSB)
#define SADC_PGA_VOL(val) ((val) << SADC_PGA_VOL_LSB)
// .MIC_PD=0, .MIC_VREF_SEL=1, .PGA_BIAS_SEL=1, .PGA_EN=1
#define SADC_MIC_DFLT (SADC_PGA_VOL(0x1B) | SADC_PGA_BIAS(1) | SADC_MIC_TRIM(0x40) \
| SADC_PGA_EN_BIT | SADC_PGA_VREF_1V5 | SADC_MIC_VREF_1V5) // 0x36502->0x77700
enum sadc_ctrl_bfs
{
// bit0 - start of conversion
SADC_CR_SOC_POS = 0,
SADC_CR_SOC_BIT = (1 << SADC_CR_SOC_POS),
// bit1 - calibration mode
SADC_CR_CALIB_POS = 1,
SADC_CR_CALIB_BIT = (1 << SADC_CR_CALIB_POS),
// bit2 - conversion mode(0-single, 1-continue)
SADC_CR_CONV_MODE_POS = 2,
SADC_CR_CONV_MODE_BIT = (1 << SADC_CR_CONV_MODE_POS),
SADC_CR_CONV_SINGLE = (0 << SADC_CR_CONV_MODE_POS),
SADC_CR_CONV_CONTINUE = (1 << SADC_CR_CONV_MODE_POS),
// bit3 - DMA enable
SADC_CR_DMAEN_POS = 3,
SADC_CR_DMAEN_BIT = (1 << SADC_CR_DMAEN_POS),
// bit4 - conversion at clk phase(0-negedge, 1-posedge)
SADC_CR_CLKPH_POS = 4,
SADC_CR_CLKPH_NEGEDGE = (0 << SADC_CR_CLKPH_POS),
SADC_CR_CLKPH_POSEDGE = (1 << SADC_CR_CLKPH_POS),
// bit[6:5] - Sample mode
SADC_CR_SAMP_MODE_LSB = 5,
SADC_CR_SAMP_MODE_MSK = (0x03 << SADC_CR_SAMP_MODE_LSB),
SADC_CR_SAMP_SOFT = (0 << SADC_CR_SAMP_MODE_LSB), // software mode(normal mode)
SADC_CR_SAMP_RSSI = (1 << SADC_CR_SAMP_MODE_LSB), // RSSI sample mode( ADC controlled by BB)
SADC_CR_SAMP_PCM = (2 << SADC_CR_SAMP_MODE_LSB), // sample vioce data, must enable DMA
SADC_CR_SAMP_ADTMR = (3 << SADC_CR_SAMP_MODE_LSB), // SOC is from ADTIM adctrg
// bit7 - write as 1 to stop decimation filter
SADC_CR_PCMEND_POS = 7,
SADC_CR_PCMEND_BIT = (1 << SADC_CR_PCMEND_POS),
// bit[13:8] - delay time from rssi_req to SADC sample RSSI
SADC_CR_RSSI_DLY_LSB = 8,
SADC_CR_RSSI_DLY_MSK = (0x3F << SADC_CR_RSSI_DLY_LSB),
// bit14 - DBG enable, configed as SADC analog IP
SADC_CR_DBGEN_POS = 14,
SADC_CR_DBGEN_BIT = (1 << SADC_CR_DBGEN_POS),
// bit[19:16] - decimation filter high pass filter coef
SADC_CR_HPF_COEF_LSB = 16,
SADC_CR_HPF_COEF_MSK = (0x0F << SADC_CR_HPF_COEF_LSB),
// bit[29:20] - adc function clock = hclk / (sadc_aux_clk_div + 1)
SADC_CR_CLK_DIV_LSB = 20,
SADC_CR_CLK_DIV_MSK = (0x3FF << SADC_CR_CLK_DIV_LSB),
};
#define SADC_CR_HPF(coef) ((coef) << SADC_CR_HPF_COEF_LSB)
#define SADC_CR_CLK(div) ((div) << SADC_CR_CLK_DIV_LSB)
#define SADC_CR_DFLT (SADC_CR_CLK(3) | SADC_CR_HPF(11) | SADC_CR_CLKPH_POSEDGE \
| SADC_CR_SAMP_SOFT | SADC_CR_CONV_SINGLE) // 0x3B0010
/*
* FUNCTION DECLARATION
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Init SADC Module.
*
* @param[in] ana_ctrl Bits field of value @see enum sadc_ana_ctrl.
****************************************************************************************
*/
void sadc_init(uint32_t ana_ctrl);
/**
****************************************************************************************
* @brief Config SADC Module.
*
* @param[in] ctrl Bits field of value @see enum sadc_ctrl_bfs.
****************************************************************************************
*/
void sadc_conf(uint32_t ctrl);
/**
****************************************************************************************
* @brief SADC read data.
*
* @param[in] chset Bits field of value @see enum sadc_chnl_set.
* @param[in] times Number of times sadc read.
*
* @return Multiple(times) averages.
****************************************************************************************
*/
uint16_t sadc_read(uint8_t chset, uint16_t times);
/**
****************************************************************************************
* @brief Config SADC Support DMA.
*
* @param[in] sw_auto SADC auto chnl.
* @param[in] ch_ctrl Bits field of value @see enum sadc_chnl_set.
****************************************************************************************
*/
void sadc_dma(uint8_t sw_auto, uint32_t ch_ctrl);
/**
****************************************************************************************
* @brief Config SADC Support PCM.
*
* @param[in] mic_sel Bits field of value @see enum sadc_mic_sel.
****************************************************************************************
*/
void sadc_pcm(uint32_t mic_sel);
/**
****************************************************************************************
* @brief Config SADC Support ATMR.
*
* @param[in] sw_auto SADC auto chnl.
* @param[in] ch_ctrl Bits field of value @see enum sadc_chnl_set.
****************************************************************************************
*/
void sadc_atmr(uint8_t sw_auto, uint32_t ch_ctrl);
/**
****************************************************************************************
* @brief Random Number Generated by SADC.
*
* @return Random Number.
****************************************************************************************
*/
uint32_t sadc_rand_num(void);
#endif // _SADC_H_