📄 复件 rda5800.c
字号:
}
}
// 发送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 + -