📄 radio.c
字号:
/*#ifdef DEBUG_MODE
DebugShow("Radio.Freq=",Radio.Freq," Wait TP not OK!");
#endif*/
}
break;
case RADIO_WORK_SEEKWAITPTY:
if(RDS.F_GetNewPTY&&(RDS.PTY==PTYSelectType))
{
Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
PTYSelectTimer=1;
#ifdef DEBUG_MODE
DebugShow("Radio.Freq=",Radio.Freq," Wait PTY OK!");
#endif
break;
}
if(RadioWorkTimer10ms==0)
{
Radio.WorkMode=RADIO_WORK_SEEKNEXT;
/*#ifdef DEBUG_MODE
DebugShow("Radio.Freq=",Radio.Freq," Wait PTY not OK!");
#endif*/
}
break;
case RADIO_WORK_SEEKOKWAIT:
RadioSeekMuteTimer=5;
Radio.WorkMode=RADIO_WORK_SEEKOK;
break;
case RADIO_WORK_SEEKOK:
if(RadioSeekMuteTimer>0)break;
RDS.F_PISeek=0;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
Radio.F_TunerDispReq=1;
if(Radio.F_Scan)
{
Radio.WorkMode=RADIO_WORK_SCANWAIT;
RadioWorkTimer=50;
}
break;
case RADIO_WORK_SCANWAIT:
if(RadioWorkTimer>0)break;
Radio.WorkMode=RADIO_WORK_SEEKREQ;
break;
case RADIO_WORK_SEEKBREAK:
RDS.F_PISeek=0;
Radio.F_GoodStation=0;
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_PSREQ://display the each preset memory frequency during 5 seconds
Radio.WorkMode=RADIO_WORK_PSWAIT;
Radio.Band[Radio.CurrentBand].CurrentMem=0;
RadioWorkTimer=0;
break;
case RADIO_WORK_PSWAIT:
if(RadioWorkTimer>0)break;
RadioWorkTimer=50;
if(Radio.Band[Radio.CurrentBand].CurrentMem==6)
{
Radio.Band[Radio.CurrentBand].CurrentMem=1;
Radio.WorkMode=RADIO_WORK_PSEND;
}
else
Radio.Band[Radio.CurrentBand].CurrentMem++;
BreakAFCheck();
RadioMute(SOFTON);
RadioSetFreq(Radio.Band[Radio.CurrentBand].MemFreq[Radio.Band[Radio.CurrentBand].CurrentMem-1]);
RadioMute(SOFTOFF);
System.DispMode.Requst=DISPMODE_RADIO;
RDSDispMode=RDSDISP_IDLE;
break;
case RADIO_WORK_PSEND:
RadioWorkTimer=0;
Radio.WorkMode=RADIO_WORK_IDLE;
break;
case RADIO_WORK_ASPSBREAK:
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_IDLE;
SeekOff();
RadioMute(SOFTOFF);
RadioWorkTimer=0;
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_ASREQ:
if(FreqInFM(Radio.Freq)&&Radio.Area==AREA_OIRT)
Radio.BackupFreq=Area[AREA_OIRT].FMMinFreqOirt;
else
Radio.BackupFreq=Radio.MinFreq;
Radio.ReqFreq=Radio.BackupFreq;
RadioSetFreq(Radio.ReqFreq);
Radio.Direction=1;
for(i=0;i<6;i++)
{
Radio.Band[Radio.CurrentBand].MemFreq[i]=Radio.BackupFreq;
Radio.Band[Radio.CurrentBand].MemSmeter[i]=0;
Radio.Band[Radio.CurrentBand].PI[i]=0;
Radio.Band[Radio.CurrentBand].MemAFNum[i]=1;
for(j=0;j<8;j++)
Radio.Band[Radio.CurrentBand].MemAFList[i][j]=0xFF;
}
SeekOn();
RadioMute(SOFTON);
Radio.WorkMode=RADIO_WORK_ASWAIT;
TempPresetNum=0;
Radio.F_TunerDispReq=1;
break;
case RADIO_WORK_ASWAIT:
if(Radio.SeekMode!=RADIO_SEEK_IDLE)break;
if(Radio.F_GoodStation)
{
Radio.F_GoodStation=0;
if((FreqInFM(Radio.Freq)&&!FreqInJapanFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))&&(RDS.F_AFEnable||RDS.F_TAEnable))
{
Radio.WorkMode=RADIO_WORK_ASWAITRDS;
RadioWorkTimer10ms=25;
break;
}
else
PresetOrder();
}
case RADIO_WORK_ASNEXT:
Radio.ReqFreq=RadioFreqCal(Radio.SeekStep);
Radio.SeekMode=RADIO_SEEK_INIT;
Radio.WorkMode=RADIO_WORK_ASWAIT;
if(Radio.ReqFreq==Radio.BackupFreq)
{
Radio.SeekMode=RADIO_SEEK_IDLE;
Radio.WorkMode=RADIO_WORK_ASEND;
}
break;
case RADIO_WORK_ASWAITRDS:
if(RDS.F_RDSStation)
{
Radio.WorkMode=RADIO_WORK_ASWAITPI;
RadioWorkTimer10ms=100;
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASWAITPI:
if(RDS.F_GetNewPI&&RDS.PI!=0)
{
for(i=0,j=0;i<TempPresetNum;i++)
{
if(RDS.PI==Radio.Band[Radio.CurrentBand].PI[i])
{
j=1;
break;
}
}
if(j)
{
Radio.WorkMode=RADIO_WORK_ASNEXT;
}
else
{
Radio.WorkMode=RADIO_WORK_ASWAITAFLIST;
RadioWorkTimer10ms=250;
}
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASWAITAFLIST:
if(RDS.F_GetAFList)
{
PresetOrder();
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
}
if(RadioWorkTimer10ms==0)
Radio.WorkMode=RADIO_WORK_ASNEXT;
break;
case RADIO_WORK_ASEND:
//for(i=0;i<TempPresetNum;i++)
// Radio.Band[Radio.CurrentBand].MemFreq[i]=TempPreset[i].Freq;
SeekOff();
RadioMute(SOFTOFF);
Radio.WorkMode=RADIO_WORK_PSREQ;
break;
}
}
/*********************************************
Function: RadioSetFreq
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:24
*********************************************/
void RadioSetFreq(unsigned int setfreq)
{
unsigned int pc;
unsigned char i,start,end;
#if TDA7540_TUNER
if(!Radio.F_TDA7541)
{
start=39;
end=0;
if(Radio.F_ForceSetBuff)
{
for(i=0;i<40;i++)
Radio.TunerBuff[i]=EepromBuff[i];
// seek off
Radio.TunerBuff[0] &= 0x7F;
// Disable local mode
Radio.TunerBuff[7] &= 0x7F;
//Enable AFS PIN and AFS influence on stereodecoder mute
Radio.TunerBuff[31] &= y11110011;
Pin_AFS=1;
start=0;
end=39;
}
//PLL counter
if(FreqInJapanFM(setfreq))
{
pc=(setfreq-1070)/5-32;
}
else if(FreqInOirtFM(setfreq))
{
pc=(setfreq+1070)/1-32;
}
else if(FreqInWBFM(setfreq))
{
pc=(setfreq-2400)/25+6892;//PLL counter(162.400)=6892
}
else if(FreqInNormalFM(setfreq))
{
pc=(setfreq+1070)/5-32;
}
else
{
pc=(setfreq+10700)/1-32;
}
Radio.TunerBuff[1]=(unsigned char)(pc&0x00FF);
Radio.TunerBuff[2]=(unsigned char)((pc>>8)&0x00FF);
Radio.TunerBuff[4]=GetTV2(setfreq);
//charge pump
if(FreqInFM(setfreq))
{
Radio.TunerBuff[0]&= 0x80;
Radio.TunerBuff[0]=Radio.TunerBuff[0]|PLL_HIGHCURRENT_MODE|PLL_LOWCURRENT_100uA\
|Radio_PLL_FMISet(setfreq);
}
else
{
Radio.TunerBuff[0]&= 0x80;
Radio.TunerBuff[0]=Radio.TunerBuff[0]| PLL_HIGHCURRENT_MODE | PLL_LOWCURRENT_50uA\
|Radio_PLL_AMISet(setfreq);
}
if(start>0)start=0;
if(end<4)end=4;
if(FreqInFM(setfreq)&& (FreqInAM(Radio.Freq)||Radio.F_ForceSetBuff))//Change to FM
{
//IF Counter control 1
Radio.TunerBuff[5]&= 0x48;
Radio.TunerBuff[5]= Radio.TunerBuff[5] | PLL_LOCK_ENABLE | PLL_IFC_FMMODE \
|PLL_TSAMPLE_FM20_48_AM128;
//IF Counter control 2
Radio.TunerBuff[6]= PLL_IFC_CENTER_10_7MHZ | PLL_IFC_EW_FM12_5_AM2K;
//Vco divder and pll reference
if(FreqInOirtFM(setfreq))
Radio.TunerBuff[14]=y00110110;
else if(FreqInJapanFM(setfreq))
Radio.TunerBuff[14]=y00100010;
else if(FreqInWBFM(setfreq))
Radio.TunerBuff[14]=y00101111;
else
Radio.TunerBuff[14]=y00100101;
//Change tv2 offset and switch "ON" iss filter for weather band
if(FreqInWBFM(setfreq))
{
Radio.TunerBuff[7] &= 0xCF;
Radio.TunerBuff[7] |= 0x20;
Radio.TunerBuff[8] |= 0x08;
}
else
{
Radio.TunerBuff[7] &= 0xCF;
Radio.TunerBuff[8] &= 0xf7;
}
//SSTOP threshold
if(Radio.F_LocDx)
{
Radio.TunerBuff[23] &= 0x0F;
Radio.TunerBuff[23] += SSTOP_IFC_4_40V;
}
else
{
Radio.TunerBuff[23] &= 0x0F;
Radio.TunerBuff[23] += SSTOP_IFC_2_51V; //KSE FSTC
//Radio.TunerBuff[23] += SSTOP_IFC_1_43V;
}
//IF gain
Radio.TunerBuff[19] &= 0xf9;
Radio.TunerBuff[19] |=0x06;//18dB in FM
if(start>5)start=5;
if(end<23)end=23;
}
else if(FreqInAM(setfreq)&& (FreqInFM(Radio.Freq)||Radio.F_ForceSetBuff))//Change to AM
{
//IF Counter control 1
Radio.TunerBuff[5]&= 0x48;
Radio.TunerBuff[5] = Radio.TunerBuff[5] | PLL_LOCK_ENABLE | PLL_IFC_AM450K\
|PLL_TSAMPLE_FM10_24_AM64;
//IF Counter control 2
Radio.TunerBuff[6] = PLL_IFC_CENTER_450KHZ| PLL_IFC_EW_FM12_5_AM2K;
//Vco divder and pll reference
Radio.TunerBuff[14]=y01110101;
//SSTOP threshold
if(Radio.F_LocDx)
{
Radio.TunerBuff[23] &= 0x0F;
Radio.TunerBuff[23] += SSTOP_IFC_4_13V;
}
else
{
Radio.TunerBuff[23] &= 0x0F;
Radio.TunerBuff[23] += SSTOP_IFC_1_43V;
}
//IF gain
Radio.TunerBuff[19] &= 0xf9;//9dB in AM
if(start>5)start=5;
if(end<23)end=23;
}
if(end<32)
{
RadioTunerSend(start,end);
}
else
{
RadioTunerSend(start,31);
RadioTunerSend(32,end);
}
Radio.F_ForceSetBuff=0;
}
#endif
//Yete upgrade for TDA7541 on June-22-2007
#if TDA7541_TUNER
if(Radio.F_TDA7541)
{
start=29;
end=0;
if(Radio.F_ForceSetBuff||(FreqInFM(setfreq) && FreqInAM(Radio.Freq))||(FreqInAM(setfreq) && FreqInFM(Radio.Freq)))
{
if(FreqInFM(setfreq) && FreqInAM(Radio.Freq))//change to FM
{
EepromRead(TunerEepromAddress,10,30,&EepromBuff[0]);
}
if(FreqInAM(setfreq) && FreqInFM(Radio.Freq))//change to AM
{
EepromRead(TunerEepromAddress,70,30,&EepromBuff[0]);//Another setting for AM!!!!!!!Depend on EEPROM structure
}
for(i=0;i<30;i++)
Radio.TunerBuff[i]=EepromBuff[i];
Radio.TunerBuff[0]=(Radio.TunerBuff[0]&0x07)|TDA7541_PLL_LOCK_ENABLE|TDA7541_STEREO_MUTE_DISABLE|TDA7541_LOCAL_DISABLE|TDA7541_ASFC_NORMAL|TDA7541_SEEK_OFF;
Radio.TunerBuff[20]=(Radio.TunerBuff[20]&0xbf)|TDA7541_MPTC_ENABLE;
start=0;
end=29;
}
//PLL counter
if(FreqInJapanFM(setfreq))
{
pc=(setfreq-1070)/5-32;
}
else if(FreqInOirtFM(setfreq))
{
pc=(setfreq+1070)/1-32;
}
else if(FreqInWBFM(setfreq))
{
pc=(setfreq-2400)/25+6892;//PLL counter(162.400)=6892
}
else if(FreqInNormalFM(setfreq))
{
pc=(setfreq+1070)/5-32;
}
else
{
pc=(setfreq+10700)/1-32;
}
Radio.TunerBuff[1]=(unsigned char)(pc&0x00FF);
Radio.TunerBuff[2]=(unsigned char)((pc>>8)&0x00FF);
//TV2
Radio.TunerBuff[3]=GetTV2(setfreq);
//charge pump
if(FreqInFM(setfreq))
{
Radio.TunerBuff[0]=(Radio.TunerBuff[0]&0xf8)|Radio_PLL_FMISet(setfreq);
}
else
{
Radio.TunerBuff[0]=(Radio.TunerBuff[0]&0xf8)|Radio_PLL_AMISet(setfreq);
}
if(start>0)start=0;
if(end<3)end=3;
//Change to FM band from other band
if(FreqInFM(setfreq)
&& (FreqInAM(Radio.Freq)||Radio.F_ForceSetBuff))
{
//IF Counter control
//Register25-Disable expand mode of IF sampling time and error window
Radio.TunerBuff[25]=0xfe;
if(FreqInWBFM(setfreq))
Radio.TunerBuff[4]= (Radio.TunerBuff[4]&0x04)|TDA7541_PLL_TV_TRACK|TDA7541_PLL_TVOFFSET_ENABLE|TDA7541_PLL_TSAMPLE_FM20_48_AM128|TDA7541_PLL_IFC_EW_FM12_5_AM2K|TDA7541_FMMODE;
else
Radio.TunerBuff[4]= (Radio.TunerBuff[4]&0x04)|TDA7541_PLL_TV_TRACK|TDA7541_PLL_TVOFFSET_DISABLE|TDA7541_PLL_TSAMPLE_FM20_48_AM128|TDA7541_PLL_IFC_EW_FM12_5_AM2K|TDA7541_FMMODE;
//Vco divder and pll reference
if(FreqInOirtFM(setfreq))
Radio.TunerBuff[5]=(Radio.TunerBuff[5]&0xc0)|TDA7541_VCO_DIVIDER_3|TDA7541_VCO_PHASE_180|TDA7541_PLL_REFERECE_10KHz;
else if(FreqInJapanFM(setfreq))
Radio.TunerBuff[5]=(Radio.TunerBuff[5]&0xc0)|TDA7541_VCO_DIVIDER_3|TDA7541_VCO_PHASE_0|TDA7541_PLL_REFERECE_50KHz;
else if(FreqInWBFM(setfreq))
Radio.TunerBuff[5]=(Radio.TunerBuff[5]&0xc0)|TDA7541_VCO_DIVIDER_ORIGINAL|TDA7541_VCO_PHASE_180|TDA7541_PLL_REFERECE_25KHz;
else
Radio.TunerBuff[5]=(Radio.TunerBuff[5]&0xc0)|TDA7541_VCO_DIVIDER_2|TDA7541_VCO_PHASE_180|TDA7541_PLL_REFERECE_50KHz;
//filter/gain for weather band
if(FreqInWBFM(setfreq))
Radio.TunerBuff[11]=(Radio.TunerBuff[11]&0x0fd)|TDA7541_WB_ENABLE;
else
Radio.TunerBuff[11]=(Radio.TunerBuff[11]&0x0fd)|TDA7541_WB_DISABLE;
//IF gain and Q
//Radio.TunerBuff[14]=(Radio.TunerBuff[14]&0x0F)|TDA7541_IF2Q_R5k_FMQ3|TDA7541_IF2_GAIN_21;
//STD vco
//Radio.TunerBuff[23]=(Radio.TunerBuff[23]&0xdf)|TDA7541_STD_VCO_ON;
//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_FM2_1_AM3_5;
else
Radio.TunerBuff[10]= (Radio.TunerBuff[10]&0x0F)|TDA7541_SSTOP_IFC_FM1_1_AM2_0;
if(start>4)start=4;
if(end<25)end=25;
}
//Change to AM band from other band
else if(FreqInAM(setfreq)
&& (FreqInFM(Radio.Freq)||Radio.F_ForceSetBuff))
{
//IF Counter control
if(FreqInLWAM(setfreq))
{
//Registe25--enable expand mode error window for LW
Radio.TunerBuff[25]=0x7e;
Radio.TunerBuff[4]= (Radio.TunerBuff[4]&0x04)|TDA7541_PLL_TV_TRACK|TDA7541_PLL_TVOFFSET_DISABLE|TDA7541_PLL_TSAMPLE_FM10_24_AM64|TDA7541_PLL_IFC_EW_FM12_5_AM2K|TDA7541_AMMODE;
}
else
{
//Register25-Disable expand mode of IF sampling time and error window
Radio.TunerBuff[25]=0xfe;
Radio.TunerBuff[4]= (Radio.TunerBuff[4]&0x04)|TDA7541_PLL_TV_TRACK|TDA7541_PLL_TVOFFSET_DISABLE|TDA7541_PLL_TSAMPLE_FM10_24_AM64|TDA7541_PLL_IFC_EW_FM6_25_AM1K|TDA7541_AMMODE;
}
//Vco divder and pll reference
Radio.TunerBuff[5]=TDA7541_AM_PREDIVIDER_10|TDA7541_VCO_DIVIDER_2|TDA7541_VCO_PHASE_180|TDA7541_PLL_REFERECE_10KHz;
//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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -