📄 fmtuner_drvfunction.c
字号:
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
U16 fmTuner_GetMinimumFrequency(void)
{
return cFM_TUNER_FREQUENCY_START;
}
//-----------------------------------------------------------------------------
// FUNCTION: fmTuner_GetStepSize
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
U16 fmTuner_GetStepSize(void)
{
return cFM_TUNER_FREQUENCY_STEP_SIZE_100KHz;
}
//-----------------------------------------------------------------------------
// FUNCTION: fmTuner_ManualTuneUpDown
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_ManualTuneUpDown(fmTuner_TuningDirection_e keDirection)
{
if(keDirection==fmTuner_TuningDirection_Up)
{
gfmTuner_u16TunerFrequency=(U16)(gfmTuner_u16TunerFrequency+fmTuner_GetStepSize());
if(fmTuner_GetMaxFrequency()<gfmTuner_u16TunerFrequency)
{
gfmTuner_u16TunerFrequency=fmTuner_GetMinimumFrequency();
}
}
else if(keDirection==fmTuner_TuningDirection_Down)
{
gfmTuner_u16TunerFrequency=(U16)(gfmTuner_u16TunerFrequency-fmTuner_GetStepSize());
if(fmTuner_GetMinimumFrequency()>gfmTuner_u16TunerFrequency)
{
gfmTuner_u16TunerFrequency=fmTuner_GetMaxFrequency();
}
}
fmTuner_TuneToFrequecy(gfmTuner_u16TunerFrequency);
gfmTuner_u8InTune=TRUE;
fmTuner_OsGenernalDelay(5);
//fmDisplay_RadioFrequency(gfmTuner_u16TunerFrequency);
}
//-----------------------------------------------------------------------------
// FUNCTION: fmTuner_TuneToFrequency
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_TuneToFrequecy(U16 kWantedFrequency)
{
U32 temp;
FetchCommandData();
temp=GetPllFromFrequency(kWantedFrequency);
gfmTuner_I2C_BufferSend[TUNER_BYTE1]=(U8)((temp>>8)&0x000000FF);
gfmTuner_I2C_BufferSend[TUNER_BYTE2]=(U8)(temp&0x000000FF);
gfmTuner_I2C_BufferSend[TUNER_MUTE_LOCATION]|=TUNER_MUTE_MASK;
fmTuner_SendSequentialByte(gfmTuner_I2C_BufferSend,cIIC_LENGTH_FIVE);
}
//-----------------------------------------------------------------------------
// FUNCTION: fmTuner_CheckInTune
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_CheckInTune(void)
{
static U8 LevelHigh=0;
static U8 LevelLow =0;
static U8 MeasureTime=0;
//check if a station is found
if(gfmTuner_I2C_BufferRead[0]&0x80)
{
if((fmTuner_GetMaxFrequency()-50)<gfmTuner_u16TunerFrequency)
{
gfmTuner_eHighLowInjection=fmTuner_HighLowInjection_High;
fmTuner_MuteDemuteTuner(FALSE);
fmTuner_OsGenernalDelay(5);
gfmTuner_u8InTune=FALSE;
return;
}
if((fmTuner_GetMinimumFrequency()+50)>gfmTuner_u16TunerFrequency)
{
gfmTuner_eHighLowInjection=fmTuner_HighLowInjection_Low;
fmTuner_MuteDemuteTuner(FALSE);
fmTuner_OsGenernalDelay(5);
gfmTuner_u8InTune=FALSE;
return;
}
MeasureTime++;
//A bug was found that there is no sound after tuning check.This was caused by immediately reading after
//wrting by IIC master.The fmI2cmaster may need modification.
switch(MeasureTime)
{
case 1:
fmTuner_TuneToFrequecy((U16)(gfmTuner_u16TunerFrequency+45));
fmTuner_OsGenernalDelay(5);
break;
case 2:
LevelHigh=(U8)((gfmTuner_I2C_BufferRead[3]&0xf0)>>4);
fmTuner_TuneToFrequecy((U16)(gfmTuner_u16TunerFrequency-45));
fmTuner_OsGenernalDelay(5);
break;
case 3:
LevelLow=(U8)((gfmTuner_I2C_BufferRead[3]&0xf0)>>4);
if(LevelHigh<LevelLow)
{
gfmTuner_eHighLowInjection=fmTuner_HighLowInjection_High;
}
else
{
gfmTuner_eHighLowInjection=fmTuner_HighLowInjection_Low ;
}
fmTuner_TuneToFrequecy(gfmTuner_u16TunerFrequency);
fmTuner_OsGenernalDelay(5);
break;
case 4:
fmTuner_MuteDemuteTuner(FALSE);
fmTuner_OsGenernalDelay(5);
break;
case 5:
gfmTuner_u8InTune=FALSE;
LevelHigh=0;
LevelLow =0;
MeasureTime=0;
break;
default :
break;
}
}
}
//----------------------------------------------------------------------------
// FUNCTION: fmTuner_StandBy
//
// DESCRIPTION: Time delay subroutine
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_StandBy(U32 kStandByFlag)
{
U32 temp;
FetchCommandData();
temp=GetPllFromFrequency(gfmTuner_u16TunerFrequency);
gfmTuner_I2C_BufferSend[TUNER_BYTE1]=(U8)((temp>>8)&0x000000FF);
gfmTuner_I2C_BufferSend[TUNER_BYTE2]=(U8)(temp&0x000000FF);
if(kStandByFlag==TRUE)
{
gfmTuner_I2C_BufferSend[TUNER_STAND_BY_LOCATION]|=TUNER_STAND_BY_MASK;
//gfmTuner_I2C_BufferSend[TUNER_MUTE_LOCATION]|=TUNER_MUTE_MASK;
}
else
{
gfmTuner_I2C_BufferSend[TUNER_MUTE_LOCATION]|=TUNER_MUTE_MASK;
}
fmTuner_SendSequentialByte(gfmTuner_I2C_BufferSend,cIIC_LENGTH_FIVE);
fmTuner_OsGenernalDelay(10);
}
//----------------------------------------------------------------------------
// FUNCTION: fmTuner_MuteDemuteTuner
//
// DESCRIPTION: Time delay subroutine
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_MuteDemuteTuner(U32 kMuteFlag)
{
U32 temp;
FetchCommandData();
temp=GetPllFromFrequency(gfmTuner_u16TunerFrequency);
gfmTuner_I2C_BufferSend[TUNER_BYTE1]=(U8)((temp>>8)&0x000000FF);
gfmTuner_I2C_BufferSend[TUNER_BYTE2]=(U8)(temp&0x000000FF);
if(kMuteFlag==TRUE)
{
gfmTuner_I2C_BufferSend[TUNER_MUTE_LOCATION]|=TUNER_MUTE_MASK;
}
else
{
gfmTuner_I2C_BufferSend[TUNER_MUTE_LOCATION]&=(~TUNER_MUTE_MASK);
}
fmTuner_SendSequentialByte(gfmTuner_I2C_BufferSend,cIIC_LENGTH_FIVE);
}
//----------------------------------------------------------------------------
// FUNCTION: fmTuner_SendSequentialByte
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
static void fmTuner_SendSequentialByte(U8* pkBuffer,U32 kSize)
{
if(IICMASTERERROR_NACK_TXFR==fmI2cmaster_send(SLAVE_ADDRESS,SUB_ADDRESS,pkBuffer,(int)kSize))
{
if(gfmTuner_u8InTune==TRUE)
{
gfmTuner_u8InTune=FALSE;
}
}
fmTuner_OsGenernalDelay(5);
}
//----------------------------------------------------------------------------
// FUNCTION: fmTuner_ReadSequentialByte
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_ReadSequentialByte(U8* pkBuffer,U32 kSize)
{
if(IICMASTERERROR_NACK_TXFR==fmI2cmaster_read(SLAVE_ADDRESS,SUB_ADDRESS,pkBuffer,(int)kSize))
{
if(gfmTuner_u8InTune==TRUE)
{
gfmTuner_u8InTune=FALSE;
}
}
fmTuner_OsGenernalDelay(5);
}
//----------------------------------------------------------------------------
// FUNCTION: FetchCommandData
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
static void FetchCommandData(void)
{
U32 i;
for(i=0;i<cIIC_LENGTH_FIVE;i++)
{
gfmTuner_I2C_BufferSend[i]=0;
}
gfmTuner_I2C_BufferSend[TUNER_BYTE4]=TUNER_BYTE4_DEFAULT;
gfmTuner_I2C_BufferSend[TUNER_BYTE5]=TUNER_BYTE5_DEFAULT;
if(gfmTuner_eMonoStereo==fmTuner_MonoStereo_Stereo)
{
gfmTuner_I2C_BufferSend[TUNER_MONO_LOCATION]&=(~TUNER_MONO_STEREO_MASK);
}
else
{
gfmTuner_I2C_BufferSend[TUNER_MONO_LOCATION]|=TUNER_MONO_STEREO_MASK;
}
if( gfmTuner_eHighLowInjection==fmTuner_HighLowInjection_High)
{
gfmTuner_I2C_BufferSend[TUNER_HLSI_LOCATION]|=TUNER_HLSI_MASK;
}
else
{
gfmTuner_I2C_BufferSend[TUNER_HLSI_LOCATION]&=(~TUNER_HLSI_MASK);
}
}
//----------------------------------------------------------------------------
// FUNCTION: GetPllFromFrequency
//
// DESCRIPTION:
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
static U32 GetPllFromFrequency(U16 kFrequencyWanted)
{
U32 PLL;
if( gfmTuner_eHighLowInjection==fmTuner_HighLowInjection_High)
{
PLL=((U32)kFrequencyWanted*10000+225000)/8192;
gfmTuner_u32FrequencyRemainder=(U16)((kFrequencyWanted*10000+225000)%8192);
}
else
{
PLL=((U32)kFrequencyWanted*10000-225000)/8192;
gfmTuner_u32FrequencyRemainder=(U16)((kFrequencyWanted*10000-225000)%8192);
}
return PLL;
}
//----------------------------------------------------------------------------
// FUNCTION: fmTuner_OsGenernalDelay
//
// DESCRIPTION: Time delay subroutine
//
// RETURN: none
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
void fmTuner_OsGenernalDelay(U32 kDelayData)
{
U32 Counter1;
U32 Counter2;
U32 temp;
for(Counter1=0;Counter1<kDelayData;Counter1++)
{
for(Counter2=0;Counter2<cTIME_SLOT_1MS;Counter2++)
{
temp++;
temp++;
}
}
}
//-----------------------------------------------------------------------------
// FUNCTION:
//
// DESCRIPTION: <Function description/purpose>
//
//RETURN: <return data type/description>
//
// NOTES: <Function notes - pre/post state, side effects, reentrancy>
//-----------------------------------------------------------------------------
//
/*
<Return Type>
<Function Name> (
<Parameter 1>, // <[ I:| O:|IO:] Parameter 1 description (include domain
// and/or constraints)>
<Parameter 2>, // <[ I:| O:|IO:] Parameter 2 description..>
<Parameter n> // <[ I:| O:|IO:] Parameter n description..>
)
{
<Code implementation here...>
} // <Function Name> ()
*/
/*============================ History List ================================
============================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -