//  Copyright (C) 2016, mituhiromatuura all right reserved.

#include "iodefine.h"

#include "adc.h"

void init_adc(int ch, int pin)
{
	//GPIO->ADE_f.AN16	= 1;		//アナログ入力として使用
	*(v32_t *)GPIO_ADE |= (1<<pin);

	//ADC0->ADCEN_f.ENBL	= 1;		//動作許可
	*(v16_t *)ADC_ADCEN(ch) |= (1<<0);

	//while (!(ADC0->ADCEN_f.READY));
	while(!(*(v16_t *)ADC_ADCEN(ch) & (1<<1)));

	//ADC0->SFNS			= 0;		//FIFO段数
	//ADC0->SCIS2_f.AN16	= 1;		//スキャン変換入力選択
	*(v16_t *)((16 > pin) ? ADC_SCIS01(ch) : ADC_SCIS23(ch)) |= (1 << (pin % 16));

	//ADC0->ADSS2_f.TS16	= 0;		//サンプリング時間はADST0を使用
	*(v16_t *)((16 > pin) ? ADC_ADSS01(ch) : ADC_ADSS23(ch)) &= ~(1 << (pin % 16));
	//ADC0->ADST0			= 0xff;		//サンプリング時間 1/HCLK * 2 * ((31 + 1) * 256 + 1)
	*(v8_t *)ADC_ADST0(ch) = (7<<5)|(31<<0);

	//ADC0->SCCR_f.SSTR	= 1;		//変換スタート
	*(v8_t *)ADC_SCCR(ch) |= (1<<0);

	return;
}

int adc_get12bit(int ch)
{
	int val = ((*(v32_t *)ADC_SCFD(ch)) >> 20) & 0x0fff;

	//ADC0->SCCR_f.SSTR	= 1;		//変換スタート
	*(v8_t *)ADC_SCCR(ch) |= (1<<0);

	return val;
}
