app_adc.c 3.3 KB
#include "os_config.h"

#include "c_def.h"
#include "debug.h"
#include "oem.h"

#include "regmap.h"
#include "mem_reloc.h"
#include "hw_adc.h"
#include "interrupt.h"
#include "app_adc.h"



void app_adc_read(U16 * buf) __INTERNAL_RAM_TEXT;
void app_adc_isrHandler(void) __INTERNAL_RAM_TEXT;



#define AD_SEL_MASK					0x3C000

#define GET_SOURCE_SELECT()        (REG_MISC_ADC_CTL >> 14)

U16 ad_data[AD_MAX];


void app_adc_init(void)
{
	U8 i;

	hw_adc_init();

	for (i=0; i<AD_MAX; i++)
	{
	    ad_data[i] = ADC_VALUE_MAX;
	}

#ifdef ADC_INT_ENABLE
	XT_INTS_ON(LEVEL1_INT5_MASK);
#endif
}


//#pragma interrupt app_adc_IsrHandler;

void app_adc_isrHandler(void)
{
}


#if 1

void app_adc_read(U16 * buf)
{
#ifdef ADC_INT_ENABLE

	buf[0] = ad_data[0];
	buf[1] = ad_data[1];
	buf[2] = ad_data[2];
	buf[3] = ad_data[3];
#else

	//while( !(REG_MISC_ADC_CTL & 0x08) );

#if   (AD_USED_NUMMBER == 1)
	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | AD0_SEL_MASK);
	ad_data[0] = REG_MISC_ADC_DATA;

	buf[0] = ad_data[0];

	REG_MISC_ADC_CTL |= 0x04;

#elif (AD_USED_NUMMBER == 2)
	U32 next;
	U32 select = REG_MISC_ADC_CTL & AD_SEL_MASK;

	if (select == AD0_SEL_MASK)
	{
		ad_data[0] = REG_MISC_ADC_DATA;
		next = AD1_SEL_MASK;	
	}
	else if (select == AD1_SEL_MASK)
	{
		ad_data[1] = REG_MISC_ADC_DATA;
		next = AD0_SEL_MASK;
	}

	buf[0] = ad_data[0];
	buf[1] = ad_data[1];

	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | next);
	REG_MISC_ADC_CTL |= 0x04;

#elif (AD_USED_NUMMBER == 3)
	U32 next;
	U32 select = REG_MISC_ADC_CTL & AD_SEL_MASK;

	if (select == AD0_SEL_MASK)
	{
		ad_data[0] = REG_MISC_ADC_DATA;
		next = AD1_SEL_MASK;	
	}
	else if (select == AD1_SEL_MASK)
	{
		ad_data[1] = REG_MISC_ADC_DATA;
		next = AD2_SEL_MASK;
	}
	else if (select == AD2_SEL_MASK)
	{
		ad_data[2] = REG_MISC_ADC_DATA;
		next = AD0_SEL_MASK;
	}
	
	buf[0] = ad_data[0];
	buf[1] = ad_data[1];
	buf[2] = ad_data[2];


	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | next);
	REG_MISC_ADC_CTL |= 0x04;

#elif (AD_USED_NUMMBER == 4)
	U32 next;
	U32 select = REG_MISC_ADC_CTL & AD_SEL_MASK;

	if (select == AD0_SEL_MASK)
	{
		ad_data[0] = REG_MISC_ADC_DATA;
		next = AD1_SEL_MASK;	
	}
	else if (select == AD1_SEL_MASK)
	{
		ad_data[1] = REG_MISC_ADC_DATA;
		next = AD2_SEL_MASK;
	}
	else if (select == AD2_SEL_MASK)
	{
		ad_data[2] = REG_MISC_ADC_DATA;
		next = AD3_SEL_MASK;
	}
	else if (select == AD3_SEL_MASK)
	{
		ad_data[3] = REG_MISC_ADC_DATA;
		next = AD0_SEL_MASK;
	}

	buf[0] = ad_data[0];
	buf[1] = ad_data[1];
	buf[2] = ad_data[2];
	buf[3] = ad_data[3];

	REG_MISC_ADC_CTL  = ( REG_MISC_ADC_CTL & ~AD_SEL_MASK | next );
	REG_MISC_ADC_CTL |= 0x04;

#else
    #error AD_USED_NUMMBER Must Be defined!
#endif

#endif //ADC_INT_ENABLE
}

U16 app_adc_read_version(void)
{
#if 0
	U16 ad_value;

#if defined AD1_USED_FOR_VERSION_DETECT
	//use AD1
	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | AD1_SEL_MASK);
#elif defined AD2_USED_FOR_VERSION_DETECT
	//use AD2
	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | AD2_SEL_MASK);
#elif defined AD3_USED_FOR_VERSION_DETECT
	//use AD3
	REG_MISC_ADC_CTL = (REG_MISC_ADC_CTL & ~AD_SEL_MASK | AD3_SEL_MASK);
#else
#error "The version AD must be defined"
#endif


	REG_MISC_ADC_CTL |= 0x04;

	//wait till ADC convertion end
	delayms(1);
	//delayms(2);

	ad_value = REG_MISC_ADC_DATA;

	return ad_value;
#endif
}



#else
#endif