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

📄 si4702.c

📁 这段代码是驱动SI4702收音IC
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <BasType.h>
#include <RegDefs.h>
#include <HalForMcu.h>
#include <I2c.h>
#include <SI4702.h>
#include <Api_task.h>
//#include <TM1616.h>
#include <HalForMcu.h>
#include <Timer.h>
#include <Util.h>
#include <KeyDef.h>
//#include <IIC.h>
#include <Msg.h>
#include  <PT2313.h>
#include <lcd_lib.h>
#include <TM1721.h>
#include <PlayCtrl.h>
//#include <HT1621.h>
#include <GlobalVar.h>
#include <UITimeOut.h>
#include <RTC_Ctrl.h>

extern BOOL g_bRTCInter;
extern GlobalSettings  g_Setting;
extern PDATE_TIME xdata    PSYSTIME;

UINT8 RSSI_DATA[7]={12,9,17,20,10,1,1};
UINT8 READCHAN_DATA[7]={0,0,0,0,0,0,0};
UINT8 ValueHex_Low = 0;
UINT8 ValueHex_High = 0;
UINT16 TimeCount1;
UINT16 ScandickCount=0;
UINT8 ScandickCountTemp;
UINT8 Modeval2;
UINT8 VolumeCount;
 UINT8 Vtemp;
 UINT8 VolumeCountTemp;
//UINT8  voltemp=50;
bit FristMuteFlag=FALSE;
bit FristDisMuteFlag=FALSE;
bit RadioTempFlag=TRUE;
//extern UINT8 nTaskID;
//UINT8		Data_writes[12]={0x40,0x01,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x38,0xbc,0x04};
UINT8 Data_writes[12]={0x40,0x01,0x00,0x00,0x00,0x00,0x0c,0x10,0x00,0x38,0xbc,0x04};
#define 	SET_DSMUTE_1	Data_writes[0] |=0x80
#define 	SET_DSMUTE_0	Data_writes[0] &=0x7F

#define	SET_DMUTE_1	Data_writes[0] |=0x40
#define 	SET_DMETE_0	Data_writes[0] &=0xBF

#define	SET_MONO_1	Data_writes[0] |=0x20
#define	SET_MONO_0	Data_writes[0] &=0xDF

#define	SET_RDSM2_1	Data_writes[0] |=0x08
#define	SET_RDSM2_0	Data_writes[0] &=0xF7

#define	SET_SKMODE_1	Data_writes[0] |=0x04
#define	SET_SKMODE_0	Data_writes[0] &=0xFB

#define	SET_SEEKUP_1	Data_writes[0] |=0x02
#define	SET_SEEKUP_0	Data_writes[0] &=0xFD

#define	SET_SEEK_1		Data_writes[0] |=0x01
#define	SET_SEEK_0		Data_writes[0] &=0xFE

#define	SET_DISABLE_1	Data_writes[1] |=0x40
#define	SET_DISABLE_0	Data_writes[1] &=0xBF

#define	SET_ENABLE_1	Data_writes[1] |=0X01
#define	SET_ENABLE_0	Data_writes[1] &=0xFE

UINT8    Data_read[4];
#define STC		Data_read[0] & 0x40

#define SF_BL	Data_read[0] & 0x20

#define AFCRL	Data_read[0] & 0x10

#define ST		Data_read[0] & 0x80
#define RSSI		Data_read[1] & 0xFF
/**
功能:4702选择I2C通讯
**/
void SI4702_Select_2wire()
	{
	sfr_USB_CONTROL &=0xFB;// i2c close
	sfr_GPIOB_DIRECTION &=0xd4;//b2,b3,b6,b7 out

	SI4702_SEN_1();
	SI4702_SDIO_0();
	SI4702_RST_0();
	SI4702_SCLK_1();
	delay_us(150);
	SI4702_RST_1();
	delay_us(70);
	SI4702_SDIO_1();
	delay_us(70);
	
	sfr_USB_CONTROL |=0x04;//I2C OPEN
	}

