📄 radio.c
字号:
}
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;
if(FreqInFM(Radio.Freq))
{
Radio.FMBand[FmIdx].BandFreq=Radio.Freq;
}
else
{
Radio.AMBand[AmIdx].BandFreq=Radio.Freq;
}
if(!RADIO_IN_PS)
{
if(FreqInFM(Radio.Freq))
{
for(i=0;i<6;i++)
{
if(Radio.Freq==Radio.FMBand[FmIdx].MemFreq[i])
{
Radio.FMBand[FmIdx].CurrentMem=i+1;
break;
}
if(i==5)Radio.FMBand[FmIdx].CurrentMem=0;
}
}
else
{
for(i=0;i<6;i++)
{
if(Radio.Freq==Radio.AMBand[AmIdx].MemFreq[i])
{
Radio.AMBand[AmIdx].CurrentMem=i+1;
break;
}
if(i==5)Radio.AMBand[AmIdx].CurrentMem=0;
}
}
}
RDSDataInit();
if(RDSDispMode!=RDSDISP_PTYSELECT&&RDSDispMode!=RDSDISP_TRAFFIC)
RDSDispMode=RDSDISP_IDLE;
}
/*********************************************
Function: RadioFreqCal
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:22
*********************************************/
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);
}
/*********************************************
Function: RadioSave
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:20
*********************************************/
void RadioSave(unsigned char pos)
{
unsigned char i;
if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
if(FreqInFM(Radio.Freq))
{
Radio.FMBand[FmIdx].CurrentMem=pos+1;
Radio.FMBand[FmIdx].MemFreq[pos]=Radio.Freq;
#ifdef D_STORE_DATA_IN_EEPROM
EepromRadioBuff[FmIdx*15+14] = pos + 1;
EepromRadioBuff[FmIdx*15 + 2*pos] = (Radio.Freq >> 8)&0xff;
EepromRadioBuff[FmIdx*15 + 2*pos + 1] = Radio.Freq & 0xff;
#endif
}
else
{
Radio.AMBand[AmIdx].CurrentMem=pos+1;
Radio.AMBand[AmIdx].MemFreq[pos]=Radio.Freq;
#ifdef D_STORE_DATA_IN_EEPROM
EepromRadioBuff[(AmIdx+3)*15+14] = pos + 1;
EepromRadioBuff[(AmIdx+3)*15 + 2*pos] = (Radio.Freq >> 8)&0xff;
EepromRadioBuff[(AmIdx+3)*15 + 2*pos + 1] = Radio.Freq & 0xff;
#endif
}
if(FreqInFM(Radio.Freq))
{
if(RDS.AFNum>1)
{
Radio.FMBand[FmIdx].PI[pos]=RDS.PIBackup;
if(RDS.AFNum>8)
Radio.FMBand[FmIdx].MemAFNum[pos]=8;
else
Radio.FMBand[FmIdx].MemAFNum[pos]=RDS.AFNum;
for(i=0;i<8;i++)
Radio.FMBand[FmIdx].MemAFList[pos][i]=RDS.AF[i];
}
else
{
Radio.FMBand[FmIdx].MemAFNum[pos]=0;
Radio.FMBand[FmIdx].PI[pos]=0;
}
}
Radio.F_TunerDispReq=1;
RDSDispTimer=1;//fixed for RDS PS display by yete at Sep 20,2006
#ifdef D_STORE_DATA_IN_EEPROM
for(i = 0; i < 75;i++){
EepromByteWrite(EEPROM_ADDR,RADIO_FREQ_FM_POS+i, EepromRadioBuff[i]);
Wait1ms(50);
}
#endif
}
/*********************************************
Function: RadioLoad
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:18
*********************************************/
void RadioLoad(unsigned char pos)
{
unsigned char i;
if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
RadioMute(SOFTON);
if(FreqInFM(Radio.Freq))
{
RadioSetFreq(Radio.FMBand[FmIdx].MemFreq[pos]);
}
else
{
RadioSetFreq(Radio.AMBand[AmIdx].MemFreq[pos]);
}
RadioMute(SOFTOFF);
if(FreqInFM(Radio.Freq))
{
Radio.FMBand[FmIdx].CurrentMem=pos+1;
}
else
{
Radio.AMBand[AmIdx].CurrentMem=pos+1;
}
if(RDS.F_AFEnable||RDS.F_TAEnable)
{
if(FreqInFM(Radio.Freq))
{
RDS.PI=Radio.FMBand[FmIdx].PI[pos];
RDS.PIBackup=RDS.PI;
RDS.AFNum=Radio.FMBand[FmIdx].MemAFNum[pos];
for(i=0;i<8;i++)
RDS.AF[i]=Radio.FMBand[FmIdx].MemAFList[pos][i];
if(RDS.AFNum>1)
{
SetAFSearch();
}
if(RDS.PIBackup!=0)
{
RDS.PISeekTimer=PISeek10msTimer;
}
}
}
Radio.F_TunerDispReq=1;
}
#ifndef NOT_SAVE_BAND_AF
void RDSSaveBandAF(void)
{
unsigned char i;
if(FreqInFM(Radio.Freq))
{
if(RDS.AFNum>1)
{
Radio.FMBand[FmIdx].BandPI=RDS.PIBackup;
if(RDS.AFNum>8)
Radio.FMBand[FmIdx].BandAFNum=8;
else
Radio.FMBand[FmIdx].BandAFNum=RDS.AFNum;
for(i=0;i<8;i++)
Radio.FMBand[FmIdx].BandAFList[i]=RDS.AF[i];
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -