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

📄 复件 rda5800.c

📁 mega8控制的FM(RDA5800)。
💻 C
📖 第 1 页 / 共 2 页
字号:
		} 
	} 

	// 发送STOP信号// 
	TWCR = 1<<TWINT | 1<<TWSTO | 1<<TWEN; 
	while ( (TWCR & (1<<TWSTO)) !=0 );
	while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
	UDR=4; 
	TWCR = 0; 
	// 调整端口设置,设置为高电平输出 // 
	DDRC |= 1<<PC5 | 1<<PC4; 
	// 成功发送完毕,返回0 // 
	UDR=11;
	return 0; 
} 
#endif

Rda5800_Intialization(void)
{
UINT8 i;
#if  1
	      OperationRda5800_2w (WRITE,Rda5800_initialization_reg,86);
#else
	  for (i=0;i<86;i++){

	      OperationRda5800_2w (WRITE,&Rda5800_initialization_reg[i],1);

	  }
 #endif
}


/**************************************

Rda5800_Channel_Selection()

***************************************/

Rda5800_Channel_Selection(UINT32 curFreq)
{
	/*  Freq(MHz)=Spacing(kHz)*channel+87.5MHz   spacing=100K*/
	         
	unsigned char Rda5800_channel_start_tune[] ={0xd8,0x81,0x6a,0x00}; 	//104.3MHz
  Rda5800_channel_start_tune[2]=curFreq-875;
  
	//set tune bit
    OperationRda5800_2w(WRITE, &(Rda5800_channel_start_tune[0]), 4);
  //delay(100);
}


UINT8 Rda5800_stereo_detect(viod){
	//read REG0A&0B	
	UINT8 txt[1]={0};
      OperationRda5800_2w (READ,txt,1);
		if((txt[0]&0x01)==1)
			return 1;
		else
			return 0;

}

UINT8  Rda5800_GetSigLvl()  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/
{
     
     unsigned char Rda5800_reg_data[4]={0};	
     
    
     OperationRda5800_2w(READ,&(Rda5800_reg_data[0]), 4);	
   
     return  Rda5800_reg_data[2];  /*返回rssi*/
}


void  Rda5800_Mute(UINT8 mute)
{

      unsigned char Rda5800_Muteon[] ={0x98,0x81}; 
      unsigned char Rda5800_Muteclose[] ={0xd8,0x81}; 
     if(mute)
        OperationRda5800_2w(WRITE, &(Rda5800_Muteon[0]), 2);
     else
       OperationRda5800_2w(WRITE, &(Rda5800_Muteclose[0]), 2);
}

//SIGNAL(SIG_UART_RECV){
//	com_buf=UDR;
//	while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
//	UDR=com_buf;
//}

UINT8   data[32];
#define CS1100_RD_CTRL   0x21 
#define CS1100_WR_CTRL   0x20 
UINT8 CS1100ControlData[26];
UINT8 g_tic_20ms=0,g_is_init=0;

void delay_20ms(UINT8 iii){
	g_tic_20ms=0;
	while(g_tic_20ms != iii);
}

void SerialCommRelease(void)
{
   GPIO_WriteIO(1,SCL);
   GPIO_WriteIO(1,SDA);
}



unsigned int  CS1100_I2C_ReadCS1100Reg(UINT8 *data,UINT8 size)	//state=0->success   
{									//state=1->fail
  	unsigned int i,state = 0;
	SerialCommInit();
  	SerialCommStart();
  	if(SerialCommTxByte(CS1100_RD_CTRL))
  	{
 	  state = 1;
	  goto I2C_STOP;
  	}

  	for(i=0;i<size-1;i++)
	{
	   SerialCommRxByte(&data[i],0 );
	}

	SerialCommRxByte(&data[i],1);
I2C_STOP:
	SerialCommStop();
    SerialCommRelease();	 
	return state;
}


unsigned int CS1100_I2C_WriteCS1100Reg(UINT8 *data,UINT8 size) //state=0->success  
{								      //state=1->fail
	unsigned int i,state = 0;;
	SerialCommInit();
  	SerialCommStart();
	if(SerialCommTxByte(CS1100_WR_CTRL)) 
	{ 
	    state = 1;
	    goto I2C_STOP;
	}

    for(i=0;i<size;i++)
	{
	   if(SerialCommTxByte(data[i]))
	   	{
	   	 state = 1;
		 break;
	   	}
	}

I2C_STOP:
    SerialCommStop();
    SerialCommRelease();
    return state;
}


UINT8 CS1100ControlData[26];