/**
功能:4702初始化
**/
void SI4702_Init()
	{
	//UINT8 Data_writes1[12]={0x40,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,0x81,0x00};
	UINT8 Data_writes1[12]={0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x81,0x00};
	//UINT8 Data_writes2[8]={0x40,0x01,0x00,0x00,0x00,0x00,0xfe,0x1f};
	UINT8 Data_writes2[8]={0x40,0x01,0x00,0x00,0x00,0x00,0x3f,0x1f};

	SI4702_Select_2wire();
	
	I2C_WritePageDataEx(SI4702_adr, Data_writes1, 12, 0, FALSE);
	//IIC_SetRegs(SI4702_adr, Data_writes1, 12);
	delay_ms(200);
	delay_ms(200);
	FeedWDT(250, 30);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	//FeedWDT(100, 50);
	delay_ms(200);
	delay_ms(200);
	FeedWDT(250, 30);
	I2C_WritePageDataEx(SI4702_adr, Data_writes2, 8, 0, FALSE);
	//IIC_SetRegs(SI4702_adr, Data_writes2,8);
	delay_ms(200);
	delay_ms(200);
	//Data_writes[12]={0x40,0x01,0x00,0x00,0x00,0x00,0x0c,0x1f,0x00,0x38,0xbc,0x04};
	SET_DISABLE_0;
	SET_ENABLE_1;
	//FeedWDT(100, 50);
	//IIC_SetRegs(SI4702_adr, Data_writes, 12);
	I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	delay_ms(200);
	delay_ms(200);
	}

void SI4702_SetCurFreq(UINT16 Freq)
	{
	UINT16 Freq_temp;
	g_Setting.GlobalFLAG.DispTimeFlag=0;
	//CloseWDT();
	//delay_ms(1);
	//Hal_DisableAllInts();
	if(Freq>Freq_US_max)
		Freq=Freq_US_min;
	if(Freq<Freq_US_min)
		Freq=Freq_US_min;
	Freq_temp=(Freq-Freq_US_min)/STep_100k;
	
	//Data_writes[2] &=0x7F;//TUNE=0
	//I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	ValueHex_Low = Freq_temp & 0xff;
	Freq_temp >>= 8;
	ValueHex_High = Freq_temp & 0xff;
	
	
	Data_writes[3] = ValueHex_Low;
	//Data_writes[2] |= 0x80;//TUNE=1 
	//Data_writes[2] |= ValueHex_High;

	//I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	//delay_ms(200);
	Data_writes[2] |= 0x80;//TUNE=1 
	I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	//IIC_SetRegs(SI4702_adr, Data_writes, 12);
	delay_ms(600);
	
	Data_writes[2] &=0x7F;//TUNE=0
	//Data_writes[3]=0;
	I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	//IIC_SetRegs(SI4702_adr, Data_writes, 12);
		delay_ms(200);
		SI4702_Read();

	//while(STC){
	//	SI4702_Read();
	Si4702_WriteChan(7);//每改变一次就村一次
		delay_ms(200);
	//	}
		
	//Hal_EnableAllInts();
	//IintWDT();
	//FeedWDT(100, 100);
	}

void SI4702_ChangeCurFreq(UINT8 Direct)
	{
	if(Direct == Direction_UP)	/*向上搜台*/
	g_Setting.Globalsystem1.g_CurFreq += STep_100k;
	 if(Direct == Direction_Down)					/*向下搜台*/
		g_Setting.Globalsystem1.g_CurFreq -= STep_100k;

		if(g_Setting.Globalsystem1.g_CurFreq > Freq_US_max)
			g_Setting.Globalsystem1.g_CurFreq = Freq_US_min;
		if(g_Setting.Globalsystem1.g_CurFreq < Freq_US_min)
			g_Setting.Globalsystem1.g_CurFreq = Freq_US_max;

	SI4702_SetCurFreq(g_Setting.Globalsystem1.g_CurFreq);
	}

void SI4702_Read()
	{
	I2C_ReadPageDataEx(SI4702_adr, Data_read, 4, 0, FALSE);
	//IIC_GetRegs(SI4702_adr, Data_read, 4);
	delay_ms(10);
	}
bit SI4702_AutoChangeFreq(UINT8 Direct)
	{
	#define IIC_TRY_TIMES	500
	MSG		keymsg2;
    	UINT16 ix=0;
	UINT16 TempFreq;
	UINT8 StoreSF_BL,StoreSTC;
	bit ChangeOK=FALSE;
	//Hal_DisableAllInts();
	g_Setting.GlobalFLAG.DispTimeFlag=0;
	if(g_Setting.Globalsystem1.g_CurFreq>Freq_US_max  || g_Setting.Globalsystem1.g_CurFreq<Freq_US_min)
		{
		g_Setting.Globalsystem1.g_CurFreq=Freq_US_min;
		SI4702_SetCurFreq(g_Setting.Globalsystem1.g_CurFreq);
		}
	TempFreq=g_Setting.Globalsystem1.g_CurFreq;
	Mute_Enable();
	while(1)
		{
		//FeedWDT(250, 20);
		Data_writes[0] |=0x04;//SET_SKMODE_1;
		Data_writes[0] |=0x01;//SET_SEEK_1;
		if(Direct)
			SET_SEEKUP_1;
		else
			SET_SEEKUP_0;
		delay_ms(20);
		//DelayInMs(200);
		I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
		//IIC_SetRegs(SI4702_adr, Data_writes, 2);
		delay_ms(40);
		//IIC_GetRegs(SI4702_adr, Data_read, 4);
		I2C_ReadPageDataEx(SI4702_adr, Data_read, 4, 0, FALSE);
		StoreSTC=Data_read[0] & 0x40;
		StoreSF_BL=Data_read[0] & 0x20;
		g_Setting.Globalsystem1.g_CurFreq=Data_read[3]+875;
		//delay_ms(200);
		g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;
		UI_FM(g_Setting.Globalsystem1.Dispstatus_fm);
		//TM1616_Display();
		if(StoreSTC)
			{
			SET_SEEK_0;
			I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
			//IIC_SetRegs(SI4702_adr, Data_writes, 2);
			g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;
			if(StoreSF_BL==0 )
				{
				SET_SEEK_0;
				I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
				//IIC_SetRegs(SI4702_adr, Data_writes, 2);
				ChangeOK=TRUE;
				}
			}
		
		delay_ms(100);
		//delay_ms(200);
		//FeedWDT(100, 50);
		delay_ms(100);
		//delay_ms(200);
		
		keymsg2=GetMessage();
	
			switch(keymsg2)
				{
				case KEY_PREV:
					
					//	SI4702_ChangeCurFreq(1);
						ChangeOK=TRUE;
					break;
			
				case KEY_NEXT:
				
					ChangeOK=TRUE;
					break;
				default:
					break;
					}
		if ( (ChangeOK==1)|| (ix>IIC_TRY_TIMES)) //条件成立或超时退出
			{
			SET_SEEK_0;
			I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
			//IIC_SetRegs(SI4702_adr, Data_writes, 2);
			g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;
			//TM1616_Display();
			Si4702_WriteChan(7);
			Mute_Disable();
			return TRUE;
			}
		else
			ix++;

		//delay_ms(200);
		}
	
	}
