222 lines
5.1 KiB
C
222 lines
5.1 KiB
C
#include "gpadc.h"
|
||
#include "debug.h"
|
||
#include "gpio.h"
|
||
|
||
GPADC_CTRL_TYPE * GPADC = ((GPADC_CTRL_TYPE *) GPADC_CTRL_BASE);
|
||
|
||
uint8_t channel = 0;
|
||
|
||
//extern uint8_t adc_state;
|
||
static void (*adc_callback)(uint16_t adc);
|
||
/**********************************************************
|
||
GPIO2 ADCGP_CH[0]
|
||
GPIO3 ADCGP_CH[1]
|
||
GPIO4 ADCGP_CH[2]
|
||
GPIO5 ADCGP_CH[3]
|
||
GPIO28 ADCGP_CH[4]
|
||
GPIO29 ADCGP_CH[5]
|
||
GPIO30 ADCGP_CH[6]
|
||
GPIO31 ADCGP_CH[7]
|
||
VBAT ADCGP_CH[8]
|
||
VDVDD_1.25 ADCGP_CH[9]
|
||
VDCDC_1.1 ADCGP_CH[10]
|
||
***********************************************************/
|
||
void GPADC_Init(ADCGP_CHX ch,GPADC_MODE mode)
|
||
{
|
||
//-----------------pin config-------------------
|
||
switch(ch)
|
||
{
|
||
case ADCGP_CH0:
|
||
//ADCGP_CH[0] Pin Init
|
||
PIN_CONFIG->PIN_2_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_2_DIR = 1;
|
||
GPI_CTRL->GPI_2_InE = 0;
|
||
PIN_CONFIG->PAD_2_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_2_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH1:
|
||
//ADCGP_CH[1] Pin Init
|
||
PIN_CONFIG->PIN_3_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_3_DIR = 1;
|
||
GPI_CTRL->GPI_3_InE = 0;
|
||
PIN_CONFIG->PAD_3_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_3_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH2:
|
||
//ADCGP_CH[2] Pin Init
|
||
PIN_CONFIG->PIN_4_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_4_DIR = 1;
|
||
GPI_CTRL->GPI_4_InE = 0;
|
||
PIN_CONFIG->PAD_4_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_4_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH3:
|
||
//ADCGP_CH[3] Pin Init
|
||
PIN_CONFIG->PIN_5_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_5_DIR = 1;
|
||
GPI_CTRL->GPI_5_InE = 0;
|
||
PIN_CONFIG->PAD_5_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_5_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH4:
|
||
//ADCGP_CH[4] Pin Init
|
||
PIN_CONFIG->PIN_28_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_28_DIR = 1;
|
||
#ifdef _SYD8811_BAND_
|
||
GPI_CTRL->GPI_28_InE = 0;
|
||
#else
|
||
GPI_CTRL->GPI_16_InE = 0;
|
||
#endif
|
||
PIN_CONFIG->PAD_36_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_28_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH5:
|
||
//ADCGP_CH[5] Pin Init
|
||
PIN_CONFIG->PIN_29_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_29_DIR = 1;
|
||
GPI_CTRL->GPI_29_InE = 0;
|
||
PIN_CONFIG->PAD_37_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_29_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH6:
|
||
//ADCGP_CH[6] Pin Init
|
||
PIN_CONFIG->PIN_30_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_30_DIR = 1;
|
||
#ifdef _SYD8811_BAND_
|
||
GPI_CTRL->GPI_30_InE = 0;
|
||
#else
|
||
GPI_CTRL->GPI_20_InE = 0;
|
||
#endif
|
||
PIN_CONFIG->PAD_38_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_30_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
case ADCGP_CH7:
|
||
//ADCGP_CH[7] Pin Init
|
||
PIN_CONFIG->PIN_31_SEL = PIN_SEL_GPIO;
|
||
GPIO_CTRL->GPIO_31_DIR = 1;
|
||
GPI_CTRL->GPI_31_InE = 0;
|
||
PIN_CONFIG->PAD_39_INPUT_PULL_UP = 0; //上拉禁止
|
||
|
||
PIN_CONFIG->PIN_31_SEL = PIN_SEL_ANALOG;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
GPADC->CLKRATE = 31; // 64M/((31+1)*2)= 1M
|
||
GPADC->DA_GPADC_EN = 1;
|
||
|
||
GPADC->CHANNEL_SET_NUM = 1;
|
||
GPADC->SCAN_COUNT = 1; //只能设置为1
|
||
GPADC_channel_sel(channel);
|
||
GPADC->Continue_Scan = 0;
|
||
|
||
//set time delay
|
||
GPADC->START_SETTLE = 24;
|
||
//GPADC->CHANNEL_SETTLE = 1; //7.52us
|
||
//GPADC->CHANNEL_SETTLE = 2; //11.29us
|
||
GPADC->CHANNEL_SETTLE = 4; //18.81us
|
||
//GPADC->CHANNEL_SETTLE = 63; //240.71us
|
||
|
||
if(mode == AVE_MODE)
|
||
{
|
||
//一次scan采集data_length+1次数据,然后再取均值
|
||
GPADC->AVERAGE = 7;
|
||
GPADC->DATA_LENGTH = 7;
|
||
}
|
||
else
|
||
{
|
||
GPADC->AVERAGE = 1;
|
||
GPADC->DATA_LENGTH = 0;
|
||
}
|
||
|
||
GPADC->EVENTS = 0;
|
||
GPADC->INTENSET = 1; //使能中断,标志位才能置位
|
||
NVIC_EnableIRQ(GPADC_IRQn);
|
||
}
|
||
|
||
void GPADC_start(void (*p_callback)(uint16_t adc))
|
||
{
|
||
if(p_callback) adc_callback=p_callback;
|
||
GPADC->DA_GPADC_EN = 1;
|
||
GPADC->TASK_START = 1;
|
||
}
|
||
|
||
/*************************************************************
|
||
Note:
|
||
STOP will reset Continue_Scan register
|
||
**************************************************************/
|
||
void GPADC_stop(void)
|
||
{
|
||
if(GPADC->gpadc_fsm_cs)
|
||
{
|
||
GPADC->TASK_STOP = 1;
|
||
//
|
||
GPADC->INTENCLR = 1; //disable INT
|
||
GPADC->EVENTS = 0; //clear INT flag
|
||
while(GPADC->gpadc_fsm_cs);
|
||
|
||
while(GPADC->EVENTS == 0);
|
||
GPADC->EVENTS = 0; //clr INT flag
|
||
|
||
GPADC->INTENSET = 1; //Enable INT
|
||
}
|
||
}
|
||
|
||
uint16_t GPADC_get_value(void)
|
||
{
|
||
return GPADC->adc_data_hclk;
|
||
}
|
||
|
||
/****************************************************************************
|
||
function: select 1 GPADC channel when GPADC is stopped at oneshot/ave mode
|
||
para:
|
||
ch - 0 ~ 10 select channel 0 ~ channel 10
|
||
note: select GPADC channel when GPADC is stopped
|
||
*********************************************************************************/
|
||
void GPADC_channel_sel(uint8_t ch)
|
||
{
|
||
if(ch<=10)
|
||
{
|
||
GPADC->CHANNEL_SET0 = ch;
|
||
GPADC->CHANNEL_SEL = ch;
|
||
}
|
||
}
|
||
|
||
void GPADC_IRQHandler(void)
|
||
{
|
||
if(GPADC->EVENTS) //使能ADC中断,标志位才能置位
|
||
{
|
||
uint16_t adc = GPADC_get_value();
|
||
|
||
GPADC->EVENTS = 0;
|
||
GPADC->DA_GPADC_EN = 0;
|
||
if(adc_callback)
|
||
{
|
||
adc_callback(adc);
|
||
}
|
||
|
||
// dbg_printf("vol:%4.3f\r\n ",adc);
|
||
// adc=adc&0xfffe;
|
||
//
|
||
// if(channel==8) //VBAT通道
|
||
// {
|
||
// vat=(float)adc*3.6/483;
|
||
// }
|
||
// else //GPIO通道
|
||
// {
|
||
// vat=(float)adc*3.6/1024;
|
||
// }
|
||
// dbg_printf("ch:%02d adc : %04x vat: %4.3f\r\n",channel,adc,vat);
|
||
// adc_state=1;
|
||
}
|
||
}
|
||
|