📄 rda_fm_drv.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 + -