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

📄 tea5757.c

📁 收音芯片TEA5757驱动!我不太懂
💻 C
📖 第 1 页 / 共 4 页
字号:
	        else
	        {
       	        reg1 = 0x40000 ;          //stereo is allowed
	        }       	 
		 if(fm_freq_step ==20 ) //200k   0x1EB= 0x1eb0>>4 
		 {
			   data1 = (((cur_fm_freq /fm_freq_step)+0x1EB)-(fm_freq_min/fm_freq_step)) ;  /*step :100k*/
			   data1 = data1<< 4 ;		  /* 6d6 0x7ac; 0x1eb0 ;		 87.5+10.7MHZ*/
               }
		 else if(fm_freq_step ==10 ) //step: 100k      0x3D6= 0x1eb0>>3 
	        {
		 	   data1 = (((cur_fm_freq /fm_freq_step)+0x3D6)-(fm_freq_min/fm_freq_step)) ;  /*step :100k*/
			   data1 = data1<< 3 ;		  /* 6d6 0x7ac; 0x1eb0 ;		 87.5+10.7MHZ*/
               }
		 else if(fm_freq_step ==5 )
		 {			               
			   data1 = (((cur_fm_freq /fm_freq_step)+0x7ac)-(fm_freq_min/fm_freq_step)) ;  /*step : 50k*/
			   data1 = data1<< 2 ;		  /* 6d6 0x7ac; 0x1eb0 ;		 87.5+10.7MHZ*/
		  }			               
		  data1 = reg1|data1 ;
	 }
	 else
	 {    
		   if (((cur_am_freq>=(am_freq_min+4*am_freq_step))&&(cur_am_freq<=(am_freq_min+5*am_freq_step)))||
			 ((cur_am_freq>=(am_freq_min+16*am_freq_step))&&(cur_am_freq<=(am_freq_min+19*am_freq_step)))||			 
			 ((cur_am_freq==(am_freq_min+22*am_freq_step)) || (cur_am_freq==(am_freq_min+29*am_freq_step)) ||			 
			 ((cur_am_freq>=(am_freq_min+40*am_freq_step))&&(cur_am_freq<=(am_freq_min+46*am_freq_step)))||
			 ((cur_am_freq>=(am_freq_min+50*am_freq_step))&&(cur_am_freq<=(am_freq_min+54*am_freq_step)))||			 			 			 
			 ((cur_am_freq>=(am_freq_min+60*am_freq_step))&&(cur_am_freq<=(am_freq_min+61*am_freq_step)))||			 
			 ((cur_am_freq>=(am_freq_min+66*am_freq_step))&&(cur_am_freq<=(am_freq_min+68*am_freq_step)))||			 			 			 
			 ((cur_am_freq>=(am_freq_min+72*am_freq_step))&&(cur_am_freq<=(am_freq_min+77*am_freq_step)))||
			 ((cur_am_freq>=(am_freq_min+86*am_freq_step))&&(cur_am_freq<=(am_freq_min+91*am_freq_step)))||			 
			 ((cur_am_freq>=(am_freq_min+102*am_freq_step))&&(cur_am_freq<=(am_freq_min+105*am_freq_step))) ||		 
			 ((cur_am_freq>=(am_freq_min+107*am_freq_step))&&(cur_am_freq<=(am_freq_min+111*am_freq_step))) ||		 			 
			 (cur_am_freq==(am_freq_min+81*am_freq_step))) )			 			 
		  {
                           CLEAR_FREQ_HOP;
            	  }
                else
                {
		             SET_FREQ_HOP;
		  }
		  reg1 = 0x500000 ;
		  data1 = cur_am_freq +0x3d5-am_freq_min;	/* 0.5 to 10Mhz ; step : 9k*/
	 	  data1 = reg1|data1 ;
	  }   
	  write_TEA5757(data1) ;        	        
}
  

/*******************************************************
	function: ,Write 24 bit to  TEA5757 
 
********************************************************/  
static void write_TEA5757(unsigned long data)
{
    unsigned char i;
    unsigned long temp1;
    CLEAR5757CLK ;
    CLEAR5757CE;
    SET5757CE;
    temp1=0x1000000;
    for(i=0;i<25;i++)               /* write 25 bit*/
    {      
        if(data & temp1)              /* high */
        {
            SET5757DI;
        }
        else
        {
            CLEAR5757DI;             /* low */
        }
        SET5757CLK;   
        wait_timer(500);
        CLEAR5757CLK;
        wait_timer(500);
        temp1=(temp1>>1);           /* left shift for test next bit of data */
    }
     wait_timer(500);
    CLEAR5757CE;                     /* end write */
    SET5757DI ;
    TRISTATE_5757DI;
     wait_timer(500);
}


