📄 radio.c
字号:
//Weather band disable
Radio.TunerBuff[11]=(Radio.TunerBuff[11]&0x0fd)|TDA7541_WB_DISABLE;
//IF gain and Q
//Radio.TunerBuff[14]=(Radio.TunerBuff[14]&0x0F)|TDA7541_IF2Q_NOR_AMQ28_FMQ28|TDA7541_IF2_GAIN_9;
//STD vco
//Radio.TunerBuff[23]=(Radio.TunerBuff[23]&0xdf)|TDA7541_STD_VCO_OFF;
//SSTOP threshold---!!!Cutomer can adjust this threshold to adapt their own seek sensitivity requirment
/*if(Radio.F_LocDx)
Radio.TunerBuff[10]= (Radio.TunerBuff[10]&0x0F)|TDA7541_SSTOP_IFC_FM1_3_AM2_3;
else
Radio.TunerBuff[10]= (Radio.TunerBuff[10]&0x0F)|TDA7541_SSTOP_IFC_FM0_7_AM1_4;
*/
if(start>4)start=4;
if(end<25)end=25;
}
RadioTunerSend(start,end);
Radio.F_ForceSetBuff=0;
#endif
if((FreqInNormalFM(setfreq)&&(!FreqInNormalFM(Radio.Freq)))||(FreqInJapanFM(setfreq)&&(!FreqInJapanFM(Radio.Freq))))
{
Radio.MaxFreq=Area[Radio.Area].FMMaxFreq;
Radio.MinFreq=Area[Radio.Area].FMMinFreq;
Radio.Step=Area[Radio.Area].FMStep;
Radio.SeekStep=Area[Radio.Area].FMSeekStep;
}
else if(FreqInOirtFM(setfreq)&&(!FreqInOirtFM(Radio.Freq)))
{
Radio.MaxFreq=Area[AREA_OIRT].FMMaxFreqOirt;
Radio.MinFreq=Area[AREA_OIRT].FMMinFreqOirt;
Radio.Step=Area[AREA_OIRT].FMStepOirt;
Radio.SeekStep=Radio.Step;
}
else if(FreqInMWAM(setfreq)&&(!FreqInMWAM(Radio.Freq)))
{
Radio.MaxFreq=Area[Radio.Area].AMMaxFreqMW;
Radio.MinFreq=Area[Radio.Area].AMMinFreqMW;
Radio.Step=Area[Radio.Area].AMStepMW;
Radio.SeekStep=Radio.Step;
}
else if(FreqInLWAM(setfreq)&&(!FreqInLWAM(Radio.Freq)))
{
Radio.MaxFreq=Area[Radio.Area].AMMaxFreqLW;
Radio.MinFreq=Area[Radio.Area].AMMinFreqLW;
Radio.Step=Area[Radio.Area].AMStepLW;
Radio.SeekStep=Radio.Step;
}
else if(FreqInWBFM(setfreq)&&(!FreqInWBFM(Radio.Freq)))
{
Radio.MaxFreq=Area[Radio.Area].FMMaxFreqWB;
Radio.MinFreq=Area[Radio.Area].FMMinFreqWB;
Radio.Step=Area[Radio.Area].FMStepWB;
Radio.SeekStep=Radio.Step;
}
Radio.Freq=setfreq;
Radio.Band[Radio.CurrentBand].BandFreq=Radio.Freq;
if(!RADIO_IN_PS)
{
for(i=0;i<6;i++)
{
if(Radio.Freq==Radio.Band[Radio.CurrentBand].MemFreq[i])
{
Radio.Band[Radio.CurrentBand].CurrentMem=i+1;
break;
}
if(i==5)Radio.Band[Radio.CurrentBand].CurrentMem=0;
}
}
RDSDataInit();
if(RDSDispMode!=RDSDISP_PTYSELECT)
RDSDispMode=RDSDISP_IDLE;
}
unsigned int RadioFreqCal(unsigned char step)
{
unsigned int inputfreq;
if(Radio.Area==AREA_OIRT && FreqInFM(Radio.Freq))
{
if(Radio.Direction>0)
{
inputfreq=Radio.Freq+step;
if(inputfreq>Area[AREA_OIRT].FMMaxFreqOirt && inputfreq<Area[AREA_OIRT].FMMinFreq)
inputfreq=Area[AREA_OIRT].FMMinFreq;
else if(inputfreq>Area[AREA_OIRT].FMMaxFreq)
inputfreq=Area[AREA_OIRT].FMMinFreqOirt;
}
else
{
inputfreq=Radio.Freq-step;
if(inputfreq>Area[AREA_OIRT].FMMaxFreqOirt && inputfreq<Area[AREA_OIRT].FMMinFreq)
inputfreq=Area[AREA_OIRT].FMMaxFreqOirt;
else if(inputfreq<Area[AREA_OIRT].FMMinFreqOirt)
inputfreq=Area[AREA_OIRT].FMMaxFreq;
}
}
else
{
if(Radio.Direction>0)
{
if(Radio.Freq%10==5 && FreqInFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))
inputfreq=Radio.Freq+5;//avoid the frequency(87.55,89.55...) at first time
else
inputfreq=Radio.Freq+step;
if(inputfreq>Radio.MaxFreq)
inputfreq=Radio.MinFreq;
}
else
{
if(Radio.Freq%10==5 && FreqInFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))
inputfreq=Radio.Freq-5;
else
inputfreq=Radio.Freq-step;
if(inputfreq<Radio.MinFreq)
inputfreq=Radio.MaxFreq;
}
}
return(inputfreq);
}
void RadioSave(unsigned char pos)
{
unsigned char i;
if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
Radio.Band[Radio.CurrentBand].CurrentMem=pos+1;
Radio.Band[Radio.CurrentBand].MemFreq[pos]=Radio.Freq;
if(RDS.AFNum>1)
{
Radio.Band[Radio.CurrentBand].PI[pos]=RDS.PI;
Radio.Band[Radio.CurrentBand].MemAFNum[pos]=RDS.AFNum;
for(i=0;i<8;i++)
Radio.Band[Radio.CurrentBand].MemAFList[pos][i]=RDS.AF[i];
}
Radio.F_TunerDispReq=1;
RDSDispTimer=1;//fixed for RDS PS display by yete at Sep 20,2006
}
void RadioLoad(unsigned char pos)
{
unsigned char i;
if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
RadioMute(SOFTON);
RadioSetFreq(Radio.Band[Radio.CurrentBand].MemFreq[pos]);
RadioMute(SOFTOFF);
Radio.Band[Radio.CurrentBand].CurrentMem=pos+1;
if(RDS.F_AFEnable||RDS.F_TAEnable)
{
RDS.PI=Radio.Band[Radio.CurrentBand].PI[pos];
RDS.AFNum=Radio.Band[Radio.CurrentBand].MemAFNum[pos];
for(i=0;i<8;i++)
RDS.AF[i]=Radio.Band[Radio.CurrentBand].MemAFList[pos][i];
if(RDS.AFNum>1)
{
SetAFSearch();
}
}
Radio.F_TunerDispReq=1;
}
void SeekOn(void)
{
#if TDA7540Tuner
//seek on (ISS time constant)
Radio.TunerBuff[0] |= 0x80;
RadioTunerSend(0,0);
// AM
Radio.TunerBuff[7] |= 0x01;
RadioTunerSend(7,7);
// enable IFC
Radio.TunerBuff[5] |= 0x08;
RadioTunerSend(5,5);
/*if(FreqInFM(Radio.Freq))
{
Radio.TunerBuff[18] &= y11000000;
Radio.TunerBuff[18] += y00100000;
RadioTunerSend(18,18);
}
else
{
Radio.TunerBuff[18] &= y11000000;
Radio.TunerBuff[18] += y00001111;
RadioTunerSend(18,18);
}*/////not fixed Slider in software---modified on April 24,2006
BreakAFCheck();
#endif
#if TDA7541Tuner
//seek on (ISS time constant)
Radio.TunerBuff[0] =(Radio.TunerBuff[0]&0x7f)|TDA7541_SEEK_ON;
RadioTunerSend(0,0);
//No enable/disable IFC in TDA7541
//Set FSW offset to off, based on this to adjust seek sensitivity according customer spec.
//SaveFSWOffset=Radio.TunerBuff[16];
//Radio.TunerBuff[16]=(Radio.TunerBuff[16]&0x3f);//FSW offset off
//RadioTunerSend(16,16);
BreakAFCheck();
#endif
}
void SeekOff(void)
{
#if TDA7540Tuner
// seek off
// FM
Radio.TunerBuff[0] &= 0x7F;
RadioTunerSend(0,0);
//Disable IFC
//Radio.TunerBuff[5] &= 0xf7;
//RadioTunerSend(5,5);
//Normal AGC time constant
Radio.TunerBuff[7] &= 0xFE;
RadioTunerSend(7,7);
//Return back to original slider
//Radio.TunerBuff[18]=SaveSmeterSlider;
//RadioTunerSend(18,18);
#endif
#if TDA7541Tuner
//seek on (ISS time constant)
Radio.TunerBuff[0] =(Radio.TunerBuff[0]&0x7f)|TDA7541_SEEK_OFF;
RadioTunerSend(0,0);
//No need to enable/disable IFC
//HAVE TO return back to FSW offset because this related to radio performance.
//Radio.TunerBuff[16]=SaveFSWOffset;
//RadioTunerSend(16,16);
BreakAFCheck();
#endif
}
void RadioMute(unsigned char type)
{
AudioMute(type);
}
void PresetOrder(void)
{
unsigned char i,j;
if(TempPresetNum<6)
{
Radio.Band[Radio.CurrentBand].MemFreq[TempPresetNum]=Radio.Freq;
Radio.Band[Radio.CurrentBand].MemSmeter[TempPresetNum]=GetSMeter();
if(RDS.F_AFEnable)
{
Radio.Band[Radio.CurrentBand].PI[TempPresetNum]=RDS.PI;
Radio.Band[Radio.CurrentBand].MemAFNum[TempPresetNum]=RDS.AFNum;
for(j=0;j<8;j++)
Radio.Band[Radio.CurrentBand].MemAFList[TempPresetNum][j]=RDS.AF[j];
}
TempPresetNum++;
}
else
{
TempPresetSMMin=0xFF;
for(i=0;i<6;i++)
{
if(TempPresetSMMin>Radio.Band[Radio.CurrentBand].MemSmeter[i])
{
TempPresetSMMin=Radio.Band[Radio.CurrentBand].MemSmeter[i];
TempPresetSMMinNum=i;
}
}
if(GetSMeter()>TempPresetSMMin)
{
for(i=TempPresetSMMinNum;i<5;i++)
{
Radio.Band[Radio.CurrentBand].MemFreq[i]=Radio.Band[Radio.CurrentBand].MemFreq[i+1];
Radio.Band[Radio.CurrentBand].MemSmeter[i]=Radio.Band[Radio.CurrentBand].MemSmeter[i+1];
if(RDS.F_AFEnable)
{
Radio.Band[Radio.CurrentBand].PI[i]=Radio.Band[Radio.CurrentBand].PI[i+1];
Radio.Band[Radio.CurrentBand].MemAFNum[i]=Radio.Band[Radio.CurrentBand].MemAFNum[i+1];
for(j=0;j<8;j++)
Radio.Band[Radio.CurrentBand].MemAFList[i][j]=Radio.Band[Radio.CurrentBand].MemAFList[i+1][j];
}
}
Radio.Band[Radio.CurrentBand].MemFreq[5]=Radio.Freq;
Radio.Band[Radio.CurrentBand].MemSmeter[5]=GetSMeter();
if(RDS.F_AFEnable)
{
Radio.Band[Radio.CurrentBand].PI[5]=RDS.PI;
Radio.Band[Radio.CurrentBand].MemAFNum[5]=RDS.AFNum;
for(j=0;j<8;j++)
Radio.Band[Radio.CurrentBand].MemAFList[5][j]=RDS.AF[j];
}
}
}
}
void RadioTunerSend(unsigned char start, unsigned char end)
{
unsigned char i;
I2CStart ();
I2COut8Bit(0xC4);
if(start==end)
I2COut8Bit(start);
else
#if TDA7540Tuner
I2COut8Bit(start+0x40);
#endif
#if TDA7541Tuner//Page mode bit change: Yete June-22-2007
I2COut8Bit(start+0x20);
#endif
for (i=start;i<=end; i++)
I2COut8Bit(Radio.TunerBuff[i]);
I2CStop();
}
void RadioTunerRead(void)
{
unsigned char i;
I2CStart ();
I2COut8Bit(0xC5);
Radio.ReadBuff.byte=I2CIn8Bit();
I2CNAck();
I2CStop();
}
/*********************************************
Function: Radio_PLL_FMISet
Description:
Write/Modify: Yete
Time: 2006-06-02
*********************************************/
unsigned char Radio_PLL_FMISet(unsigned int FMfreq)
{
#if TDA7540Tuner
if(FreqInOirtFM(FMfreq))//ORIT
{
if (FMfreq < FM67_0MHZ)
{
return (PLL_HICURRENT_2_5mA);
}
if (FMfreq < FM71_0MHZ)
{
return (PLL_HICURRENT_3MA);
}
return (PLL_HICURRENT_3_5mA);
}
else if(FreqInJapanFM(FMfreq))//Japan
{
if (FMfreq < FM80_0MHZ)
{
return (PLL_HICURRENT_1_5mA);
}
if (FMfreq < FM85_0MHZ)
{
return (PLL_HICURRENT_2MA);
}
return (PLL_HICURRENT_3MA);
}
if(FreqInWBFM(FMfreq))//Weather band
{
return (PLL_HICURRENT_0_5mA);
}
else//Normal FM
{
if (FMfreq < FM94_5MHZ)
{
return (PLL_HICURRENT_1_5mA);
}
if (FMfreq < FM98_6MHZ)
{
return (PLL_HICURRENT_2_5mA);
}
if (FMfreq < FM106_9MHZ)
{
return (PLL_HICURRENT_3MA);
}
return (PLL_HICURRENT_3_5mA);
}
#endif
#if TDA7541Tuner
if(FreqInOirtFM(FMfreq))//ORIT
{
if (FMfreq < FM67_0MHZ)
{
return (TDA7541_PLL_HICURRENT_2_5mA);
}
if (FMfreq < FM71_0MHZ)
{
return (TDA7541_PLL_HICURRENT_3MA);
}
return (TDA7541_PLL_HICURRENT_3_5mA);
}
else if(FreqInJapanFM(FMfreq))//Japan
{
if (FMfreq < FM80_0MHZ)
{
return (TDA7541_PLL_HICURRENT_1_5mA);
}
if (FMfreq < FM85_0MHZ)
{
return (TDA7541_PLL_HICURRENT_2MA);
}
return (TDA7541_PLL_HICURRENT_3MA);
}
if(FreqInWBFM(FMfreq))//Weather band
{
return (TDA7541_PLL_HICURRENT_0_5mA);
}
else//Normal FM
{
if (FMfreq < FM94_5MHZ)
{
return (TDA7541_PLL_HICURRENT_1_5mA);
}
if (FMfreq < FM98_6MHZ)
{
return (TDA7541_PLL_HICURRENT_2_5mA);
}
if (FMfreq < FM106_9MHZ)
{
return (TDA7541_PLL_HICURRENT_3MA);
}
return (TDA7541_PLL_HICURRENT_3_5mA);
}
#endif
}
/*********************************************
Function: Radio_PLL_AMISet
Description:
Write/Modify: Yete
Time: 2006-06-02
*********************************************/
unsigned char Radio_PLL_AMISet(unsigned int AMfreq)
{
#if TDA7540Tuner
if (AMfreq < AM530KHZ)//LW
{
return (PLL_HICURRENT_2MA);
}
if (AMfreq < AM999KHZ)//MW
{
return (PLL_HICURRENT_2_5mA);
}
if (AMfreq < AM1404KHZ)
{
return (PLL_HICURRENT_3MA);
}
return (PLL_HICURRENT_3_5mA);
#endif
#if TDA7541Tuner
if (AMfreq < AM530KHZ)//LW
{
return (TDA7541_PLL_HICURRENT_2MA);
}
if (AMfreq < AM999KHZ)//MW
{
return (TDA7541_PLL_HICURRENT_2_5mA);
}
if (AMfreq < AM1404KHZ)
{
return (TDA7541_PLL_HICURRENT_3MA);
}
return (TDA7541_PLL_HICURRENT_3_5mA);
#endif
}
/*********************************************
Function: Radio10msTimer
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:09
*********************************************/
void Radio10msTimer(void)
{
if(RadioWaitTimer>0)RadioWaitTimer--;
if(RadioWorkTimer10ms>0)RadioWorkTimer10ms--;
}
void Radio100msTimer(void)
{
if(RadioWorkTimer>0)RadioWorkTimer--;
if(AFTAShowTimer>1)AFTAShowTimer--;
if(SeekKeyTimer>0)SeekKeyTimer--;
if(RadioTunerEepromTimer>0)RadioTunerEepromTimer--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -