RDA5802 编程资料

#if ( defined(RDAFM))
#include "l1audio_def.h"

#define READ 1
#define WRITE 0

#define ADRW 0x20
#define ADRR 0x21

//1.8V 32K clock support
//only 5802(TSMC)/5802E
//#define LOW_AMPLITUDE_32K_SUPPORT

/***************************************************
Extern Definitions and Types
****************************************************/
/***************************************************
Serial communication interfaces
****************************************************/
void SerialCommInit(void);
void SerialCommCryClkOn(void);
void SerialCommCryClkOff(void);
void SerialCommRxByte(uint8 *data, uint8 ack);
uint8 SerialCommTxByte(uint8 data);
void SerialCommStop(void);
void SerialCommStart(void);
uint8 OperationRDAFM_2w(uint8 operation, uint8 *data, uint8 numBytes);
uint16 RDAFM_GetChipID(void);
/***************************************************
Local Definitions and Types
****************************************************/
/***************************************************
RDA5802 interfaces
****************************************************/
void  RDA5802_PowerOnReset(void);
void  RDA5802_PowerOffProc(void);
void RDA5802_ChipInit(void);
void RDA5802_Mute(uint8 mute);
uint16 RDA5802_FreqToChan(uint16 frequency);
void RDA5802_SetFreq( int16 curf );
uint8 RDA5802_ValidStop(int16 freq);
uint8 RDA5802_GetSigLvl( int16 curf );
void RDA5802_SetVolumeLevel(uint8 level);
bool  RDA5802_Intialization(void);
/***************************************************
RDA5800 interfaces
****************************************************/
void RDA5800_PowerOnReset(void);
void  RDA5800_PowerOffProc(void);
void RDA5800_ChipInit(void);
void RDA5800_Mute(uint8 mute);
uint16 RDA5800_FreqToChan(uint16 frequency);
void RDA5800_SetFreq(int16 curFreq);
uint8 RDA5800_ValidStop(int16 freq);
uint8 RDA5800_GetSigLvl(int16 curf );
void RDA5800_SetVolumeLevel(uint8 level);
bool RDA5800_Intialization(void);
/***************************************************
Local variables
****************************************************/
static uint16 RDAFMChipID;
/***************************************************
MTK API
****************************************************/
void  FMDrv_PowerOnReset(void)
{
 RDAFMChipID=0;
 RDAFMChipID=RDAFM_GetChipID();  
 if(0x5802==RDAFMChipID)
 { 
  RDA5802_PowerOnReset();
 }
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_PowerOnReset();
 }
}

void  FMDrv_PowerOffProc(void)
{
 if(0x5802==RDAFMChipID)
 {
  RDA5802_PowerOffProc();
 }
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_PowerOffProc();
 }
}

void FMDrv_ChipInit()
{
 RDAFMChipID=0;
 RDAFMChipID=RDAFM_GetChipID(); 
 if(0x5802==RDAFMChipID)
 { 
  RDA5802_ChipInit();
 } 
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_ChipInit();
 } 
}

void  FMDrv_Mute(uint8 mute)
{
 if(0x5802==RDAFMChipID)
 {
  RDA5802_Mute(mute);
 }
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_Mute(mute);
 }  
}
void  FMDrv_SetFreq( int16 curf )
{
 if(0x5802==RDAFMChipID)
 {  
  RDA5802_SetFreq(curf);
 }
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_SetFreq(curf);
 } 
}

uint8 FMDrv_ValidStop(int16 freq, int8 signalvl, bool is_step_up)  /* 自动搜索时,作为判定条件,再从中选择信号最强的9个台*/
{
 bool result;
 if(0x5802==RDAFMChipID)
 {   
  result=RDA5802_ValidStop(freq);
 }
 else if(0x5800==RDAFMChipID)
 {
  result=RDA5800_ValidStop(freq);
 } 
 return result;
}

uint8 FMDrv_GetSigLvl( int16 curf )  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/

 uint8 result; 
 if(0x5802==RDAFMChipID)
 { 
  result=RDA5802_GetSigLvl(curf);
 }
 else if(0x5800==RDAFMChipID)
 {
  result=RDA5800_GetSigLvl(curf);
 }
 return result;
}

bool  FMDrv_IsChipValid(void)
{
 bool result=0;
 RDAFMChipID=0;
 RDAFMChipID=RDAFM_GetChipID();
 if(0x5802==RDAFMChipID)
 { 
  result=1;
 }
 else if(0x5800==RDAFMChipID)
 {
  result=1;
 }
 return result;
}

void  FMDrv_SetVolumeLevel(uint8 level)   /*一般不调用,即不用芯片来调节音量。*/
{
 if(0x5802==RDAFMChipID)
 { 
  RDA5802_SetVolumeLevel(level);
 }
 else if(0x5800==RDAFMChipID)
 {
  RDA5800_SetVolumeLevel(level);
 }  
}

/***************************************************
RDA5802
****************************************************/
uint8 RDA5802_initialization_reg[]={
0xC0, 0x01, //02H:
0x00, 0x00,       
0x04, 0x00,       
0x88, 0xAF, //05H:
0x00, 0x00,       
0x5E, 0xC6,       
0x50, 0x96,       
0x00, 0x00,       
0x40, 0x00, //0AH:
0x00, 0x8F,       
0x00, 0x00,       
0x00, 0x00,       
0x00, 0x00,       
0x00, 0x00,       
0xF0, 0x05, //10H:
0x90, 0x00,       
0xF4, 0x84,       
0x70, 0x01,       
0x40, 0xF0,       
0x21, 0x80, //15H:
0x7A, 0xD0,       
0x3E, 0x40,       
0x55, 0xA9,       
0xE8, 0x48,       
0x50, 0x80, //1AH:
0x00, 0x00,       
0x37, 0xB6,       
0x40, 0x0C,       
0x07, 0x9B,       
0x4C, 0x1D,       
0x81, 0x11, //20H:
0x45, 0xC0,       
};

#define SMIC_PATCH 0x27

void  RDA5802_PowerOnReset(void)
{
 SerialCommCryClkOn();
 kal_sleep_task(1);
 SerialCommInit();
 RDA5802_Intialization();
}

void  RDA5802_PowerOffProc(void)
{
 RDA5802_initialization_reg[1] &= (~1);
 OperationRDAFM_2w(WRITE, &(RDA5802_initialization_reg[0]), 2);
 SerialCommCryClkOff();
}

void RDA5802_ChipInit(void)
{
 SerialCommCryClkOn();
 kal_sleep_task(1);
 SerialCommInit();
 RDA5802_Intialization();
 FMDrv_PowerOffProc();
}

void RDA5802_Mute(uint8 mute)
{
 if(mute)
   RDA5802_initialization_reg[0] &=  ~(1<<7);
 else
  RDA5802_initialization_reg[0] |= 1<<7;

  OperationRDAFM_2w(WRITE, &(RDA5802_initialization_reg[0]), 2);
}

uint16 RDA5802_FreqToChan(uint16 frequency)
{
 uint8 channelSpacing;
 uint16 bottomOfBand;
 uint16 channel;

 if ((RDA5802_initialization_reg[3] & 0x0c) == 0x00)
  bottomOfBand = 870;
 else if ((RDA5802_initialization_reg[3] & 0x0c) == 0x04) 
  bottomOfBand = 760;
 else if ((RDA5802_initialization_reg[3] & 0x0c) == 0x08) 
  bottomOfBand = 760; 
 if ((RDA5802_initialization_reg[3] & 0x03) == 0x00)
  channelSpacing = 1;
 else if ((RDA5802_initialization_reg[3] & 0x03) == 0x01)
  channelSpacing = 2;

 channel = (frequency - bottomOfBand) / channelSpacing;
 return (channel);
}

void RDA5802_SetFreq( int16 curFreq )
{  
 uint8 RDA5802_channel_start_tune[] ={0xc0,0x01,0x00,0x10};  //87.0MHz
 uint16 curChan;
 
 curChan=RDA5802_FreqToChan(curFreq);
 
 //SetNoMute
 RDA5802_initialization_reg[0] |= 1<<7;
 
 RDA5802_channel_start_tune[0]=RDA5802_initialization_reg[0];
 RDA5802_channel_start_tune[1]=RDA5802_initialization_reg[1];
 RDA5802_channel_start_tune[2]=curChan>>2;
 RDA5802_channel_start_tune[3]=(((curChan&0x0003)<<6)|0x10) | (RDA5802_initialization_reg[3]&0x0f); //set tune bit
 
 OperationRDAFM_2w(WRITE, &(RDA5802_channel_start_tune[0]), 4);
 kal_sleep_task(5);
}

uint8 RDA5802_ValidStop(int16 freq)  /* 自动搜索时,作为判定条件,再从中选择信号最强的9个台*/
{
 uint8 RDA5802_reg_data[4]={0}; 
 uint8 falseStation = 0;
 uint16 curChan;
 
 curChan=RDA5802_FreqToChan(freq);
 
 //SetNoMute
 RDA5802_initialization_reg[0] |= 1<<7;
 
 RDA5802_reg_data[0]=RDA5802_initialization_reg[0];
 RDA5802_reg_data[1]=RDA5802_initialization_reg[1];
 RDA5802_reg_data[2]=curChan>>2;
 RDA5802_reg_data[3]=(((curChan&0x0003)<<6)|0x10) | (RDA5802_initialization_reg[3]&0x0f);
 OperationRDAFM_2w(WRITE,&(RDA5802_reg_data[0]), 4);
 
 kal_sleep_task(5);    

 //waiting for FmReady
 do
 {
  kal_sleep_task(1);
  //read REG0A&0B 
  OperationRDAFM_2w(READ,&(RDA5802_reg_data[0]), 4); 
 }while((RDA5802_reg_data[3]&0x80)==0);
   
 //check FM_TURE
 if((RDA5802_reg_data[2] &0x01)==0) falseStation=1;
 
 if(freq==960) falseStation=1;
  
 if (falseStation==1)
  return 0;  
 else
  return 1;
}

