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

📄 rda_fm_drv.c

📁 主流国产FM芯片RDA5802的在MTK手机平台上的驱动程序,
💻 C
字号:

#include "l1audio_def.h"

#define READ	1
#define WRITE	0

#define ADRW 0x20
#define ADRR 0x21

/***************************************************
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);
/***************************************************
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);

/***************************************************
Local variables
****************************************************/
static uint16 RDAFMChipID;

/***************************************************
RDA5802
****************************************************/
uint8 RDA5802_initialization_reg[]={
0xC0, 0x01, //02H: 
0x00, 0x00,        
0x04, 0x00,        
0x88, 0xAF, //05H: 
0x00, 0x00,        
0x46, 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, 0x80,        
};

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

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

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

void RDA5802_Mute(uint8 mute)
{
	uint8 RDA5802_Muteon[] ={0x80,0x01}; 
	uint8 RDA5802_Muteclose[] ={0xc0,0x01}; 
	if(mute)
	 OperationRDAFM_2w(WRITE, &(RDA5802_Muteon[0]), 2);
	else
	 OperationRDAFM_2w(WRITE, &(RDA5802_Muteclose[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);
	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);
}

 /************************************************************************************
 		function : judge current frequency whether is a True station,  for Auto seek, seek  
 	  input : Frequency, eg: 97.1Mhz -> 971
 	  output: 1->current Frequency is True station, 0-> current Frequency is fail station,
 *************************************************************************************/
 
uint8 RDA5802_ValidStop(int16 freq) 
{
	uint8 RDA5802_reg_data[4]={0};	
	uint8 RDA5802_channel_seek[] = {0xc0,0x01};
	uint8 falseStation = 0;
	uint16 curChan;
	
	curChan=RDA5802_FreqToChan(freq);
	
	RDA5802_reg_data[0]=RDA5802_channel_seek[0];
	RDA5802_reg_data[1]=RDA5802_channel_seek[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);   	

	//read REG0A&0B	
	OperationRDAFM_2w(READ,&(RDA5802_reg_data[0]), 4);			
	//check whether STC=1
	if((RDA5802_reg_data[0]&0x40)==0) falseStation=1;
	//check FM_TURE
	if((RDA5802_reg_data[2] &0x01)==0) 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};
	
	error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5802_REG[0], 2);
	kal_sleep_task(1);
	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(5);	
	#endif
	
	
	if (error_ind )
	   return 0;
	else
	   return 1;
}

⌨️ 快捷键说明

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