bit SI4702_Scan()
	{
	#define IIC_TRY_TIMES	500
	MSG		keymsg2;
    	UINT16 ix=0;
	UINT8 COUNTTEMP;
//	UINT16 TempFreq;
	UINT8 StoreSF_BL,StoreSTC;
	bit ChangeOK1=FALSE;
	g_Setting.GlobalFLAG.DispTimeFlag=0;
	for(COUNTTEMP=0;COUNTTEMP<7;COUNTTEMP++)
		{
		RSSI_DATA[COUNTTEMP]=1;
		READCHAN_DATA[COUNTTEMP]=0;
		}
	//TempFreq=SYS.g_CurFreq;
	BBPCALL();
	Mute_Enable();
	SI4702_SetCurFreq(875);
	while(1)
		{
		FeedWDT(250, 20);
		//SysIdleProc();
		SET_SKMODE_1;
		SET_SEEK_1;
		SET_SEEKUP_1;
		//Data_writes[3]=0;
		//DelayInMs(200);
		//IIC_SetRegs(SI4702_adr, Data_writes, 2);
		I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
		delay_ms(50);
	
		//IIC_GetRegs(SI4702_adr, Data_read, 4);
		I2C_ReadPageDataEx(SI4702_adr, Data_read, 4, 0, FALSE);
		StoreSTC=Data_read[0] & 0x40;
		StoreSF_BL=Data_read[0] & 0x20;
		
		g_Setting.Globalsystem1.g_CurFreq=Data_read[3]+875;

		g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;
		UI_FM(g_Setting.Globalsystem1.Dispstatus_fm);
		if(StoreSTC)
			{
			SET_SEEK_0;
			I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
			//IIC_SetRegs(SI4702_adr, Data_writes, 2);
			g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;

			if(StoreSF_BL==0 )
				{
			
				SET_SEEK_0;
				I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
				//IIC_SetRegs(SI4702_adr, Data_writes, 2);
				RSSI_DATA[5]=RSSI;
				READCHAN_DATA[5]=Data_read[3];
				BubbleSort(RSSI_DATA, READCHAN_DATA, 6);
				for(COUNTTEMP=0;COUNTTEMP<6;COUNTTEMP++)
					{
					if(g_Setting.Globalsystem1.RadioBand==1)
						{
					I2C_Write_8bitROG(EEprom_Adr, EEprom_band1+(COUNTTEMP*2), READCHAN_DATA[COUNTTEMP]);
						}
					if(g_Setting.Globalsystem1.RadioBand==2)
						{
					I2C_Write_8bitROG(EEprom_Adr, EEprom_band2+(COUNTTEMP*2), READCHAN_DATA[COUNTTEMP]);
						}
					if(g_Setting.Globalsystem1.RadioBand==3)
						{
					I2C_Write_8bitROG(EEprom_Adr, EEprom_band3+(COUNTTEMP*2), READCHAN_DATA[COUNTTEMP]);
						}
					delay_ms(20);
					}
				}
			}
		
		delay_ms(200);
		keymsg2=GetMessage();
		
			switch(keymsg2)
				{
				case KEY_NEXT:	
					ChangeOK1=TRUE;
					break;
			
				case KEY_PREV:

					ChangeOK1=TRUE;
					break;
				case KEY_AS_PS:
					ChangeOK1=TRUE;
					break;
				default:
					break;
				}
		
		if(g_Setting.Globalsystem1.g_CurFreq==875)
			ChangeOK1=1;
		if ( (ChangeOK1==1)|| (ix>IIC_TRY_TIMES)) //条件成立或超时退出
			{
			SET_SEEK_0;
		I2C_WritePageDataEx(SI4702_adr, Data_writes, 2, 0, FALSE);
			//IIC_SetRegs(SI4702_adr, Data_writes, 2);
			g_Setting.Globalsystem1.Dispstatus_fm=disp_Freq;
			Get_Chan(0);
			g_Setting.GlobalFLAG.MuteFlag=0;
			Mute_Disable();
			return TRUE;
			}
		else
			ix++;
		}
	
	}

void Get_Chan(UINT8 chan)
	{
	UINT8 CHAN_TEMP;
	UINT8 Temp_EEprom1,Temp_EEprom2;
	if(g_Setting.Globalsystem1.RadioBand==1)
		{
		Temp_EEprom1=EEprom_band1_CurFreq;
		Temp_EEprom2=EEprom_band1;
		}
	if(g_Setting.Globalsystem1.RadioBand==2)
		{
		Temp_EEprom1=EEprom_band2_CurFreq;
		Temp_EEprom2=EEprom_band2;
		}
	if(g_Setting.Globalsystem1.RadioBand==3)
		{
		Temp_EEprom1=EEprom_band3_CurFreq;
		Temp_EEprom2=EEprom_band3;
		}
	if(chan==7)
		CHAN_TEMP=I2C_Read_8bitROG(EEprom_Adr, Temp_EEprom1);
	else
		CHAN_TEMP=I2C_Read_8bitROG(EEprom_Adr, Temp_EEprom2+(chan*2));
		
	g_Setting.Globalsystem1.g_CurFreq=CHAN_TEMP+875;
	if(g_Setting.Globalsystem1.g_CurFreq>1080)
		g_Setting.Globalsystem1.g_CurFreq=875;
	if(g_Setting.Globalsystem1.g_CurFreq<875)
		g_Setting.Globalsystem1.g_CurFreq=875;
	SI4702_SetCurFreq(g_Setting.Globalsystem1.g_CurFreq);
	}
