📄 tea5757.c
字号:
{
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 + -