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

📄 radio.c

📁 车载DVD+tuner,意法半导体的方案. 纯C编写.
💻 C
📖 第 1 页 / 共 3 页
字号:
	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;

		/*Radio.TunerBuff[23] &= 0x0F;
		Radio.TunerBuff[18] &= y11000000;*/

		//SaveSmeterSlider=Radio.TunerBuff[18];
	
		start=0;
		end=39;
	}

	//PLL counter
	if(FreqInNormalFM(setfreq))
	{
		pc=(setfreq+1070)/5-32;
	}
	else if(FreqInOirtFM(setfreq))
	{
		pc=(setfreq+1070)/1-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
			Radio.TunerBuff[14]=y00100101;

		//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; 
			//Radio.TunerBuff[23] += SSTOP_IFC_1_97V;//KSE
		}

		//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(FreqInOirtFM(setfreq)&&(!FreqInOirtFM(Radio.Freq)))
	{
		Radio.TunerBuff[14] &= 0xFC;
		Radio.TunerBuff[14] |= 0x02;//VCO divider 3
		if(start>14)start=14;
		if(end<14)end=14;
	}
	else if((!FreqInOirtFM(setfreq))&&FreqInOirtFM(Radio.Freq))
	{
		Radio.TunerBuff[14] &= 0xFC;
		Radio.TunerBuff[14] |= 0x01;//VCO divider 2
		if(start>14)start=14;
		if(end<14)end=14;
	}*/
	
	if(FreqInNormalFM(setfreq)&&(!FreqInNormalFM(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;
	}

	if(end<32)
	{
		RadioTunerSend(start,end);
	}
	else
	{
		RadioTunerSend(start,31);
		RadioTunerSend(32,end);
	}
	Radio.Freq=setfreq;
	Radio.Band[Radio.CurrentBand].BandFreq=Radio.Freq;
	Radio.F_ForceSetBuff=0;

	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_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))
				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))
				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;
	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
}

/*********************************************
	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);
	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;
}

/*********************************************
	Function:		SeekOn
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:17
*********************************************/
void SeekOn(void)
{
	//seek on (ISS time constant)
	Radio.TunerBuff[0] |= 0x80;	
	RadioTunerSend(0,0);
	// enable IFC
  	 Radio.TunerBuff[5] |= 0x08;
   	RadioTunerSend(5,5);
	//adjust slider for seek
	SaveSmeterSlider=Radio.TunerBuff[18];
	if(FreqInFM(Radio.Freq)) 
	{	
		Radio.TunerBuff[18] &= y11000000;
		Radio.TunerBuff[18] += y00100000;
	} 
	else
	{	
		//AM short time constant
		Radio.TunerBuff[7] |= 0x01;
	       RadioTunerSend(7,7);
		Radio.TunerBuff[18] &= y11000000;
		//Radio.TunerBuff[18] += y00000011;
		Radio.TunerBuff[18] += y00101111;//KSE
	}
	RadioTunerSend(18,18);
	BreakAFCheck();
}

/*********************************************
	Function:		SeekOff
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:15
*********************************************/
void SeekOff(void)
{
	//seek off(ISS time constant)
	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);
}

/*********************************************
	Function:		RadioMute
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:14
*********************************************/
void RadioMute(unsigned char type)
{
	AudioMute(type);
}

/*********************************************
	Function:		PresetOrder
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:13
*********************************************/
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];
			}
		}

	}
}

/*********************************************
	Function:		RadioTunerSend
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:11
*********************************************/
void RadioTunerSend(unsigned char start, unsigned char end)
{
	unsigned char i;
  	I2CStart ();
  	I2COut8Bit(0xC4);
  	if(start==end)
		I2COut8Bit(start);
	else
		I2COut8Bit(start+0x40);
	for (i=start;i<=end; i++)
		I2COut8Bit(Radio.TunerBuff[i]);
	I2CStop();
}

/*********************************************
	Function:		RadioTunerRead
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:10
*********************************************/
void RadioTunerRead(void)
{
  	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(FreqInOirtFM(FMfreq))//ORIT
	return (PLL_HICURRENT_6MA);

	else//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_4MA);
		}
		return (PLL_HICURRENT_5MA);
	}
	
}

/*********************************************
	Function:		Radio_PLL_AMISet
	Description:	
	Write/Modify:	Yete
	Time:		2006-06-02
*********************************************/
unsigned char Radio_PLL_AMISet(unsigned int AMfreq)
{

	if (AMfreq < AM720KHZ)//LW MW
	{
		return (PLL_HICURRENT_3MA);
	}
	if (AMfreq < AM999KHZ)//MW
	{
		return (PLL_HICURRENT_4MA);
	}
	if (AMfreq < AM1404KHZ)
	{
		return (PLL_HICURRENT_5MA);
	}
	return (PLL_HICURRENT_6MA);

}

/*********************************************
	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--;
	
}

/*********************************************
	Function:		Radio100msTimer
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:08
*********************************************/
void Radio100msTimer(void)
{
	if(RadioWorkTimer>0)RadioWorkTimer--;
	if(AFTAShowTimer>1)AFTAShowTimer--;
	if(SeekKeyTimer>0)SeekKeyTimer--;
}

/*********************************************************
				File End
*********************************************************/

⌨️ 快捷键说明

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