void BubbleSort(UINT8 *pData1,UINT8 *pData2,UINT8 Count) 
	{ 
	UINT8 iTemp1,iTemp2; 
	UINT8 i,J;
	for( i=1;i<Count;i++) 
	{ 
	for(J=Count-1;J>=i;J--) 
		{ 
		if(pData1[J]>pData1[J-1]) 
			{ 
			iTemp1 = pData1[J-1]; 
			pData1[J-1] = pData1[J]; 
			pData1[J] = iTemp1; 
			
			iTemp2=pData2[J-1];
			pData2[J-1]=pData2[J];
			pData2[J]=iTemp2;
			} 
		} 
	} 
} 
/**
void SI4702_close()
	{
	SET_DISABLE_1;
	SET_ENABLE_0;
	I2C_WritePageDataEx(SI4702_adr, Data_writes, 12, 0, FALSE);
	}
**/
UINT8 FM_TaskEntrance(void)
	{
	MSG		CurMsg;
	//SYS.DispTimeFlag=0;
	//SYS.Dispstatus=disp_Freq;
	SI4702_Init();
	//SI4702_SetCurFreq(SYS.g_CurFreq);
	if(g_Setting.GlobalFLAG.EEPROMOKFlag)
		g_Setting.Globalsystem1.RadioBand=I2C_Read_8bitROG(EEprom_Adr, EEprom_RadioBand);
	else
		g_Setting.Globalsystem1.RadioBand=1;
	//Get_Chan(7);
	/**
	delay_ms(100);
	InitPt2313(0x46);
	delay_ms(50);
	**/
	SelectINChannel(g_Setting.Globalsystem1.nTaskID);//选择声道
	//Mute_Disable();
	//SetVolume(SYS.vol_val);
	Get_Chan(7);
	while(1)
	{
	sfr_GPIOB_DIRECTION |=0x02;  
	delay_us(2);
		if((sfr_GPIOB_DATA & 0x02))
			{
			Player_SendCmd(MPI_STOP,0);
			DelayInMs(200);	
			Hal_StopTimer1();
			RTC_PrePowerDown();
			g_bRTCInter = FALSE;

			RTC_PowerDown();
			do{ 
				//g_bRTCInter = FALSE;
				//if(!(sfr_GPIOB_DATA & 0x02))
				//	{
   				//	g_bRTCInter = TRUE;                 
				//	}
			   	//PowerDown后由RTC唤醒时需要处理的事情可以在此处理 
				RTC_GetTime(PSYSTIME);
				//RTC唤醒处理完该处理的事之后继续PowerDown
				RTC_PowerDown();
			}while(!g_bRTCInter);
			//非RTC中断唤醒,退出Powerdown
			RTC_PowerResume();
			((void (code *)(void))0x0000)();
			}
	Progressively_Volume(g_Setting.Globalsystem1.vol_val);
	//循环消息处理
	FeedWDT(250, 20);
	/**
	if(SYS.WritePositionFlag)
		{
		//Write_Position();
		Write_check_byte();
		SYS.WritePositionFlag=0;
		}
		**/
		/**
	if(g_Setting.GlobalFLAG.ACConFLAG==0)
			{
			g_Setting.Globalsystem1.nTaskID=TASK_STANDBY;
			return g_Setting.Globalsystem1.nTaskID;
			}
			**/
	ScandickCountTemp=5;
	if((++ ScandickCount)%ScandickCountTemp== 0)
		{
		ScanDisk();
		ScandickCount=1;
		}
	if(g_Setting.GlobalFLAG.USB_InFlag)
		g_Setting.GlobalICON.Icon_usb=1;
	else
		g_Setting.GlobalICON.Icon_usb=0;
	if(g_Setting.GlobalFLAG.SD_InFlag)
		g_Setting.GlobalICON.Icon_SD=1;
	else
		g_Setting.GlobalICON.Icon_SD=0;
	if(g_Setting.GlobalFLAG.MediaPluINFlag)
		{
		Si4702_WriteChan(7);
		g_Setting.GlobalFLAG.MediaPluINFlag=0;
		g_Setting.Globalsystem1.nTaskID=TASK_MUSIC;
		return g_Setting.Globalsystem1.nTaskID;
		}
	CurMsg = GetMessage();
	
	switch(CurMsg)
			{
				case KEY_CH:
					if(g_Setting.GlobalFLAG.NOMediaFlag==0)
						{
						Si4702_WriteChan(7);
						g_Setting.Globalsystem1.nTaskID=TASK_MUSIC;
						return g_Setting.Globalsystem1.nTaskID;
						}
					break;
				case KEY_PWR_LONG:
					if(sfr_GPIOA_DATA & 0x01)
						{
						SYSPowerDown();
						g_Setting.Globalsystem1.nTaskID=TASK_STANDBY;
						return g_Setting.Globalsystem1.nTaskID;
						}
						break;
				case KEY_AS_PS:
						SI4702_Scan();
					break;
				case KEY_SCAN:

⌨️ 快捷键说明

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