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

📄 radio_tuner.c

📁 一款车载DVD的车机源程序(正在生成中的哦)
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
Project  :  Car two ting dvd System
Compiler :  ST7 HiCross C (HiWARE)
Module   :  autos.c 
Version  :  V 1.0
Created  :  24 11, 2005
Author   :  tomi / SA
Description
         -  Radio tuner  
Modified
		 - tomi
***************************************************************************/
#include "Radio_tuner.h"
#include "Libr.h"
#include "Sys_config.h"
#include "i2c_drv.h"
#include "System_operation.h"

unsigned char TunerType = TUNER_TYPE_FM;
unsigned char TunerSearchStates = TUNER_SEARCH_NONE;		//tuner searching states flags
unsigned short int FMfreq = FMFREQ_MIN;
unsigned short int AMfreq = AMFREQ_MIN;

unsigned char AutoSearchStep = 0;
unsigned char CurrentBand = FM_BAND;
unsigned char ChannelNum = 0;
unsigned long RadioIn1Data = 0;
unsigned long RadioIn2Data = 0;
unsigned long RadioOutData = 0;

unsigned char Radio_tuner_flag;
unsigned short int FM_frequence_list[30] = {8750};
unsigned short int AM_frequence_list[30] = {531};
signed char Radio_channel_high_light_cnt= 0;	//One list will display 6 channel,so not in full search mode then will have one channl high light
unsigned char Radio_channel_list_cnt= 0;	//From 0 to 5,so can display 0~30(one list is 0~6 channel,so 0*8~5*6)

static void Send_ccb_data(unsigned   long ccbdata, unsigned char  bits);
static unsigned long Read_ccb_data(unsigned char  bits);
static unsigned long Read_data_from_ccb(unsigned long address, unsigned char bits);
static void Send_data_to_ccb(unsigned long address, unsigned long ccbdata, unsigned char bits);
static void Unmute_bo2port(void);
void Init_lc72131(void);
void Tuner_handsearch(void);
void Change_freq_value(void);
void Tuner_autosearch(void);
void Tuner_IFok(void);
void Radio_tuner(void);
void Radio_tuner_search_key_process(void);
void Radio_search_next_process(void);
void Radio_search_previous_process(void);
void Switch_FM_AM(void);
void Force_to_full_search_mode(void);
void Force_to_M1_channel(void);
void Force_to_M2_channel(void);
void Force_to_M3_channel(void);
void Force_to_M4_channel(void);
void Force_to_M5_channel(void);
void Force_to_M6_channel(void);
void Radio_tuner_up_step_search(void);
void Radio_tuner_down_step_search(void);
/******************************************************************
Function:
******************************************************************/
static void Send_ccb_data(unsigned   long ccbdata, unsigned char  bits)
{
	unsigned char i;

   	for( i = 0; i < bits; i++)
   		{
		CLEAR_CCB_CLK;
		delay_us(30);
 		if (ccbdata & 0x01) 
			SET_CCB_DATA;
   		else 
			CLEAR_CCB_DATA;
		delay_us(30);
    		SET_CCB_CLK;
    		ccbdata >>= 1;
    		delay_us(30);
   		}
   	SET_CCB_DATA;
}
/********************************************************************
Function:
********************************************************************/
static unsigned long Read_ccb_data(unsigned char  bits)
{
	unsigned char i;
  	unsigned long value;
	value = 0;
   	for(i = 0; i < bits; i++)
    		{
    		value <<= 1;
   		CLEAR_CCB_CLK;
		delay_us(30);
		SET_CCB_CLK;
		delay_us(30);
		if(IS_PLL_DO_HIGH)
			value |= 0x01;
    		}
	return value;
}
/****************************************************************
Function:
****************************************************************/
static unsigned long Read_data_from_ccb(unsigned long address, unsigned char bits)
{
	unsigned long CcbOutData;
	CLEAR_CCB_STROBE;
    	Send_ccb_data(address, 8);
    	SET_CCB_STROBE;
    	CcbOutData = Read_ccb_data(bits);
    	CLEAR_CCB_STROBE;

   	 return CcbOutData;
}
/*********************************************************************
Function:
*********************************************************************/
static void Send_data_to_ccb(unsigned long address, unsigned long ccbdata, unsigned char bits)
{
	CLEAR_CCB_STROBE;
    	Send_ccb_data(address, 8);
    	SET_CCB_STROBE;
	Send_ccb_data(ccbdata, bits);
    	CLEAR_CCB_STROBE;
}