uint8 RDA5802_GetSigLvl( int16 curf )  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/
{   
 uint8 RDA5802_reg_data[4]={0}; 
 if(875==curf)
   return(1);
 else
  OperationRDAFM_2w(READ,&(RDA5802_reg_data[0]), 4);
 return  (RDA5802_reg_data[2]>>1);  /*返回rssi*/
}

void RDA5802_SetVolumeLevel(uint8 level)   /*一般不调用,即不用芯片来调节音量。*/
{
 RDA5802_initialization_reg[7]=( RDA5802_initialization_reg[7] & 0xf0 ) | level;
 OperationRDAFM_2w(WRITE, &(RDA5802_initialization_reg[0]), 8);
}

bool  RDA5802_Intialization(void)
{
 uint8 error_ind = 0;
 uint8 RDA5802_REG[]={0x00,0x02};
 uint8 RDAFM_reg_data[6]={0};
 uint16 cChipID; 

 RDA5802_REG[0]=0x00;
 RDA5802_REG[1]=0x02; 
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_REG[0], 2);
 kal_sleep_task(5);
 
 RDAFM_reg_data[0]=0x00;
 RDAFM_reg_data[1]=0x00;
 OperationRDAFM_2w(WRITE,&(RDAFM_reg_data[0]), 2);
 kal_sleep_task(5);
 
 OperationRDAFM_2w(READ,&(RDAFM_reg_data[0]), 6);
 cChipID=(RDAFM_reg_data[4]*0x100)+ RDAFM_reg_data[5];
 if( 0x5802==cChipID )
  RDA5802_initialization_reg[52]=SMIC_PATCH;
  
 RDA5802_REG[0]=0xC0;
 RDA5802_REG[1]=0x01;
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_REG[0], 2);
 kal_sleep_task(5);
 RDA5802_REG[0]=0x00;
 RDA5802_REG[1]=0x02; 
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_REG[0], 2);
 kal_sleep_task(5); 
 RDA5802_REG[0]=0xC0;
 RDA5802_REG[1]=0x01;
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_REG[0], 2);
 kal_sleep_task(5);
  
 RDA5802_initialization_reg[0] = 0xC0;
 RDA5802_initialization_reg[1] = 0x01;


#if (defined(LOW_AMPLITUDE_32K_SUPPORT))
if( 0x5802==cChipID )
 ASSERT(0);   //can't support low amplitude 32K clock
else  
 RDA5802_initialization_reg[0] |= 1<<2;
#endif

 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_initialization_reg[0],sizeof(RDA5802_initialization_reg));
 #if (defined(XTAL))
  kal_sleep_task(120);
 #else
  kal_sleep_task(60); 
 #endif
 
 
 if (error_ind )
    return 0;
 else
    return 1;
}

/***************************************************
RDA5800
****************************************************/
uint8 RDA5800_initialization_reg[]={
//0x00,0x00,
//0x00,0x00, 
0xc8,0x81, //0x02
0x00,0x00,
0x44,0x00, //0x04
0x09,0xff, //0x13ff, lilin, 06/22, 0x10f8, //0x05
0x00,0x00,
0x00,0xcd,
0x00,0x96,
0x00,0x20,
0x41,0x63,
0x08,0x06,
0x58,0x00,
0x58,0x00,
0x58,0x00,
0x58,0x00,
0x4c,0x17, //lilin, 08/13, seek_singlestep, 0x4817,
0x20,0xa2,
0x00,0x00,
0x00,0x0f,
0x06,0xde,
0xec,0xc0,
0x02,0x00,
0x53,0x83,
0x95,0xa4,
0xe8,0x48,
0x05,0x00, //0x0500, lilin, 06/22, 0x0500,
0x00,0xa4, //0x00a4, lilin, 06/22, 0x00a4,
0x88,0x9b,
0x0d,0x84,
0x4f,0x04,
0x88,0x32,
0x7f,0x71,
0x06,0x60,
0x40,0x10,
0x60,0x02,
0x18,0x08,
0x64,0x58,
0x78,0x7f,
0x01,0x00,
0xc0,0x40,
0xc0,0x20,
0x00,0x24,
0x04,0x00,
0x00,0x20,
};

