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