/****************************************************************************************************************************************** 
* 文件名称:	SWM120_cmp.c
* 功能说明:	SWM120单片机的CMP比较器功能驱动库
* 技术支持:	http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期:	V1.0.0		2012年10月30日
* 升级记录:  
*
*
*******************************************************************************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION 
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE 
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT 
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
* -ECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
#include "SWM120.h"
#include "SWM120_cmp.h"


/****************************************************************************************************************************************** 
* 函数名称:	CMP_Init()
* 功能说明:	CMP模拟比较器初始化函数，包含迟滞设置、内部参考设置等
* 输    入: uint32_t CMPx	指定要设置的比较器，有效值包括CMP0、CMP1、CMP2
*			uint32_t isHYS	比较器是否有迟滞特性	0 无迟滞特性	1 有迟滞特性
*			uint32_t toADC	比较器的输出引脚是否同时作为ADC输入引脚给ADC提供输入模拟电平	0 比较器输出引脚不连接到ADC输入		
*																							1 比较器输出引脚连接到ADC输入 	
*			uint32_t refp	内部参考电平 0.3+0.15*refp
* 输    出: 无
* 注意事项: 1、比较器的输出其实无论如何无法通过引脚输出出来，只能通过将比较器负端引脚配置成低电平触发中断模式让比较器的比较结果触发中断来间
*			接知道比较结果
*			2、比较器正端电平既可以通过外部引脚电平提供，也可以通过内部基准电路提供；如果将比较器正端引脚配置成模拟外设功能，则比较器正端电
*			平由外部引脚提供；如果没有将比较器正端引脚配置成模拟外设功能，则比较器正端电平由内部基准电路提供（具体值由refp指定）
*			3、初始化CMP模块前，须先将模块用到的引脚配置为正确的模式，即模拟外设模式
******************************************************************************************************************************************/
void CMP_Init(uint32_t CMPx,uint32_t isHYS,uint32_t toADC,uint32_t refp)
{
	uint32_t mode;

	if(isHYS == 0)
	{
		if(toADC == 0)
		{
			mode = 5; 		//比较器关闭迟滞，并且比较器功能引脚不接到ADC
		}
		else
		{
	   		mode = 4;		//比较器关闭迟滞，并且比较器功能引脚连接到ADC
		}
	}
	else
	{
		if(toADC == 0)
		{
			mode = 3;		//比较器打开迟滞，并且比较器功能引脚不接到ADC
		}
		else
		{
	   		mode = 2;		//比较器打开迟滞，并且比较器功能引脚连接到ADC
		}
	}

	switch(CMPx)
	{
	case CMP0:
		PORT->OPA_CMP.OP0_MODE = mode;
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;
		}
		break;
	
	case CMP1:
		PORT->OPA_CMP.OP1_MODE = mode;
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;	
		}
		break;
	
	case CMP2:
		PORT->OPA_CMP.OP2_MODE = mode;
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;	
		}
		break;
	}		
}

/****************************************************************************************************************************************** 
* 函数名称:	CMP_HYSOpen()
* 功能说明:	比较器打开迟滞特性
* 输    入: uint32_t CMPx	指定要设置的比较器，有效值包括CMP0、CMP1、CMP2
* 输    出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void CMP_HYSOpen(uint32_t CMPx)
{
	uint32_t mode;

	if(PORT->OPA_CMP.OP0_MODE == 4)			//比较器关闭迟滞，并且比较器功能引脚连接到ADC
	{
		mode = 2;							//比较器打开迟滞，并且比较器功能引脚连接到ADC
	}
	else if(PORT->OPA_CMP.OP0_MODE == 5)	//比较器关闭迟滞，并且比较器功能引脚不接到ADC
	{
		mode = 3;							//比较器打开迟滞，并且比较器功能引脚不接到ADC
	}
	else
	{
		mode = 2;							//比较器打开迟滞，并且比较器功能引脚连接到ADC
	}

	switch(CMPx)
	{
	case CMP0:
		PORT->OPA_CMP.OP0_MODE = mode;
		break;
	
	case CMP1:
		PORT->OPA_CMP.OP1_MODE = mode;
		break;
	
	case CMP2:
		PORT->OPA_CMP.OP2_MODE = mode;
		break;
	}		
}

/****************************************************************************************************************************************** 
* 函数名称:	CMP_HYSClose()
* 功能说明:	比较器关闭迟滞特性
* 输    入: uint32_t CMPx	指定要设置的比较器，有效值包括CMP0、CMP1、CMP2
* 输    出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void CMP_HYSClose(uint32_t CMPx)
{
	uint32_t mode;

	if(PORT->OPA_CMP.OP0_MODE == 2)			//比较器打开迟滞，并且比较器功能引脚连接到ADC
	{
		mode = 4;							//比较器关闭迟滞，并且比较器功能引脚连接到ADC
	}
	else if(PORT->OPA_CMP.OP0_MODE == 3)	//比较器打开迟滞，并且比较器功能引脚不接到ADC
	{
		mode = 5;							//比较器关闭迟滞，并且比较器功能引脚不接到ADC
	}
	else
	{
		mode = 4;							//比较器关闭迟滞，并且比较器功能引脚连接到ADC
	}

	switch(CMPx)
	{
	case CMP0:
		PORT->OPA_CMP.OP0_MODE = mode;
		break;
	
	case CMP1:
		PORT->OPA_CMP.OP1_MODE = mode;
		break;
	
	case CMP2:
		PORT->OPA_CMP.OP2_MODE = mode;
		break;
	}		
}

/****************************************************************************************************************************************** 
* 函数名称:	CMP_SetRefP()
* 功能说明:	设置CMP比较器的内部参考电压
* 输    入: uint32_t CMPx	指定要设置的比较器，有效值包括CMP0、CMP1、CMP2
*			uint32_t refp	内部参考电平 0.3+0.15*refp
* 输    出: 无
* 注意事项: 比较器正端电平既可以通过外部引脚电平提供，也可以通过内部基准电路提供；如果将比较器正端引脚配置成模拟外设功能，则比较器正端电平
*			由外部引脚提供；如果没有将比较器正端引脚配置成模拟外设功能，则比较器正端电平由内部基准电路提供（具体值由refp指定）
******************************************************************************************************************************************/
void CMP_SetRefP(uint32_t CMPx,uint32_t refp)
{
	switch(CMPx)
	{
	case CMP0:
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;	
		}
		break;
	
	case CMP1:
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;	
		}
		break;
	
	case CMP2:
		if(refp <16)
		{
			PORT->OPA_CMP.CMP_REFP = refp;
		}
		break;
	}		
}

/****************************************************************************************************************************************** 
* 函数名称:	CMP_GetRefP()
* 功能说明:	获取CMP比较器的内部参考电压
* 输    入: uint32_t CMPx	指定要设置的比较器，有效值包括CMP0、CMP1、CMP2
* 输    出: CMP比较器的内部参考电压
* 注意事项: 返回的不是直接的电平值，而是需要将返回值带入公式“0.3+0.15*返回值”计算出电平值
******************************************************************************************************************************************/
uint32_t CMP_GetRefP(uint32_t CMPx)
{
	uint32_t refp;

	switch(CMPx)
	{
	case CMP0:
		refp = PORT->OPA_CMP.CMP_REFP;
		break;
	
	case CMP1:
		refp = PORT->OPA_CMP.CMP_REFP;
		break;
	
	case CMP2:
		refp = PORT->OPA_CMP.CMP_REFP;
		break;
	
	default:
		refp = PORT->OPA_CMP.CMP_REFP;
		break;
	}
	
	return refp;		
}
