📄 tunerctr.c
字号:
/**************************************************************************************/
/*********************** 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 + -