/**************************************************************************************
*   函数名称:CS1100_FMInit
*   功    能:
*   输入参数:
*   输出参数:
*   说    明:CS1100 FM Tuner power up and initialization operation
**************************************************************************************/
void CS1100_FMInit(void)
{
	// initial default value of CS1100 READ/WRITE registers 03h~0Eh
  	CS1100ControlData[0] = 0xe4;  
  	CS1100ControlData[1] = 0x90; //  0xd8 0xd0
  	CS1100ControlData[2] = 0x32;
  	CS1100ControlData[3] = 0x26;
	CS1100ControlData[4] = 0x1f; 			
	CS1100ControlData[5] = 0x80; 
	CS1100ControlData[6] = 0x38; //CS1100ControlData[6] = 0x38; // for 32.768k crystal  
	CS1100ControlData[7] = 0x53;
	CS1100ControlData[8] = 0xb3;
	CS1100ControlData[9] = 0xb3;
	CS1100ControlData[10] = 0xaa;
	CS1100ControlData[11] = 0xf0;  
	CS1100ControlData[12] = 0x8b;
	CS1100ControlData[13] = 0xaa;   
	CS1100ControlData[14] = 0xc0;
	CS1100ControlData[15] = 0x04; //CS1100ControlData[15] = 0x04;//for 32.768k crystal
	CS1100ControlData[16] = 0x25;
	CS1100ControlData[17] = 0x35;
	CS1100ControlData[18] = 0xff;
	CS1100ControlData[19] = 0xfd;
	CS1100ControlData[20] = 0x92; 
	CS1100ControlData[21] = 0x0f;
	CS1100ControlData[22] = 0x44;
	CS1100ControlData[23] = 0x00;
	CS1100ControlData[24] = 0x84;
	CS1100ControlData[25] = 0x50;

       
	CS1100ControlData[0] &= 0x7f;  // power on
	CS1100ControlData[0] |= 0x20;  // mute on

	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,26);

	delay_20ms(100);//delay 800ms
}



/**************************************************************************************
*   函数名称:CS1100_FMTune
*   功    能:
*   输入参数:TunerFrequency, the unit is 10kHz
*   输出参数:
*   说    明:Tune to the desired frequency and output audio
**************************************************************************************/
void CS1100_FMTune(unsigned int TunerFrequency)
{
	unsigned int ch = 0;
	#if 0
	kal_UINT8 Temp[10];
	unsigned int rssi, snr, fd;
	#endif

    // frequency transfer to channel number,  channel=(frequencyMHz-60)/0.05, e.g. 87.5Mhz->550
	ch = (TunerFrequency - 6000)/5; 
	
	// set channel number 
	CS1100ControlData[2] &= 0xfc;
	CS1100ControlData[2] |= (ch & 0x0300)>>8;
	CS1100ControlData[3] =	ch & 0xff;
	//
    
	// tune function
	CS1100ControlData[0] &= 0xfe;  // seek=0 
	CS1100ControlData[0] |= 0x20;  // mute on
	CS1100ControlData[0] &= 0xfd;  // tune=0
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,4);

    
	CS1100ControlData[0] |= 0x02;  // tune=1
	CS1100ControlData[0] &= 0xdf;  // mute off
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,1);
	delay_20ms(5); // wait for 100ms
	
}    





void ini_tc0(void)
{
	TCNT0 = 100;	
	TIFR|=(1<<TOV0);	
	TIMSK|=(1<<TOIE0);
	
	TCCR0=_BV(CS02)|_BV(CS00); // 预分频 ck/1024 
}




/*******************boot_end***********************************/

//T/C0 中断例程	,// 产生中断周期 T = 244 * 1024 / 1MHz,即250mS  //产生中断周期 T = 234 * 1024 / 8MHz,即30mS
SIGNAL(SIG_OVERFLOW0)
{	
	TIFR|=(1<<TOV0);
	TCNT0 = 100;	//20ms
	g_tic_20ms++;

	//UDR=0x55;
}


int main(){
	UINT8  i,rev_rssi,cur_rssi;
	//ini_uart(207);//4800
	SerialCommInit();
	ini_tc0();
		PORTB=0xff;
		DDRB=0xff;
		BIT_CLR(PORTB,4);
	//UDR=0xaa;
	//Rda5800_Intialization();
	//Rda5800_Channel_Selection(1040);
    // OperationRda5800_2w(READ,data, 32);	
	sei();
    CS1100_FMInit();
CS1100_FMTune(10400);
//for(i=0;i<26;i++){
//data[i]=0;
//}
//CS1100_I2C_ReadCS1100Reg(data,26);
//for(i=0;i<26;i++){
//while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
//UDR=data[i];
//}
	//BIT_SET(PORTB,4);
CS1100_I2C_ReadCS1100Reg(data,2);
rev_rssi=cur_rssi=data[1];
g_tic_20ms=0;
	wdt_enable(WDTO_2S);

	while(1){
	wdt_reset();

if(g_tic_20ms==50){
	//UDR=0xab;
g_tic_20ms=0;
CS1100_I2C_ReadCS1100Reg(data,2);
cur_rssi=data[1];
if((cur_rssi>rev_rssi+16)||(data[0]&1)){
	CS1100ControlData[0] &= 0xdf;  // mute off
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,1);
	BIT_SET(PORTB,4);
	rev_rssi=cur_rssi;

}
if(rev_rssi>cur_rssi+15){
	CS1100ControlData[0] |= 0x20;  // mute on
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,1);
	BIT_CLR(PORTB,4);
	rev_rssi=cur_rssi;

}
#if 0
if(data[0]&1){
	CS1100ControlData[0] &= 0xdf;  // mute off
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,1);
	BIT_SET(PORTB,4);
}
else if(data[1]<0xc8){
	CS1100ControlData[0] |= 0x20;  // mute on
	CS1100_I2C_WriteCS1100Reg(CS1100ControlData,1);
	BIT_CLR(PORTB,4);
}
#endif
}
	 }
}

⌨️ 快捷键说明

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