?? si4702.c
字號:
#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喚醒處理完該處理的事之后繼續(xù)PowerDown
RTC_PowerDown();
}while(!g_bRTCInter);
//非RTC中斷喚醒,退出Powerdown
RTC_PowerResume();
((void (code *)(void))0x0000)();
}
Progressively_Volume(g_Setting.Globalsystem1.vol_val);
//循環(huán)消息處理
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:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -