📄 fmtuner.c
字号:
#include "reg52.h"
#include "intrins.h"
#include "custdef.h"
#include "i2c_comm.h"
#include "eeprom.h"
#include "fmtuner.h"
#include "kernel.h"
#include "audio_control.h"
#define FMTUNERWRITEADDRESS 0xB6
#define FMTUNERREADADDRESS 0xB7
#define TUNER_START 0x20
#define NO_MEM_MODE 0x00
#define MEM_MODE 0x01
#define AM_STEP_WIDTH 9 //9Khz
#define AM_MAX_FREQ 1620
#define AM_MIN_FREQ 522
#define AM_IF_FREQ 450
#define AM_MAX_COUNT ((AM_MAX_FREQ+AM_IF_FREQ)/AM_STEP_WIDTH)
#define AM_MIN_COUNT ((AM_MIN_FREQ+AM_IF_FREQ)/AM_STEP_WIDTH)
#define W40KHZ group1_00&=0xfc
#define W80KHZ group1_00&=0xfc,group1_00|=0x01
#define W120KHZ group1_00&=0xfc,group1_00|=0x02
#define W160KHZ group1_00&=0xfc,group1_00|=0x03
#define G0DB group1_00&=0xcf
#define GMINUS6DB group1_00&=0xcf,group1_00|=0x10
#define GPLUS7DB group1_00&=0xcf,group1_00|=0x20
#define GPLUS4DB group1_00&=0xcf,group1_00|=0x30
#define SET_FM_WIDTH W40KHZ
#define SET_FM_IF_GAIN GPLUS7DB
#define SET_FM_MODE group2_03&=0xfe
#define SET_AM_MODE group2_03|=0x01
#define SET_SD_SWITCH_ON group2_03|=0x02
#define SET_SD_SWITCH_OFF group2_03&=0xfd
#define SET_MONO_ON group2_03|=0x04
#define SET_MONO_OFF group2_03&=0xfb
#define SET_TUNER_MUTE_ON group2_03|=0x20
#define SET_TUNER_MUTE_OFF group2_03&=0xdf
#define SET_32MS group2_04&=0xf9
#define SET_64MS group2_04&=0xf9,group2_04|=0x02
#define SET_256MS group2_04&=0xf9,group2_04|=0x04
#define SET_512MS group2_04&=0xf9,group2_04|=0x06
#define SET_FM_GATE_TIME SET_64MS
#define LOCK_DETECT_ON group2_04|=0x01
#define LOCK_DETECT_OFF group2_04&=0xfe
#define SET_SD_BANDWIDTH_ON group2_04|=0x10
#define SET_SD_BANDWIDTH_OFF group2_04&=0xef
#define BAND25K group2_04&=0x1f
#define BAND37DOT5K group2_04&=0x1f,group2_04|=0x20
#define BAND50K group2_04&=0x1f,group2_04|=0x40
#define BAND62DOT5K group2_04&=0x1f,group2_04|=0x60
#define BAND75K group2_04&=0x1f,group2_04|=0x80
#define BAND87DOT5K group2_04&=0x1f,group2_04|=0xa0
#define BAND100K group2_04&=0x1f,group2_04|=0xc0
#define BAND112DOT5K group2_04&=0x1f,group2_04|=0xe0
#define SET_SD_BANDWIDTH BAND50K
#define SET_PLL1 group2_05&=0xfe
#define SET_PLL10 group2_05|=0x01
#define PLLDIVIDER01K group2_05&=0xf1
#define PLLDIVIDER03K group2_05&=0xf1,group2_05|=0x02
#define PLLDIVIDER05K group2_05&=0xf1,group2_05|=0x04
#define PLLDIVIDER09K group2_05&=0xf1,group2_05|=0x06
#define PLLDIVIDER10K group2_05&=0xf1,group2_05|=0x08
#define PLLDIVIDER125K group2_05&=0xf1,group2_05|=0x0a
#define PLLDIVIDER25K group2_05&=0xf1,group2_05|=0x0c
#define PLLDIVIDER50K group2_05&=0xf1,group2_05|=0x0e
#define SET_PLLDIVIDER PLLDIVIDER50K
#define SET_PLLDEADZONE group2_05|=0x10
//#define SET_PLLDEADZONE group2_05&=0xef // detector
#define SET_PLLCHARGEPUMP group2_05|=0x60
#define SET_FM_IF_AMP_STOP group2_0a &=0x7f
#define SET_FM_IF_AMP_START group2_0a |=0x80
#define SET_MONITER_PS group2_0a &=0xf8;group2_0a |=0x01
#define SET_MONITER_ANC group2_0a &=0xf8;group2_0a |=0x02
#define SET_MONITER_RED group2_0a &=0xf8;group2_0a |=0x03
#define SET_MONITER_F450 group2_0a &=0xf8;group2_0a |=0x04
#define SET_MONITER_NIFC group2_0a &=0xf8;group2_0a |=0x05
#define SET_MONITER_POINT SET_MONITER_NIFC
#define SET_IF_FREQ_ON group2_03|=0x02
#define SET_IF_FREQ_OFF group2_03&=0xfd
BYTE memory_status;
BYTE bandswitch; /*0,fm;1,am*/
BYTE st_mono; /*0--mono ; 1--st*/
BYTE fm_ch;
BYTE am_ch;
WORD ambak;
WORD fmbak;
WORD curfmfreq;
WORD curamfreq;
BYTE fmamflag;
static BYTE group1_00;
static BYTE group1_01;
static BYTE group1_02;
static BYTE group2_03;
static BYTE group2_04;
static BYTE group2_05;
static BYTE group2_0a;
BYTE search_station;
BYTE detect_station;
BYTE searchupordown;
BYTE found_ch;
BYTE found_station;
WORD code fmfreq[FM_MAX_MEM_BAND]=
{
0x7AC,0x7e0,0x880,0x920,0x946,0x7AC,0x7e0,0x880,0x920,0x946,
0x7AC,0x7e0,0x880,0x920,0x946,0x7AC,0x7e0,0x880,0x920,0x946,
0x7AC,0x7e0,0x880,0x920,0x946,0x7AC,0x7e0,0x880,0x920,0x946,
0x7AC,0x7e0,0x880,0x920,0x946,0x7AC,0x7e0,0x880,0x920,0x946
};// 87.5 90.1 98.1 106.1 108.0
WORD code amfreq[AM_MAX_MEM_BAND]=
{
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20,
0x1440,0x1620,0x1e30,0x2680,0x2b20
};//522 612 999 1400 1620
BYTE idata configvalue[]=
{
0xa8,// a8 IF 40Khz a9 IF 80Khz
0x45,
0x4f,
0x00,
0xc6,
0x1e,
0xde,
0x07,
0x00,
0x00,
0x80,
0x00,
0x00,
0x00,
0x00,
0x00
};
void Fmtuner_Read(BYTE subaddress,BYTE *databuffer, BYTE datalen)
{
I2C_Start();
I2C_WriteByte(FMTUNERWRITEADDRESS);
I2C_Ack();
I2C_WriteByte(subaddress);
I2C_Ack();
I2C_Start();
I2C_WriteByte(FMTUNERREADADDRESS);
I2C_Ack();
while(datalen!=1)
{
*databuffer=I2C_ReadByte();
I2C_Ack();
databuffer++;
datalen--;
}
*databuffer=I2C_ReadByte();
I2C_NoAck();
I2C_Stop();
}
void Fmtuner_Write(BYTE subaddress,BYTE *databuffer, BYTE datalen)
{
BYTE datanum,temp2;
BYTE pagei;
temp2=datalen;
for( pagei=0;pagei<=(datalen/8);pagei++)
{
if(temp2>8)
{
datanum=8;
temp2-=8;
}
else datanum=temp2;
if (pagei == 0)
{
I2C_Start();
I2C_WriteByte(FMTUNERWRITEADDRESS);
I2C_Ack();
I2C_WriteByte(subaddress);
I2C_Ack();
for(;datanum!=0;datanum--)
{
I2C_WriteByte(*databuffer);
I2C_Ack();
databuffer++;
}
I2C_Stop();
Delay_X_ms(10);
}
else
{
I2C_Start();
I2C_WriteByte(FMTUNERWRITEADDRESS);
I2C_Ack();
I2C_WriteByte(subaddress+pagei*8);
I2C_Ack();
for(;datanum!=0;datanum--)
{
I2C_WriteByte(*databuffer);
I2C_Ack();
databuffer++;
}
I2C_Stop();
Delay_X_ms(10);
}
}
}
void WriteToEeprom(BYTE stationnum, WORD wfreq)
{
BYTE temp,address;
if (fmamflag==0) // 0: fm 1:am
{
temp=wfreq &0xff;
address = stationnum*2+FM_STATION_START;
Eeprom_Write(address, &temp,1);
temp=(wfreq>>8)&0xff;
address = stationnum*2+1+FM_STATION_START;
Eeprom_Write(address, &temp,1);
}
else
{
temp=wfreq &0xff;
address = stationnum*2+AM_STATION_START;
Eeprom_Write(address, &temp,1);
temp=(wfreq>>8)&0xff;
address = stationnum*2+1+AM_STATION_START;
Eeprom_Write(address, &temp,1);
}
}
BYTE ReadFromEepromtest(BYTE stationnum)
{
WORD temp;
BYTE temp1,address;
temp=0;
if (fmamflag==0) // 0: fm 1:am
{
address=(stationnum)*2+1+FM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=temp1;
address=(stationnum)*2+FM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=((temp<<8)&0xff00)|temp1;
if ((temp < FM_MIN_COUNT) || (temp > FM_MAX_COUNT))
return 1;
}
else
{
address=(stationnum)*2+1+AM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=temp1;
address=(stationnum)*2+AM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=((temp<<8)&0xff00)|temp1;
if ((temp >= AM_MIN_COUNT) && (temp <= AM_MAX_COUNT))
ambak = temp;
else
return 1;
}
return 0;
}
BYTE ReadFromEeprom(BYTE stationnum)
{
WORD temp;
BYTE temp1,address;
temp=0;
if (fmamflag==0) // 0: fm 1:am
{
address=(stationnum)*2+1+FM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=temp1;
address=(stationnum)*2+FM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=((temp<<8)&0xff00)|temp1;
if ((temp >= FM_MIN_COUNT) && (temp <= FM_MAX_COUNT))
fmbak = temp;
else
return 1;
}
else
{
address=(stationnum)*2+1+AM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=temp1;
address=(stationnum)*2+AM_STATION_START;
Eeprom_Read(address,&temp1,1);
temp=((temp<<8)&0xff00)|temp1;
if ((temp >= AM_MIN_COUNT) && (temp <= AM_MAX_COUNT))
ambak = temp;
else
return 1;
}
return 0;
}
void Tuner_Init()
{
BYTE i;
for(i=0;i<FM_MAX_MEM_BAND-30;i++)
{
fmamflag=0; //0:fm, 1:am
WriteToEeprom(i+1,fmfreq[i]);
}
for(i=0;i<AM_MAX_MEM_BAND-30;i++)
{
fmamflag=1; //0:fm, 1:am
WriteToEeprom(i+1,amfreq[i]);
}
memory_status=NO_MEM_MODE;
fmamflag=0; //0:fm, 1:am
//fmbak = 0x07DE;// 90Mhz
//fmbak = 0x086c;// 97.1Mhz
fmbak=0x7AC; // 87.5
fm_ch=1;
ambak=0x1440; //522Khz
am_ch=1;
configvalue[3]&=0xFE; // fm
Set_Freq(fmbak);
Reset_Tuner_Config();
//Set_Station(1);
}
void Tuner_Select_FM()
{
fmamflag = 0;
configvalue[3]&=0xFE;
Fmtuner_Write(3, &configvalue[3], 1);
}
void Tuner_Select_AM()
{
fmamflag = 1;
configvalue[3]|=fmamflag;
Reset_Tuner_Config();
}
void Reset_Tuner_Config()
{
Fmtuner_Write(0x00,configvalue,sizeof(configvalue));
}
#if 0
BYTE Is_Stereo()
{
return 0;
}
#endif
//#define TEST_IF_COUNT
#ifdef TEST_IF_COUNT
extern BYTE if_count;
#endif
BYTE Is_Station()
{
BYTE temp;
BYTE retry_count;
//P3_2=1;
if (fmamflag == 0) // 0:fm 1:am
Set_Freq(fmbak);
else
Set_Freq(ambak);
configvalue[3] = 0x10;// Mute on
Reset_Tuner_Config();
found_station = 0;
//search_station = 0;
if (P3_2 == 0)
{
configvalue[2] = 0x02;// SD mode on
//Delay_X_ms(100);
Reset_Tuner_Config();
retry_count = 5;
while(--retry_count )
{
temp = 0x02;// must be this value
Fmtuner_Write(0x83, &temp, 1);
Delay_X_ms(100);
//if (P3_2 == 0)
{
Fmtuner_Read(0x00,&temp,1);
#ifdef TEST_IF_COUNT
if_count = temp&0xf;
#endif
if ((temp & 0x01)== 0x01)
{
search_station = 1;
found_station = 1;
configvalue[2] = 0x00;// SD mode off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -