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

📄 tea5757.c

📁 收音芯片TEA5757驱动!我不太懂
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
tea5757 tuner
*/
#include "common.h"
#include "mvd.h"
#include "rds.h"
#include "ioport.h"   
#include "amp.h"
#include "amp_port.h"
#include "TEA5757.h"
#include "i2c_prom.h"
#include "romconst.h"
#include "i2cdrv.h"
#include "amp_const.h"
#define wait_timer(x)	RISC_sleep_nsec(x)

static int  RdsID = -1; 
static uchar Identify_Code;
static uchar  Block_Status;
static int	prev_wcmd = 0; 
int PI_Code;
int RDS_Minutes;
uchar TP_Bit;
uchar TA_Bit;
uchar Text_AB_Flag;
uchar MusicSpeech_Bit;
uchar Version_Bit;
uchar RDS_Data_NonRead;
uchar PTY_Code;

unsigned char tuner_mode = 0 ;
unsigned char PS[PS_BYTE];
unsigned char RdsServiceName[PS_BYTE];

unsigned char ServiceValidFlag=0;
unsigned char rds_timeout;
unsigned char pty_avail_flag=0;     
unsigned char Rds_char_index[4];
unsigned char tuner_sensitive;
unsigned char tuner_preset_flag=0;

extern unsigned char tuner_program_timeout ;
extern unsigned char stereo_mono_flag ;
extern unsigned char memory_timeout;
#ifdef PHILIPS_GUI
extern unsigned char search_ante_flag;
#endif
/************* tea5757 parameter *************/
TUNER_PARA tuner_para[] = 
{
//fm step 100k,am step 10k
	{	/* mode usa */
		0x22,	/*fm-am SENSITIVITY*/

		8750,	/* fm para */
		10800,
		10,  /*rocksun change it to be 100K*/
		9710,

		530,	/* am para */
		1710,
		10,
		610,

		5,		/* am_freq_ref */
#ifdef TUNER_AM	
		{ 8750, 9010, 9810, 10610, 10800 },	/* fm freq */	
		{ 530, 610, 1000, 1400, 1710 }		/* am freq */
#else		
		{8750, 9010, 9810, 10610, 10800 }
#endif
	},	
//fm step 50k	,am step 9k
	{	/* mode europe */
		0x12,	

      		8750,	/* fm para */
        	10800,
        	5,
		9710,

        	531,	/* am para */
        	1602,
        	9,
		612,

		3,		/* am_freq_ref */
#ifdef TUNER_AM      		
             { 8750, 9010, 9810, 10610, 10800 },	/* fm freq */
             { 531, 612, 999, 1404, 1602 }		/* am freq */
#else		
	      {8750, 9010, 9810, 10610, 10800 }
#endif
	},
};
// rds text block define
static int rds_timing[] = {
        7000,   /* tAA     */
        6700,   /* tBUF    */
        4500,   /* tHD_STA */
        6700,   /* tSU_STA */
        6700,   /* tLOW    */
        4500,   /* tHIGH   */
           0,   /* tHD_DAT */
         500,   /* tSU_DAT */
        1000,   /* tR      */
         300,   /* tF      */
        6700,   /* tSU_STO */
         300,   /* tDH     */
     1000000    /* tWR     */
};

#ifdef NEW_RDS

unsigned int SynTable[]={
	0x200,      /* 10 0000 0000b ;m bit 5 */
	0x100,      /* 01 0000 0000b ;14 */
	0x80,       /* 00 1000 0000b ;13 */
	0x40,       /* 00 0100 0000b ;12 */
	0x20,       /* 00 0010 0000b ;11 */
	0x10,       /* 00 0001 0000b ;10 */
	0x08,       /* 00 0000 1000b ;9  */
	0x04,       /* 00 0000 0100b ;8  */
	0x02,       /* 00 0000 0010b ;7  */
	0x01,       /* 00 0000 0001b ;6  */
	0x2dc,      /* 10 1101 1100b ;5  */
	0x16e,      /* 01 0110 1110b ;4  */
	0x0b7,      /* 00 1011 0111b ;3  */
	0x287,      /* 10 1000 0111b ;2  */
	0x39f,      /* 11 1001 1111b ;1  */
	0x313,      /* 11 0001 0011b ;0  */
	0x355,      /* 11 0101 0101b ;c bit9 */
	0x376,      /* 11 0111 0110b ;8  */
	0x1bb,      /* 01 1011 1011b ;7  */
	0x201,      /* 10 0000 0001b ;6  */
	0x3dc,      /* 11 1101 1100b ;5  */
	0x1ee,      /* 01 1110 1110b ;4  */
	0x0f7,      /* 00 1111 0111b ;3  */
	0x2a7,      /* 10 1010 0111b ;2  */
	0x38f,      /* 11 1000 1111b ;1  */
	0x31b       /* 11 0001 1011b ;0 */
};
unsigned long int Bdata=0;
unsigned char RDS_receive_flag=0;  //0:wait receive,1:recieve finish
unsigned char RDS_check_flag=0;     //0:wait check ,1:check finish

unsigned char bit_counter=0;
unsigned char word_counter=0;
unsigned char temp_bit_counter=0;
unsigned char temp_word_counter=0;

unsigned char RdsSync=0;
unsigned char RdsBitNo=0;
unsigned char RdsGrp=0;
unsigned char RdsBlk=0;
unsigned char RdsDecode=0;
unsigned char RdsBeginFlag=0;
unsigned char Service_Disp_Flag=0;
unsigned char RdsServiceBak[8];        
unsigned char continue_check_flag=0;
unsigned long int receive_data[N_WORD];

static unsigned int CalSyn(void);
#endif
/***************variable define*********************/
unsigned char search_stop_flag=0;
unsigned char absolute_search_flag =0;
unsigned char auto_search_flag=0;
int fm_am_flag=TUNER_MODE_FM;
static short search_delay=200;

/******am******/
unsigned short am_freq_min;
unsigned short am_freq_max;
unsigned short cur_am_freq;
unsigned short am_freq_step;
unsigned short am_freq_ref;
/******fm******/
unsigned short fm_freq_min;
unsigned short fm_freq_max;
unsigned short cur_fm_freq;
unsigned short fm_freq_step;

unsigned short preset_up_down_mode; 

extern unsigned char audio_source;

static void freq_decrease(void);
static void freq_increase(void);
static void search_finish(void);
static unsigned char proc_find_station(void);

static unsigned short ReadStationFreqValue(unsigned char radio_station);
static void WriteFreqValue(unsigned char radio_station, unsigned short freq_value);
static unsigned short CheckFreqValue(unsigned short freq_value);
static void check_station();
static void check_frequency();
static void write_frequency() ;
static void write_TEA5757(unsigned long data);
static unsigned long read_TEA5757(void);
static void freq_init() ;
static void TEA5757_EPROM_init(void);
//////////////////////////////////////////////////

static void freq_decrease(void)
{
	if(fm_am_flag)
	{
		cur_fm_freq -=fm_freq_step;
	}
	else 
	{
		cur_am_freq -=am_freq_step;
	}
	check_frequency();
}

static void freq_increase(void)
{
	if(fm_am_flag)
	{
		cur_fm_freq += fm_freq_step;
	}
	else
	{
		cur_am_freq += am_freq_step;
	}
	check_frequency();	
}

void write_current_freq()
{
	if( TUNER_MODE_FM == fm_am_flag )
	{
		    write_freq_to_eeprom(CURRENT_FM_FREQ_ADDRESS);
	}
        else
        {
	 	     write_freq_to_eeprom(CURRENT_AM_FREQ_ADDRESS);    	
        }
}

void write_freq_to_eeprom(unsigned char radio_station)
{
	  unsigned short freq_value;			
	  if( fm_am_flag == TUNER_MODE_FM )
	  {	
		  freq_value = cur_fm_freq;
	  }
	  else	
	  {
	 	 freq_value = cur_am_freq;	 
	  }	
	  WriteFreqValue( radio_station, freq_value);
}

void read_freq_from_eeprom(unsigned char radio_station)
{
	 unsigned short freq_value;
	 freq_value = ReadStationFreqValue(radio_station);
	 if( fm_am_flag == TUNER_MODE_FM )
	 {
		 cur_fm_freq=freq_value;
	 }
	 else
	 {
		 cur_am_freq=freq_value;
	 }
}

