

#include "r_typedefs.h"
#include "dr7f701441.dvf.h"
//#include "dr7f701403.dvf.h"

#include "ADC.h"

/*
1. The A/D Converter (ADCE) requires a minimum operating frequency of 8 MHz.
Make sure that C_ISO_ADCE is not below 8 MHz.
Refer to the Data Sheet for details.
8M~~40M
2. The CKSC_IADCED_CTL register must be set so that the relationship between
frequency of the C_ISO_PCLK and C_ISO_ADCE clocks is retained within the
range of "C_ISO_PCLK/C_ISO_ADCE = 1 to 2.4".
*/

static uint8_t ADC_Get_Physical_Channel(uint8_t u8ADCPhysicalChannelIndex)
{
	uint8_t u8ADCPhysicalChannel = 0XFFU; /* Error  don't use */
	if (u8ADCPhysicalChannelIndex <= 15U)
	{
		u8ADCPhysicalChannel = u8ADCPhysicalChannelIndex + 0x10;
	}
	else
	{
		u8ADCPhysicalChannel = 0XFFU;
	}
	return u8ADCPhysicalChannel;
}

static uint16_t ADC_Get_Channel_Result(uint8_t u8ADCVirtualChannel)
{
	uint32_t u32ADCRegisterAddress = 0xFFF20000U + 0x100U + 0X02U * u8ADCVirtualChannel;

	return (*(uint16_t *)u32ADCRegisterAddress);
}

static void ADC_Virtual_Channel_Config(uint8_t u8ADCVirtualChannel, uint8_t enADCPhysicalChannel)
{
	uint32_t u32ADCRegisterAddress = 0xFFF20000U + 0X04U * u8ADCVirtualChannel;

	(*(uint16_t *)u32ADCRegisterAddress) = enADCPhysicalChannel;
}

void ADC_Init(const uint8_t u8ChList[], uint8_t u8ChNum)
{

	/*uint32_t u32ADCRegisterValue = SYSMRSTC;*/
	uint8_t i = 0U;

	/*  release  reset*/
	/*
	u32ADCRegisterValue |= 0X10U;
	ADC_PROTECTED_WRITE(SYSPROTCMDMRST, SYSPROTSMRST, SYSMRSTC, u32ADCRegisterValue);
*/
	/* 	GPIO Config , port mode , direction input	*/

	/* Clock Config */
	if ((u8ChList != 0U) && (u8ChNum <= 15U))
	{
		/* Virtual Channel Config */
		for (i = 0U; i < u8ChNum; i++)
		{
			ADC_Virtual_Channel_Config(i, ADC_Get_Physical_Channel(u8ChList[i]));
		}
		/* 12-bit,right align*/
		ADCE0ADCRLL = 0x0U;
		/*sampling time 24 cycles*/
		ADCE0SMPT = 0x18U;
		/* Multicycle,interrupt disable,Hardware trigger disable,repeat once*/
		ADCE0SGCR1LL = 0x0U; /*0x10U  interrupt enable*/
		/*Start Virtual Channel*/
		ADCE0SGVCSP1LL = 0U;
		/* End Virtual Channel*/
		ADCE0SGVCEP1LL = u8ChNum - 1U;
		/* Number of scans is 1*/
		ADCE0MCYC = 0x0U;
	}
	else
	{
		i = 0U;
	}
}
/**/
void ADC_DeInit(void)
{
	while (ADCE0SGSTRL & 0x200U)
	{
		ADCE0HALT = 0x01U;
	}

	/*Start Virtual Channel*/
	ADCE0SGVCSP1LL = 0U;
	/* End Virtual Channel*/
	ADCE0SGVCEP1LL = 0U;
	/*Virtual Channel0 config  power channel ISOVDD*/
	ADC_Virtual_Channel_Config(0, 0X0FU);
}
void ADC_Start_Conversion(void)
{
	/*A/D conversion for SG1 is completed*/
	if ((ADCE0SGSTRL & 0x200U) == 0U)
	{
		ADCE0SEFC = 0X01U; /*clear SG1 Scan End Flag*/
		ADCE0SGST = 0x01U; /*start*/
	}
}
void ADC_Stop_Conversion(void)
{
	if (ADCE0SGSTRL & 0x200U)
	{
		ADCE0HALT = 0x01U;
	}
}
/**************************************************************************/ /**
  * \brief      Get ADC conversion status
  * \retval     0 - ADC is idle
  *             1 - ADC is busy
******************************************************************************/
uint8_t ADC_Get_Conversion_Status(void)
{
	uint8_t u8Status = 0U;

	if (ADCE0SGSTRL & 0x200U)
	{
		u8Status = 1U;
	}
	else /*A/D conversion for SG1 is completed*/
	{
		u8Status = 0U;
	}
	return u8Status;
}
void ADC_Get_Conversion_Result(uint16_t *pu16Data, uint8_t u8ChNum)
{
	uint8_t i;

	if ((pu16Data != 0U) && (u8ChNum > 0U) && (u8ChNum <= 16U))
	{
		if (ADC_Get_Conversion_Status() == 0U)
		{
			for (i = 0U; i < u8ChNum; i++)
			{
				pu16Data[i] = ADC_Get_Channel_Result(i);
			}
		}
	}
}
