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

📄 tea5757.c

📁 收音芯片TEA5757驱动!我不太懂
💻 C
📖 第 1 页 / 共 4 页
字号:
									{
										RdsSync=0;
										continue_check_flag=1;
									}
									break;
							case BLOCK_C1:  /* Block C is received */
							case BLOCK_C2:
									if(Syn==Syndrom_D)  /* Check if Block is ready */
									{
										RdsBlk=BLOCK_D;
										if(RdsBeginFlag==0) 
										{
											break;
										}
										if(RdsGrp==GrpType0)
										{
											server_name_char=(Bdata>>18);

											if (((server_name_char>='0')&&(server_name_char<='9'))||
											((server_name_char>='A')&&(server_name_char<='Z'))||
											((server_name_char>='a')&&(server_name_char<='z'))||
											( (server_name_char==0x20)||(server_name_char==0x00)||
											(server_name_char==0x27))|| 
											((server_name_char>=0x2c)&&(server_name_char<=0x2f)))
											{
												RdsServiceName[(RdsDecode&0x03)*2]=(Bdata>>18);
											}

											server_name_char= (Bdata>>10);  
											
											if (((server_name_char>='0')&&(server_name_char<='9'))||
											((server_name_char>='A')&&(server_name_char<='Z'))||
											((server_name_char>='a')&&(server_name_char<='z'))||
											( (server_name_char==0x20)||(server_name_char==0x00)||
											(server_name_char==0x27))|| 
											((server_name_char>=0x2c)&&(server_name_char<=0x2f)))
											{
												RdsServiceName[(RdsDecode&0x03)*2+1]=(Bdata>>10);
											}

											if((RdsDecode&0x03)==3 && word_counter>=N_WORD-2)
											{ 
								                            rds_display_valid();						
												return;
											}
										}
									}
									else 
									{
										RdsSync=0;
										continue_check_flag=1;
									}
									break;
							case BLOCK_D:   /* Block D is received */
									if(Syn==Syndrom_A)
									{
										RdsBlk=BLOCK_A;
									}
									else 
									{
										RdsSync=0;
										continue_check_flag=1;
									}
									break;
							 default:
									RdsSync=0;
									continue_check_flag=1;
									break;
					}
				}
                   }
                   else    /* sync is missed resync from group A */
                   {
				Syn=0x3ff&CalSyn();
				if(Syn==Syndrom_A)
				{
					 temp_bit_counter=bit_counter;
					 temp_word_counter=word_counter;					
					
				       RdsBlk=BLOCK_A;				
				       RdsSync=1;
					Bdata=0;									       
					RdsBitNo=0;					
				}
                  }
	     }
	}
}
#else
/***********************************************************************
检测RDS信号:

************************************************************************/
void rds_check(void)
{
		uchar  Data_Buffer[RDS_READ_BYTE];
		uchar static Group_Type;
		uchar RDS_Hour,RDS_Minute;
		int  RDS_Time_Offset;
		uchar i = 0;

		if (audio_source != SOURCE_TUNER || auto_search_flag || fm_am_flag == TUNER_MODE_AM) 
		{
			return;
		}
		TRISTATE_RDS_DAVN;
		
		if(cur_fm_freq >fm_freq_max ||cur_fm_freq<fm_freq_min)
		{
			cur_fm_freq=ReadAddrFreqValue(CURRENT_FM_FREQ_ADDRESS);
		}				
		if ((!RDS_DAVN_HGIGH)&&(RDS_Data_NonRead==TRUE))
		{ 			       
				RDS_I2C_arrayread(RdsID,RDS_READ_BYTE,&Data_Buffer);				
				Data_Buffer[0] = Data_Buffer[0] & 0xf3; //0xF7 ; // The Bit 3 is Don't Care
				if (Data_Buffer[0] !=BLOCK_INVAILD)
				{		   
					switch (Block_Status)
					{
						case BLOCK_A:
							if (Data_Buffer[0]==BLOCK_A)
							{
								if (Data_Buffer[5]==0x00)
								{
									PI_Code = ( ((int)Data_Buffer[1])<<8) | Data_Buffer[2];
								}
								Block_Status = BLOCK_B;
							}
							break;
			
						 case BLOCK_B:						
							if ((Data_Buffer[0]==BLOCK_B)&&(Data_Buffer[5]==0x00))
							{			
							       pty_avail_flag=1;    
								Version_Bit   = (Data_Buffer[1] & BIT_3);
								Group_Type	  = (Data_Buffer[1] >>4);
								TP_Bit		  = (Data_Buffer[1] & BIT_2);
								// High Byte: ( * * * * * P4 P3 )  ( P2 P1 P0 * * * * * ) : Low Byte
								PTY_Code	  = (((Data_Buffer[1]&0x03)<<3)|(Data_Buffer[2]>>5));
								Identify_Code = (Data_Buffer[2] & 0x1F);
								Block_Status=BLOCK_C;
							}
							else
							{
								Block_Status=BLOCK_A;
							}
							break;
			
						case BLOCK_C:
							if ((Data_Buffer[0]==BLOCK_C)||(Data_Buffer[0]==BLOCK_C1))
							{							
								Block_Status=BLOCK_D;
							}
							else
							{
								Block_Status=BLOCK_A;
							}
							break;
			
						case BLOCK_D:
							if ((Data_Buffer[0]==BLOCK_D)&&(Data_Buffer[5]==0x00))
							{  								   
								   rds_timeout=10;
								   switch (Group_Type)
								   {
									  case 0:
										TA_Bit = (Identify_Code & BIT_4);
										MusicSpeech_Bit = (Data_Buffer[1] & BIT_3);
										PS[(Identify_Code & 0x03) * 2	] = Data_Buffer[1];
										PS[(Identify_Code & 0x03) * 2 +1] = Data_Buffer[2];											
										Rds_char_index[Identify_Code & 0x03]=(Identify_Code & 0x03)+1;										
                                                                      if (Rds_char_index[0]==1 && Rds_char_index[1]==2 && 
                                                                          Rds_char_index[2]==3 && Rds_char_index[3]==4)
                                                                      {
												for (i=0;i<4;i++)
												{
							 						Rds_char_index[i]=0;
									 			}
												ServiceValidFlag =1;
                                                                      }
									       break;
									    case 2:
										 if (Version_Bit==VERSION_A)
										 {
												Text_AB_Flag =	(Identify_Code & BIT_4);
												Identify_Code = (Identify_Code & 0x0F) * 4	;//ziva del 09-09+ RDS_TEXT_TITLE;				
												if(Identify_Code<6)
												{
														if (Text_AB_Flag==TEXT_A)//ziva del 09-09
														{	
															RdsServiceName[Identify_Code++] = Data_Buffer[3];
															RdsServiceName[Identify_Code++] = Data_Buffer[4];
															RdsServiceName[Identify_Code++]= Data_Buffer[1];
															RdsServiceName[Identify_Code]= Data_Buffer[2];
														}//ziva del 09-09
														else // (Text_AB_Flag==TEXT_B)
														{
															RdsServiceName[Identify_Code++] = Data_Buffer[3];
															RdsServiceName[Identify_Code++] = Data_Buffer[4];
															RdsServiceName[Identify_Code++] = Data_Buffer[1];
															RdsServiceName[Identify_Code  ] = Data_Buffer[2];						
														}
		 							                  }
			 							 }
									
										 break;   
									   case 4:							   
										RDS_Hour   = ( (Data_Buffer[1] >> 4) | ((Data_Buffer[4]&0x01)<<4) );
										RDS_Minute = (((Data_Buffer[1]&0x0F)<<2)|(Data_Buffer[2]>>6));
										RDS_Time_Offset = (Data_Buffer[2] & 0x1F)*30;
										RDS_Minutes = ( RDS_Hour*60 + RDS_Minute );
										if ( Data_Buffer[2] & BIT_5 )
										{
											if (RDS_Minutes >= RDS_Time_Offset)
											{
												RDS_Minutes = RDS_Minutes-RDS_Time_Offset;
											}
											else
											{
												RDS_Minutes = RDS_Minutes + ONE_DAY_MINUTES - RDS_Time_Offset; 
											}
										}
										else
										{
											if ((RDS_Minutes + RDS_Time_Offset) < ONE_DAY_MINUTES)
											{
												RDS_Minutes = RDS_Minutes + RDS_Time_Offset;
											}
											else
											{
												RDS_Minutes = RDS_Minutes + RDS_Time_Offset - ONE_DAY_MINUTES; 
											}
									      }
									      break;
								        }			
							       }								
							       Block_Status=BLOCK_A;			
							       break;
						      default:
							       Block_Status=BLOCK_A;
							       break;
						 }
				  }
                  }
		    else if (RDS_DAVN_HGIGH)
		    {
				RDS_Data_NonRead = TRUE;
		    }
}		
#endif
/***********************************************************************
 初始设定各区域收音参数初始值:
             区域不同,对收音机参数指定也不同,
             指定区域,并取出该区域的初始参数值
************************************************************************/
static void freq_init() 
{
	      TUNER_PARA *p_tuner_para;	
	      unsigned short *p_freq;
	      int i;
	   
	      tuner_mode=read_e2prom(TUNER_MODE_ADDRESS);
	      if(tuner_mode>MAX_TUNER_MODE)
	      {
			write_e2prom(TUNER_MODE_ADDRESS, TUNER_USA);
			tuner_mode = TUNER_USA;
	      }

	      if (tuner_mode==TUNER_USA || tuner_mode==TUNER_AP_10K || tuner_mode==TUNER_LATAM_10K 
	      	  || (tuner_mode==TUNER_LATAM && read_e2prom(TUNER_9K_10K_STEP)==TUNER_10K)
	      )
	      {
			p_tuner_para =tuner_para; 
	      }
	      else
	      {
			p_tuner_para = tuner_para+1 ;
	      }
	   	    
	      fm_freq_min = p_tuner_para->fm_freq_min;
	      fm_freq_max = p_tuner_para->fm_freq_max;
	      fm_freq_step = p_tuner_para->fm_freq_step;
	      am_freq_min = p_tuner_para->am_freq_min;
	      am_freq_max = p_tuner_para->am_freq_max;
	      am_freq_step = p_tuner_para->am_freq_step;
	      am_freq_ref = p_tuner_para->am_freq_ref;	
	      tuner_sensitive=p_tuner_para->tuner_sensitive;
#ifdef TUNER_AM 	      
	      p_freq = p_tuner_para->fm_freq;	      
	      fm_am_flag = TUNER_MODE_FM;
	      for( i=1; i<6; i++ )
	      {
			cur_fm_freq = *p_freq ++;
			write_freq_to_eeprom(i);
		}
		for( i=11; i<26; i++ )
		{
			write_freq_to_eeprom(i);
		}
		cur_fm_freq = p_tuner_para->preset_fm_freq;
		write_current_freq();
		p_freq = p_tuner_para->am_freq;	
		fm_am_flag = TUNER_MODE_AM;
		for( i=6; i<11; i++ )
		{
				cur_am_freq = *p_freq ++;
				write_freq_to_eeprom(i);
		}
		for( i=26; i<41; i++ )
		{
				write_freq_to_eeprom(i);
		}
		cur_am_freq = p_tuner_para->preset_am_freq;
		write_current_freq();		
#else
	      p_freq = p_tuner_para->fm_freq;	      
	      fm_am_flag = TUNER_MODE_FM;
	      for( i=1; i<6; i++ )
	      {
			cur_fm_freq = *p_freq ++;
			write_freq_to_eeprom(i);
		}
	      for( i=6; i<41; i++ )
	      {
	       	write_freq_to_eeprom(i);
	      	}
		cur_fm_freq = p_tuner_para->preset_fm_freq;      
#endif              
              TEA5757_EPROM_init();
}	


/***********************************************************************
设定当前频率:
             将指点定地址的频率读取设定为当前频率
************************************************************************/
unsigned short ReadAddrFreqValue(unsigned char cur_addr)      
{
	unsigned short freq_val1, freq_val2, return_freq;
	freq_val1 = i2c_e2prom_byread(cur_addr);
	freq_val2 = i2c_e2prom_byread(cur_addr+1);
	return_freq = (freq_val1 << 8) | freq_val2;
	return_freq = return_freq & 0x7fff;
	if (cur_addr!=MIN_FM_FREQ_ADDRESS &&
	     cur_addr!=MAX_FM_FREQ_ADDRESS && 
	     cur_addr!=MIN_AM_FREQ_ADDRESS && 
	     cur_addr!=MAX_AM_FREQ_ADDRESS )
	{
		return_freq = CheckFreqValue(return_freq);
	}
	return return_freq;
}

/****************************************************************************
收音机初始化:
           取得上次收音状态时的值作为初始值
*****************************************************************************/
void TEA5757_init(void)
{
       int temp;	 
       unsigned char mode_change_flag;
       mode_change_flag= read_e2prom(TUNER_MODE_CHANGE_ADDR);
       if (mode_change_flag)
       {
              freq_init();
              write_e2prom(TUNER_MODE_CHANGE_ADDR,0);
       }
       fm_am_flag=TUNER_MODE_FM;
       fm_freq_step=read_e2prom(FM_FREQ_STEP_ADDRESS);    
	fm_freq_min=ReadAddrFreqValue(MIN_FM_FREQ_ADDRESS);
	fm_freq_max=ReadAddrFreqValue(MAX_FM_FREQ_ADDRESS);
	cur_fm_freq=ReadAddrFreqValue(CURRENT_FM_FREQ_ADDRESS);

	fm_am_flag=TUNER_MODE_AM;
	#ifdef TUNER_AM
       am_freq_step=read_e2prom(AM_FREQ_STEP_ADDRESS);    
	am_freq_min=ReadAddrFreqValue(MIN_AM_FREQ_ADDRESS);
	am_freq_max=ReadAddrFreqValue(MAX_AM_FREQ_ADDRESS);
	cur_am_freq=ReadAddrFreqValue(CURRENT_AM_FREQ_ADDRESS);		
	#endif
	#ifdef TUNER_AM
       fm_am_flag=(read_e2prom(FM_AM_FLAG_ADDRESS)>0?TUNER_MODE_FM:0);
	#else
	fm_am_flag=TUNER_MODE_FM;
	#endif	
	tuner_sensitive=(read_e2prom(TUNER_SENSITIVE) & 0x33);    
}

/********************************************************************
第一次收声机初始化:
                         初始化各收音量化值
**********************************************************************/
static void TEA5757_EPROM_init(void)
{
	 write_e2prom(TUNER_SENSITIVE,tuner_sensitive);	 	
	 write_e2prom(FM_AM_FLAG_ADDRESS,TUNER_MODE_FM);	 	 
	 
	 write_e2prom(CURRENT_FM_FREQ_ADDRESS,fm_freq_min>>8);
	 write_e2prom(CURRENT_FM_FREQ_ADDRESS1,fm_freq_min);

	 write_e2prom(FM_FREQ_STEP_ADDRESS,fm_freq_step );
	 write_e2prom(MIN_FM_FREQ_ADDRESS,fm_freq_min>>8);
	 write_e2prom(MIN_FM_FREQ_ADDRESS1,fm_freq_min);	 
	 
	 write_e2prom(MAX_FM_FREQ_ADDRESS,fm_freq_max>>8);
	 write_e2prom(MAX_FM_FREQ_ADDRESS1,fm_freq_max);	 	 
	 #ifdef TUNER_AM
	 write_e2prom(CURRENT_AM_FREQ_ADDRESS,am_freq_min>>8);
	 write_e2prom(CURRENT_AM_FREQ_ADDRESS1,am_freq_min);

	 write_e2prom(AM_FREQ_STEP_ADDRESS,am_freq_step );
	 write_e2prom(MIN_AM_FREQ_ADDRESS,am_freq_min>>8);
	 write_e2prom(MIN_AM_FREQ_ADDRESS1,am_freq_min);	 	 
	 
	 write_e2prom(MAX_AM_FREQ_ADDRESS,am_freq_max>>8);
	 write_e2prom(MAX_AM_FREQ_ADDRESS1,am_freq_max);	 	 
	 #endif 
}  

⌨️ 快捷键说明

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