static unsigned short ReadStationFreqValue(unsigned char radio_station)
{
	unsigned char freq_add;
	unsigned short freq_val1, freq_val2, return_freq;

	freq_add =  station_address +(radio_station - 1)* 2;
	freq_val1 = i2c_e2prom_byread(freq_add);
	freq_val2 = i2c_e2prom_byread(freq_add+1);
	return_freq = (freq_val1 << 8) | freq_val2;
	if( return_freq & 0x8000 )
	{
		fm_am_flag = TUNER_MODE_FM;
	}
	else
	{
		fm_am_flag = TUNER_MODE_AM;
	}
	i2c_e2prom_bywrite(FM_AM_FLAG_ADDRESS, fm_am_flag);
	return_freq = return_freq & 0x7fff;
	return_freq = CheckFreqValue(return_freq);
	return return_freq;
}

static void WriteFreqValue(unsigned char radio_station, unsigned short freq_value)
{
	unsigned char freq_add;
    
	freq_value = CheckFreqValue(freq_value);
	if( TUNER_MODE_FM == fm_am_flag )
	{
		freq_value = freq_value | 0x8000;
	}	
       if(radio_station!= CURRENT_FM_FREQ_ADDRESS && 
          radio_station!=CURRENT_AM_FREQ_ADDRESS)	
       {
       	  freq_add =  station_address + (radio_station - 1)* 2;
       }
	else 
	{
		 freq_add= radio_station; 	
	}
       i2c_e2prom_bywrite(freq_add, freq_value>>8);
       freq_value = freq_value & 0x0ff;
       i2c_e2prom_bywrite(freq_add+1, freq_value);	
}

/***************************************************************************
收音频率越界检查
****************************************************************************/
static unsigned short CheckFreqValue(unsigned short freq_value)
{
	 unsigned short cur_freq;
	 cur_freq = freq_value;
	 if( fm_am_flag == TUNER_MODE_FM )
	 {
		   if( (cur_freq < fm_freq_min) || (cur_freq > fm_freq_max  ) )
		   {
				cur_freq =fm_freq_min;
		   }
	 }
	 else
	 {
		   if( (cur_freq <am_freq_min) || (cur_freq > am_freq_max) )
		   {
				cur_freq = am_freq_min; 
		   }
	 }
	 return cur_freq;
}


/***************************************************************************
note: this function only call by fully auto search function.
****************************************************************************/	
extern unsigned char station_counter;
void auto_search_pause_station()
{
        freq_decrease();
        freq_increase();
        hand_tuner() ;
        delay_5ms();
        delay_5ms();
        hand_tuner() ;
        tdm_adc_turn_off();
        tdm_adc_turn_on();        
        tuner_current_freq_disp();
        write_current_freq();
}

/****************************************************************************
自动或全自动收台:

*****************************************************************************/
void tuner_auto_search_proc()  /**ziva ch 06-04*/
{
         extern  unsigned char vfd_osd_timeout;
         extern  unsigned char stop_RDS_display_timeout;
         
	  if(( auto_search_flag&0x80)||(absolute_search_flag&0x80))
         { 
	 	 mute_proc();
	 	 #ifdef M62446
	 	 M62446_mute();
	 	 #endif
           	 auto_search_flag &=0x03 ;
           	 if(auto_search_flag==2)   //ch 11-19
           	 {
                       freq_increase();
           	 }
               else
               {
           	 	  freq_decrease();
               }
               if(absolute_search_flag)
         	 {
              	 station_counter =STATION_MIN ;		 
			 fm_am_flag = TUNER_MODE_FM ;
			 cur_fm_freq = fm_freq_min-6*fm_freq_step ;//ziva ch 10-15                             
	               absolute_search_flag = 1 ;
       	        auto_search_flag =2 ;
              }  
              hand_tuner();
              hand_tuner();
        	delay_100ms();       
        	write_frequency() ; 
        	if (absolute_search_flag)
              {
               	VFD_msg(VFDMSG_auto_prog);
              }
        	else
              {
		       VFD_msg(VFDMSG_search);	
              }
              VFD_icon(VFDICON_dp_off);
              VFD_icon(VFDICON_clear_khz_mhz);
              search_stop_flag=0;
	       memory_timeout=0;
        }
	 while( auto_search_flag )
	 {	    
		if( search_delay )
		{
			search_delay --;
			break;
		}
		else
		{
			search_delay = 200;
		}      
              check_station();    
              ServiceValidFlag =0 ;

⌨️ 快捷键说明

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