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

📄 fmtuner_drvfunction.c

📁 这是一款聚电视和收音为一体的微处理器 C++ 源代码,成果奉献,供广大的底层软件开发者学习和参考
💻 C
📖 第 1 页 / 共 3 页
字号:
//
// 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 + -