⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tunerctr.c

📁 关于收音功能代码,并且显示在OSD和VFD上
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************/
/***********************                    BBK CONFIDENTIAL                   ************************/
/***********************                                                                    ************************/
/***********************         Description : Digital Audio Process          ************************/
/***********************                                                                    ************************/
/*********************** Company: BBK AV ELECTRONICS CORP.,LTD ************************/
/***********************                                                                    ************************/
/***********************              Programmer : Terry Lee                  ******** ****************/
/**************************************************************************************/

#define TUNERCTR_PAR
#pragma NOAREGS
#include "general.h"
#include  "..\..\procdef.h"
#include "..\..\typedef.h"

#ifdef BBK_RD2_NEW_TUNER
/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vSetDTSCE(BOOL fgHigh) large
{
	if(fgHigh)
	{
		HI_DTSCE();
	}
	else
	{
		LO_DTSCE();
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vSetDTSDI(BOOL fgHigh) large
{
	if(fgHigh)
	{
		HI_DTSDI();
	}
	else
	{
		LO_DTSDI();
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vSetDTSCL(BOOL fgHigh) large
{
	if(fgHigh)
	{
		HI_DTSCL();
	}
	else
	{
		LO_DTSCL();
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static BOOL ReadDTSDO(void) large
{
	return(ReadDTSDOIo());
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vTunerPower(BOOL fgPower) large
{
	if(fgPower)
	{
		HI_TUNERPWR();
	}	
	else
	{
		LO_TUNERPWR();
	}	
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vWait(void) large
{
	BYTE i;
	
	for(i=0; i<WAIT_TIME; i++)
	{
		/*do nothing!*/
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vLatch_data(void) large
{
	vSetDTSCL(0);
	vWait();
	vSetDTSCL(1);
	vWait();	
}


/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static void vWriteTuner(BYTE InputMode, WORD Data0, BYTE Data1) large
{
	BYTE  i;

	if(WRITE_MODE0 == InputMode)
	{
		if(TUNER_BAND_FM == _eTunerBand)
		{
			Data0 = (Data0 + FM_FREQ_IF) / FM_DIVISOR;
		}
		else
		{
			if(AM_STEP_9K == _eAmStep)
			{
				Data0=(Data0 + AM_FREQ_IF) / AM_9K_DIVISOR;
			}
			else
			{
				Data0=(Data0 + AM_FREQ_IF) / AM_10K_DIVISOR;
			}
			Data0<<=4;
		}
	}

	vSetDTSCE(0);
	vSetDTSCL(1);

	for(i=0; i<8; i++)
	{
		vSetDTSDI(InputMode & 0x01);
		InputMode>>=1;
		vLatch_data();
	}

	vSetDTSCE(1);
	vWait();

	for(i=0;i<16;i++)
	{
		vSetDTSDI(Data0 & 0x01);
		Data0>>=1;
		vLatch_data();
	}

	for(i=0;i<8;i++)
	{
		vSetDTSDI(Data1 & 0x01);
		Data1>>=1;
		vLatch_data();
	}

	vSetDTSCE(0);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
static DWRD dwReadIFCounter(void) large
{
	DWRD dwDataBuf;
	BYTE bReadMode;
	BYTE  i;

	dwDataBuf = 0;

	vSetDTSCE(0);
	vSetDTSCL(1);

	bReadMode = READ_MODE;

	for(i=0;i<8;i++)
	{
		vSetDTSDI(bReadMode & 0x01);
		bReadMode >>= 1;
		vLatch_data();
	}

	vSetDTSCE(1);
	vWait();

	for(i=0;i<24;i++)
	{
		vLatch_data();
		dwDataBuf = (dwDataBuf << 1) | ReadDTSDO();
	}

	vSetDTSCE(0);

	return(dwDataBuf);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vStartIFCounter(WORD wFreq, BOOL fgMute) large
{
	if(fgGetRealFreq(&wFreq) == FALSE)
	{
		return;
	}

	/*TEST0,TEST1,TEST2 must be set to 0.*/
	/*IFS should normally be set to 1, or degrade the input sensitivity.*/
	/*set the the state of the charge pump to high,as normal operation(DLC).*/
	/*UL1 UL0 are set to 10, it means phase error detection width is +/-6.67u.*/
	/*DZ1 DZ0 are set to 10, it means dead band mode(width) is DZC.*/
	/*DOC2 DOC1 DOC0 are set to 110, it means DO pin becomes low when stereo detected.*/

	if(TUNER_BAND_FM == _eTunerBand)
	{
		vWriteTuner(WRITE_MODE0, wFreq, FM_RESET_IF);
		vWriteTuner(WRITE_MODE0, wFreq, FM_START_IF);

		/*set the measurement time for the general-purpose counter to 32ms.*/
		/*set the SD sensitivity to 51dBuV(SDC0,SDC1).*/
		/*set BO0 output port to OPEN state, and set BO1 output port to LOW state.*/
		/*set BDSW to '1', it means switch to FM band.*/
		if(fgMute)
		{
			/*set IFSW to '1', it means mute.*/
			if(TUNER_SIGNAL_STEREO == _eSignalType)
			{
				/*set STSW to '1', it means stereo output mode.*/
				vWriteTuner(WRITE_MODE1, FM_IFREQON_ST, IF_MEASURE_TIME_FM);
			}
			else
			{
				/*set STSW to '0', it means mono output mode.*/
				vWriteTuner(WRITE_MODE1, FM_IFREQON_MO, IF_MEASURE_TIME_FM);
			}
		}
		else
		{
			/*set IFSW to '0', it means receiveing mode,not mute.*/
			if(TUNER_SIGNAL_STEREO == _eSignalType)
			{
				/*set STSW to '1', it means stereo output mode.*/
				vWriteTuner(WRITE_MODE1, FM_IFREQOFF_ST, IF_MEASURE_TIME_FM);
			}
			else
			{
				/*set STSW to '0', it means mono output mode.*/
				vWriteTuner(WRITE_MODE1, FM_IFREQOFF_MO, IF_MEASURE_TIME_FM);
			}
		}

		#ifdef TUNER_VFD_SHOW_ST
		if(TUNER_SIGNAL_STEREO == _eSignalType)
		{
		_bStCheckTimer = 0;
		}
		#endif

	}
	else if(TUNER_BAND_AM == _eTunerBand)
	{
		if(AM_STEP_9K == _eAmStep)
		{
			vWriteTuner(WRITE_MODE0, wFreq, AM_9K_RESET_IF);
			vWriteTuner(WRITE_MODE0, wFreq, AM_9K_START_IF);
		}
		else
		{
			vWriteTuner(WRITE_MODE0, wFreq, AM_10K_RESET_IF);
			vWriteTuner(WRITE_MODE0, wFreq, AM_10K_START_IF);
		}

		/*set the measurement time for the general-purpose counter to 8ms.*/
		/*set the SD sensitivity to 56dBuV(SDC0,SDC1).*/
		/*set BO0 output port to OPEN state, and set BO1 output port to OPEN state.*/
		/*set BDSW to '0', it means switch to AM band.*/
		if(fgMute)
		{
			/*set IFSW to '1', it means mute.*/
			vWriteTuner(WRITE_MODE1, AM_IFREQON, IF_MEASURE_TIME_AM);  
		}
		else
		{
			/*set IFSW to '0', it means receiveing mode,not mute.*/
			vWriteTuner(WRITE_MODE1, AM_IFREQOFF, IF_MEASURE_TIME_AM);
		}
	}
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
BOOL fgGetIFCounterStatus(BYTE *pbSignal) large
{
	DWRD dwIFData;

	*pbSignal = TUNER_SIGNAL_MONO;

	dwIFData = dwReadIFCounter();

	if((dwIFData | 0xffbfffff) != 0xffbfffff)
	{
		return(FALSE);
	}

	if(TUNER_BAND_FM == _eTunerBand)
	{
		if((dwIFData | 0xff7fffff) == 0xff7fffff)
		{
			*pbSignal = TUNER_SIGNAL_STEREO;
		}

		dwIFData = (dwIFData & 0xfffff) / 32;

		/*It is allowed between a range from 10690 to 10711.The FM's IF IS 10700*/
		if((dwIFData > 10695) && (dwIFData < 10703))
		{
			return(TRUE);
		}
	}
	else if(TUNER_BAND_AM == _eTunerBand)
	{
		dwIFData = (dwIFData & 0xfffff) / 8;

		/*It is allowed between a range from 448 to 452.The AM's IF IS 450*/
		if((dwIFData > 448) && (dwIFData < 452))
		{
			return(TRUE);
		}
	}

	return(FALSE);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -