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