/*******************************************************
	function: , Read out 24 bit from  TEA5757 to CPU
 
********************************************************/
static unsigned long read_TEA5757(void)
{
	 unsigned char i;
	 unsigned long temp;
	 unsigned long data1 ;
	 TRISTATE_5757DI;
	 CLEAR5757CLK ;
	  SET5757CE;
	 CLEAR5757CE;
	 data1 =0x800000 ;
	 temp=0x00;
	 for(i=0;i<24;i++)
	 {
		 SET5757CLK;
		 wait_timer(500);
		 if(TEA5757DI_IS_HIGH)
			 temp=(temp|data1); 	 
		 wait_timer(5000);
		 CLEAR5757CLK ;
		 wait_timer(500);
		 data1>>=1 ;
	 }
	 wait_timer(500);
	 SET5757CE; 				/* end read */
	 return temp;
}

 /***********************************************************
		 display rds program type 
********************************************************** */
void rds_pty_disp(void)    
{
   	 switch( Identify_Code)
    	 {
        	case 0:
            	     VFD_msg(VFDMSG_nonepty);
		      break;
	        case 1:
       	     VFD_msg(VFDMSG_news);
	            break;
	        case 2:
	            VFD_msg(VFDMSG_affairs);
	            break;
	        case 3:
	            VFD_msg(VFDMSG_info);
	            break;
	        case 4:
	            VFD_msg(VFDMSG_sport);
	            break;
	        case 5:
	            VFD_msg(VFDMSG_educate);
	            break;
	        case 6:
	            VFD_msg(VFDMSG_drama);
	            break;
	        case 7:
	            VFD_msg(VFDMSG_culture);
	            break;
	        case 8:
	            VFD_msg(VFDMSG_science);
	            break;
	        case 9:
	            VFD_msg(VFDMSG_varied);
	            break;
	        case 10:
	            VFD_msg(VFDMSG_popm);
	            break;
	        case 11:
	            VFD_msg(VFDMSG_rockm);
	            break;
	        case 12:
	            VFD_msg(VFDMSG_morm);
	            break;
	        case 13:
	            VFD_msg(VFDMSG_lightm);
	            break;
	        case 14:
	            VFD_msg(VFDMSG_classics);
	            break;
	        case 15:
	            VFD_msg(VFDMSG_otherm);
	            break;
	        case 16:
	            VFD_msg(VFDMSG_weather);
	            break;
	        case 17:
	            VFD_msg(VFDMSG_finance);
	            break;
	        case 18:
	            VFD_msg(VFDMSG_children);
	            break;
	        case 19:
	            VFD_msg(VFDMSG_social);
	            break;
	        case 20:
	            VFD_msg(VFDMSG_religion);
	            break;
	        case 21:
	            VFD_msg(VFDMSG_phonein);
	            break;
	        case 22:
	            VFD_msg(VFDMSG_travel);
	            break;
	        case 23:
	            VFD_msg(VFDMSG_leisure);
	            break;
	        case 24:
	            VFD_msg(VFDMSG_jazz);
	            break;
	        case 25:
	            VFD_msg(VFDMSG_country);
	            break;
	        case 26:
	            VFD_msg(VFDMSG_nationm);
	            break;
	        case 27:
	            VFD_msg(VFDMSG_oldies);
	            break;
	        case 28:
	            VFD_msg(VFDMSG_folkm);
	            break;
	        case 29:
	            VFD_msg(VFDMSG_document);
	            break;
	        case 30:
	            VFD_msg(VFDMSG_almtest);
	            break;
	        case 31:
	            VFD_msg(VFDMSG_alarm);
	            break;
	   }
}

/*************************************************************************
显示所接收到的RDS:

***************************************************************************/
void rds_disp(void)
{
         unsigned char i;
         if (fm_am_flag==TUNER_MODE_AM) 
         {
         	return;      
         }
         if(ServiceValidFlag)
	  {
	              ServiceValidFlag=0;
			VFD_service_name();	
			for(i=0;i<PS_BYTE;i++)
			{
				PS[i]=' ';
			}
         }	  
}

/************************************************************************
初始化RDS:

*************************************************************************/
void rds_init(void)
{       
       unsigned char i;    
	#ifdef NEW_RDS 
	word_counter=0;
	bit_counter=0;
	temp_bit_counter=0; 
	temp_word_counter=0;
	continue_check_flag=0;
	RDS_receive_flag=0; 
        for(i=0;i<PS_BYTE;i++)
        {
        	RdsServiceName[i]=0;        
        }	
	#else
       char  RDS_write[RDS_WRITE_BYTE];
	if (RdsID < 0)
	{
		 RdsID = I2C_config(RDS_ADDRESS, set_scl, set_sda,
					 sense_scl, sense_sda, rds_timing); 
	 }	 
	 RDS_write[0]=NWSY|RDS_SYSTEM|SYNCA|DAVA;
	 RDS_write[1]=PAUSE_LEVEL|FLYWHEEL;
	 RDS_write[2]=RDS_2W_BYTE;
	 RDS_I2C_arraywrite(RdsID, RDS_WRITE_BYTE, &RDS_write);
	 for (i=0;i<4;i++)
	 {
	 	Rds_char_index[i]=0;
	 }	 
        #endif
	 ServiceValidFlag=0;    
}		

#ifdef NEW_RDS
static unsigned int CalSyn(void)
{
	unsigned int i,SynIndex,Syndrome,TempBdata;

	SynIndex=25;
	Syndrome=0;
	TempBdata=Bdata;
	for(i=0;i<16;i++)
	{
		if(TempBdata&0x1)
		{
			Syndrome^=SynTable[SynIndex];
		}
		SynIndex--;
		TempBdata=TempBdata>>1;
	}

	TempBdata=(Bdata>>16);
	Syndrome^=TempBdata;
	return Syndrome;
}

static void rds_display_valid(void)
{
		unsigned char jump_show_flag=0;
		unsigned char i;
		
		jump_show_flag=0;
		for(i=0;i<PS_BYTE;i++)
		{
			if (RdsServiceName[i]==0)
			{
				jump_show_flag=1;
			}
		}
		if (!jump_show_flag)
		{                        		
			for(i=0;i<PS_BYTE;i++)
			{
				if (RdsServiceName[i]!=PS[i])
				{
					jump_show_flag=1;
				}
			}
			if (jump_show_flag)
			{
		   		 ServiceValidFlag=1;
				 for(i=0;i<PS_BYTE;i++)
				 {
					PS[i]=RdsServiceName[i];
				 }
			}
		}
		for(i=0;i<PS_BYTE;i++)
		{
			RdsServiceName[i]=0;
		}
		RDS_check_flag=1;													
		continue_check_flag=0;		
		
		word_counter=0;
		bit_counter=0;
		temp_bit_counter=0;
		temp_word_counter=0;					
}

void rds_check(void)
{
	unsigned int Syn;
       unsigned char server_name_char;
  
	TRISTATE_RDS_SDA;    
	if((RDS_receive_flag)&&(!RDS_check_flag))
	{
              while(1)
		{                     
			if(word_counter>=N_WORD-2)
			{        
                            rds_display_valid();						
				return;
                     }                                           
                     if(continue_check_flag)
                     {
	                  	continue_check_flag=0;
	                  	word_counter=temp_word_counter;
	                  	bit_counter=temp_bit_counter;
                     }                
                     Bdata=Bdata<<1;     
                    if((receive_data[word_counter]<<bit_counter)&0x80000000) 
                    {
                  	       Bdata|=0x01;
                    }
                    bit_counter++;
                    if(bit_counter>=32)
                    {
				word_counter++;
				bit_counter=0;
                    }
                   
                   if(RdsSync)
                   {
				RdsBitNo++;
				if(RdsBitNo==26)    
				{
					RdsBitNo=0;
					Syn=0x3ff&CalSyn();
					switch(RdsBlk)
					{
							case BLOCK_A:  						
									if(Syn==Syndrom_B)  
									{
										RdsBlk=BLOCK_B;
										/* get segment address */
										Bdata=Bdata>>10;
										RdsDecode=(Bdata&0x1f);
										/* get program type code */
										Bdata=Bdata>>5;
										/* get group type code */
										Bdata=Bdata>>7;
										RdsGrp=(Bdata&0x0f);
										RdsBeginFlag=1;
									}                                
									else
									{
										RdsSync=0;
										continue_check_flag=1;
									}
									break;
							case BLOCK_B:   /* Block B data received */
									if(Syn==Syndrom_C1) /* Check if Block C data is ready */
									{
										RdsBlk=BLOCK_C1;
									}
									else if(Syn==Syndrom_C2)
									{
										RdsBlk=BLOCK_C2;
									}
									else

⌨️ 快捷键说明

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