void  RDA5800_PowerOnReset(void)
{
   SerialCommCryClkOn();
   kal_sleep_task(1);  
   SerialCommInit();
   RDA5800_Intialization();
}

void  RDA5800_PowerOffProc(void)
{
 uint8 RDA5800_poweroff[] ={0x00,0x00}; 
 OperationRDAFM_2w(WRITE, &(RDA5800_poweroff[0]), 2);
 SerialCommCryClkOff();
}

void RDA5800_ChipInit(void)
{
 SerialCommCryClkOn();
 kal_sleep_task(1);
 SerialCommInit();
 RDA5800_Intialization();
 FMDrv_PowerOffProc();
}

void  RDA5800_Mute(uint8 mute)
{
 uint8 RDA5800_Muteon[] ={0x88,0x81};
 uint8 RDA5800_Muteclose[] ={0xc8,0x81};
 if(mute)
  OperationRDAFM_2w(WRITE, &(RDA5800_Muteon[0]), 2);
 else
  OperationRDAFM_2w(WRITE, &(RDA5800_Muteclose[0]), 2);
}

uint16 RDA5800_FreqToChan(uint16 frequency)
{
 uint8 channelSpacing;
 uint16 bottomOfBand;
 uint16 channel;
 
 if ((RDA5800_initialization_reg[3] & 0x02) == 0x00)
  bottomOfBand = 875;
 else  
  bottomOfBand = 760;
 if ((RDA5800_initialization_reg[3] & 0x01) == 0x00)
  channelSpacing = 1;
 else if ((RDA5800_initialization_reg[5] & 0x01) == 0x01)
  channelSpacing = 2;
 else
  channelSpacing = 1;
  
 channel = (frequency - bottomOfBand) / channelSpacing;
 
 return (channel); 
}

void  RDA5800_SetFreq(int16 curFreq)

 uint8 RDA5800_channel_start_tune[] ={0xc8,0x81,0x00,0x00};
 uint16 curChan;

 curChan=RDA5800_FreqToChan(curFreq);
 RDA5800_channel_start_tune[2]=curChan;
 RDA5800_channel_start_tune[3]=RDA5800_initialization_reg[3];
 
 OperationRDAFM_2w(WRITE, &(RDA5800_channel_start_tune[0]), 4);
 kal_sleep_task(18);
 
}

uint8 RDA5800_ValidStop(int16 freq)  /* 自动搜索时,作为判定条件,再从中选择信号最强的9个台*/
{
 uint8 RDA5800_reg_data[4]={0}; 
 uint8 RDA5800_channel_seek_up[] = {0xcb,0x81};
 uint8 falseStation = 0;
 uint16 curChan;
 
 curChan=RDA5800_FreqToChan(freq);
 
 RDA5800_reg_data[0]=RDA5800_channel_seek_up[0];
 RDA5800_reg_data[1]=RDA5800_channel_seek_up[1];
 RDA5800_reg_data[2]=curChan;
 RDA5800_reg_data[3]=RDA5800_initialization_reg[3];
 OperationRDAFM_2w(WRITE,&(RDA5800_reg_data[0]), 4);
 
 kal_sleep_task(18);    

 //read REG0A&0B 
 OperationRDAFM_2w(READ,&(RDA5800_reg_data[0]), 4);   
 //check whether SF=1
 if((RDA5800_reg_data[0]&0x20)!=0) falseStation=1;
 //check station RSSI again, if RSSI<SEEKTH, then falseStation, continue seek
 if(RDA5800_reg_data[2] < RDA5800_initialization_reg[6]) falseStation=1;
 
 if(freq==960) falseStation=1;
 
 if (falseStation==1)
  return 0;  
 else
  return 1;
}

uint8 RDA5800_GetSigLvl( int16 curf )  /*当满足rssi 的条件时,将信号记录,再选最强的9个频段*/

 uint8 RDA5800_reg_data[4]={0}; 
 
 if(875==curf)
  return(1);
 else
  OperationRDAFM_2w(READ,&(RDA5800_reg_data[0]), 4); 
 
 return (RDA5800_reg_data[2]);  /*返回rssi*/
}

void  RDA5800_SetVolumeLevel(uint8 level)   /*一般不调用,即不用芯片来调节音量。*/
{
}

bool  RDA5800_Intialization(void)
{
 uint8 error_ind = 0;
 uint8 RDA5800_REG[]={0x00,0x02};
 
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5800_REG[0], 2);
 kal_sleep_task(1);
 error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5800_initialization_reg[0], 86);
 kal_sleep_task(20);
 #if (defined(XTAL))
  kal_sleep_task(120);
 #else
  kal_sleep_task(20); 
 #endif
 
 if (error_ind )
    return 0;
 else
    return 1;
}

#endif

在线客服 <<
QQ在线客服
服务电话
0755-83328582