/*******************************************************************
Function:
*******************************************************************/
static void Unmute_bo2port(void)
{
	RadioIn2Data = (RadioIn2Data |  IO2_UNMUTE) & ~RADIO_IN2_DOC ;

	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}
/*******************************************************************
Function:
*******************************************************************/
void Init_lc72131(void)
{
	switch(CurrentBand)
	{
    case  AM_BAND:
	RadioIn1Data = IN1_AM_INIT | (((AMfreq + 10710) /AM_freq_step) << 4 );
	RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX ;
		break;
    default:
 	RadioIn1Data = IN1_FM_INIT | (FMfreq + 1070) /5;
	RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX |SELECT_FM |BO3_ST;
        break;
 	}

	Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
	Unmute_bo2port();
	asm	nop;
}
/*******************************************************************
Function:
*******************************************************************/
void Tuner_handsearch(void)
{
 	Change_freq_value();
	Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
	Unmute_bo2port();
}
/*******************************************************************
Function:
*******************************************************************/
void Radio_tuner_up_step_search(void)
{
	System_mute_on();
	
	Item_function_on_check_hight_default_light_item();
	
	SetBit(System_flag,bSearchDir);
	SetBit(Radio_tuner_flag,AutoSearchOK_flag);
	Tuner_handsearch();
	if(!ValBit(Radio_tuner_flag,Search_full_mode))	//In one channel search mode send now frequence to the high light item's channel
		{
		if(TunerType==TUNER_TYPE_AM)
          		AM_frequence_list[ChannelNum] = AMfreq;
          					
          	else
          		FM_frequence_list[ChannelNum] = FMfreq;
		}

	System_mute_off();
}
/*******************************************************************
Function:
*******************************************************************/
void Radio_tuner_down_step_search(void)
{
	System_mute_on();
	
	Item_function_on_check_hight_default_light_item();
	
	ClrBit(System_flag,bSearchDir);
	SetBit(Radio_tuner_flag,AutoSearchOK_flag);
	Tuner_handsearch();
	if(!ValBit(Radio_tuner_flag,Search_full_mode))	//In one channel search mode send now frequence to the high light item's channel
		{
		if(TunerType==TUNER_TYPE_AM)
          		AM_frequence_list[ChannelNum] = AMfreq;
          					
          	else
          		FM_frequence_list[ChannelNum] = FMfreq;
		}

	System_mute_off();
}
/********************************************************************
Function:
********************************************************************/
void Change_freq_value(void)
{
	if(TunerType==TUNER_TYPE_AM)
		{		
		if(ValBit(System_flag,bSearchDir)) 
			{
			AMfreq+=AM_freq_step;
			if(AMfreq > AMFREQ_MAX)
				{
				AMfreq = AMFREQ_MIN;
				if(ValBit(Radio_tuner_flag,Search_full_mode))	//Full search mode check stop
					{
					TunerSearchStates=TUNER_SEARCH_NONE;
					SetBit(Radio_tuner_flag,AutoSearchOK_flag);
					AutoSearchStep  = AUTOSRCH_STEP0;
					ChannelNum = 0;
					ClrBit(Radio_tuner_flag,Search_full_mode);
					Force_to_M1_channel();
					}	
				}
			}
		else 
			{
			AMfreq-=AM_freq_step;
			if(AMfreq < AMFREQ_MIN)
				AMfreq = AMFREQ_MAX;			
			}
		RadioIn1Data = (RadioIn1Data & 0xff0000) |(((AMfreq + 10710)  /AM_freq_step) << 4 );
		}
	else 
		{
		if(ValBit(System_flag,bSearchDir)) 
			{
			FMfreq+=FM_freq_step;
			if(FMfreq>FMFREQ_MAX)
				{
				FMfreq=FMFREQ_MIN;
				if(ValBit(Radio_tuner_flag,Search_full_mode))	//Full search mode check stop
					{
					TunerSearchStates=TUNER_SEARCH_NONE;
					SetBit(Radio_tuner_flag,AutoSearchOK_flag);
					AutoSearchStep  = AUTOSRCH_STEP0;
					ChannelNum = 0;
					ClrBit(Radio_tuner_flag,Search_full_mode);
					Force_to_M1_channel();
					}
				}
			}
		else 
			{
			FMfreq-=FM_freq_step;
			if(FMfreq<FMFREQ_MIN)
				FMfreq=FMFREQ_MAX;
			}
		RadioIn1Data = (RadioIn1Data & 0xff0000) |((FMfreq+1070) / 5);
		}
}
/****************************************************************
Function:
*****************************************************************/
void Tuner_autosearch(void)
{
   	switch(AutoSearchStep)
    	{
	 case AUTOSRCH_STEP0:
	 	RadioIn2Data &= ~RADIO_IN2_RESET;
		RadioIn2Data |= BO3_ST ;
      		RadioIn2Data |= RADIO_IN2_DOC;
      		RadioIn2Data &= ~IO2_UNMUTE;
      		Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);

        	RadioIn1Data &= ~RADIO_IN1_CTE;       /* set  cte = 0, reset counter*/
		Change_freq_value();
      		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);  		
		RadioIn1Data |= RADIO_IN1_CTE;
      		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);      		
		AutoSearchStep ++;
		break;

     	case AUTOSRCH_STEP1:  /*check DO is low?*/
		if (IS_PLL_DO_HIGH /*&& IFDetectCount*/)
			break;     /*IF counter end*/
		AutoSearchStep ++;
	case AUTOSRCH_STEP2:	/*/check UL and read data from LC72131*/
			//WAIT_1ms();
			RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
			RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
			
			if(((RadioOutData & RADIO_OUT_LOCK) != RADIO_OUT_LOCK)) 
				break;
			AutoSearchStep  = AUTOSRCH_STEP0;
			Tuner_IFok();
			
			if(ValBit(Radio_tuner_flag,IFOK_flag))
          			{
          			ClrBit(Radio_tuner_flag,IFOK_flag);
          			if(!ValBit(Radio_tuner_flag,Search_full_mode))	//Now search mode is one channel search
          				{
					if(TunerType==TUNER_TYPE_AM)
          					AM_frequence_list[ChannelNum] = AMfreq;
          				else
          					FM_frequence_list[ChannelNum] = FMfreq;
					TunerSearchStates=TUNER_SEARCH_NONE;
					SetBit(Radio_tuner_flag,AutoSearchOK_flag);
					System_mute_off();
          				}
          			else	//Now search mode is full search,so here you must save the frequence and keep search
          				{
          					if(TunerType==TUNER_TYPE_AM)	//Save the one channel's frequence
          						AM_frequence_list[ChannelNum] = AMfreq;
          					
          					else
          						FM_frequence_list[ChannelNum] = FMfreq;
          					TunerSearchStates=TUNER_SEARCH_RUN;
						ClrBit(Radio_tuner_flag,AutoSearchOK_flag);
						AutoSearchStep  = AUTOSRCH_STEP0;
						ChannelNum++;
						if(ChannelNum >= 30)		//Run to the max number then stop to search
							{
							ChannelNum = 0;
							TunerSearchStates=TUNER_SEARCH_NONE;
							SetBit(Radio_tuner_flag,AutoSearchOK_flag);
							if(TunerType==TUNER_TYPE_AM)
								AMfreq = AMFREQ_MIN;
							else
								FMfreq = FMFREQ_MIN;

⌨️ 快捷键说明

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