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

📄 radio_rda5800.c

📁 提供收音模块的操作代码.可以操作各种收音模块
💻 C
字号:
/**
 * @file radio.c
 * @brief radio driver, define radio APIs.
 * This file provides radio APIs: radio initialization,
 * play radio, etc..
 * @date 2005-03-07
 * @version 1.0
 */

#if (RADIO_TYPE == 1)

#include "Apl_Public.h"
#include "ctl_msgbox.h"
#include "radio.h"
#include "vtimer.h"
#include "gpio.h"

#define RADIO_I2C_ADDR      0x20
#define END_PARAMETER       0xff

#define FREQ_BASE_87M       87500000
#define FREQ_BASE_76M       76000000
#define FREQ_MAX_108M       108000000


static T_U32 Freq2Pll(T_U32 Freq);
static T_U32 Pll2Freq(T_U32 Pll);
static T_U16 radio_get_space(T_VOID);
static T_U8 radio_get_band(T_VOID);

T_U32 Freq_Base = FREQ_BASE_87M;
T_U32 Freq_Space = 100; //100k


static const T_U8 initTable[] = {	
0xd8, 0x81,         //0x02
0x63, 0x00,         //0x03
0x44, 0x00,         //0x04
0x00, 0xff,         //0x05
0x00, 0x00,         //0x06
0x00, 0xcd,         //0x07
0x00, 0x96,         //0x08
0x00, 0x20,         //0x09
0x41, 0x63,         //0x0a
0x08, 0x06,         //0x0b
0x58, 0x00,         //0x0c
0x58, 0x00,         //0x0d
0x58, 0x00,         //0x0e
0x58, 0x00,         //0x0f
0x4c, 0x08,         //0x10
0x20, 0xa2,         //0x11
0x00, 0x00,         //0x12
0x00, 0x0f,         //0x13
0x06, 0xde,         //0x14
0xec, 0xc0,         //0x15
0x02, 0x00,         //0x16
0x53, 0x83,         //0x17
0x95, 0xa4,         //0x18
0xe8, 0x48,         //0x19
0x05, 0x00,         //0x1a
0x00, 0xa4,         //0x1b
0x88, 0x9b,         //0x1c
0x0d, 0x84,         //0x1d
0x4f, 0x04,         //0x1e
0x88, 0x32,         //0x1f
0x7f, 0x71,         //0x20
0x06, 0x60,         //0x21
0x40, 0x10,         //0x22
0x60, 0x02,         //0x23
0x18, 0x08,         //0x24
0x64, 0x58,         //0x25
0x78, 0x7f,         //0x26
0x01, 0x00,         //0x27
0xc0, 0x40,         //0x28
0xc0, 0x20,         //0x29
0x00, 0x24,         //0x2a
0x04, 0x00,         //0x2b
0x00, 0x20          //0x2c
};

#ifdef OS_EMBEDED

T_BOOL radio_get_status(T_RADIO_STATUS *Status, T_U32 FreqMin, T_U32 FreqMax)
{
    T_U8 i = 0;
    T_U8 DataTmp[4];
    T_U32 Pll0 = 0, Pll1 = 0;
    T_U32 curFreq = 0;
    T_BOOL ReadSuccess = AK_FALSE;
    T_RADIO_STATUS tmpStatus;

    for (i=0; i<3; i++)
    {
        memset(&tmpStatus, 0, sizeof(tmpStatus));
        ReadSuccess = AK_FALSE;

        if (i2c_read_data2(RADIO_I2C_ADDR, DataTmp, 4) == AK_FALSE)
        {
            printf("radio_get_tmpStatus(): radio read fail\r\n");
            continue;
        }        

        if (!(DataTmp[0] & 0x20))
        {
            tmpStatus.SearchOk = AK_TRUE;
        }
        
        tmpStatus.Rssi = DataTmp[2] & 0x3f;

        tmpStatus.ReadyFlag   = AK_TRUE;
        tmpStatus.LimitFlag   = AK_FALSE;
        
        Pll0 = DataTmp[1];
       
        if (Freq_Space == 50) //if is 50k step mode
        {
            Pll1 = (DataTmp[0] & 0x06) >> 1;
        }

        curFreq = Pll2Freq((Pll1 << 8) | Pll0);
        
        tmpStatus.CurFreq = curFreq;
        tmpStatus.Stereo = (DataTmp[0] & 0x01);
        if ((curFreq < FreqMin) || (curFreq > FreqMax))
        {
            printf("radio_get_tmpStatus(): Pll error\r\n");
        }

        ReadSuccess = AK_TRUE;
#if 0       
        printf("\nPll0: %d\n", Pll0);
        printf("Radio realtime freq: %d\n", curFreq);
        printf("ReadyFlag: %d\r\n", tmpStatus.ReadyFlag);
        printf("Rssi: %d\r\n", tmpStatus.Rssi);
        printf("SearchOk: %d\r\n", tmpStatus.SearchOk);
        printf("Freq_Base: %d\n", Freq_Base);
        printf("Freq_Space: %d\n\n", Freq_Space);
#endif        
        *Status = tmpStatus;
        break;
    }

    if (ReadSuccess)
    {
        *Status = tmpStatus;
        return AK_TRUE;
    }
    else
    {
        return AK_FALSE;
    }

}

T_BOOL radio_set_param (T_RADIO_PARM *Param)
{
    T_U32 i = 0;
    T_U32 Pll;
    T_BOOL ret = AK_FALSE, ret1 = AK_FALSE;

    T_U8 DataTmp[8] = {0xd8, 0x81, 0x00, 0x00, 0x44, 0x16, 0x00, 0xf0};

    AK_ASSERT_PTR(Param, "radio_set_param: Param", AK_FALSE);

    if (Param->MuteFlag)
    {
        DataTmp[0] &= (~0x40);
    }

    if (Param->SearchFlag)
    {
        DataTmp[0] |= 0x01;
    }

    if (Param->SearchDir)
    {
        DataTmp[0] |= 0x02;
    }
        
    if (Param->MonoStereo)
    {
        DataTmp[0] |= 0x20;
    }   
    
    if (Param->StopLevel)
    {
        DataTmp[6] |= (Param->StopLevel & 0x3f) << 8;
    }
    
    if (Param->Volume)
    {
        DataTmp[7] |= (Param->Volume & 0x0f);
    }

    if (Param->Freq)
    {
        Pll = Freq2Pll(Param->Freq);
        DataTmp[2] = Pll & 0xff;
        DataTmp[3] &= 0x3f;
        DataTmp[3] |= (Pll & 0x300) >> 2;
    }

    if (Param->BandLimit)
    {
        DataTmp[3] |= (1 << 1);
        Freq_Base = FREQ_BASE_76M;
    }
    else
    {
        Freq_Base = FREQ_BASE_87M;
    }
    
    if (Param->FreqStep)
    {       
        if (Param->FreqStep == 50*1000)
        {
            DataTmp[3] |= 0x04;
            Freq_Space = 50;
        }
        else if (Param->FreqStep == 100*1000)
        {
            DataTmp[3] &= (~(1 << 1));
            Freq_Space = 100;
        }
        else if (Param->FreqStep == 200*1000)
        {
            DataTmp[3] |= 0x01;
            Freq_Space = 200;
        }
    }

    if (Param->SearchFlag)
    {
        ret = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2);
        ret1 = AK_TRUE;
    }
    else
    {
        DataTmp[1] |= 0x10;     //if write register 03h, need set the bit 1
        ret = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 8);
        
        DataTmp[1] &= 0xef;     //then set the bit to 0
        ret1 = i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2);
    }
    
    if (ret && ret1)
    {
        return AK_TRUE;
    }
    else
    {
        printf("radio_set_param(): radio write fail\r\n");
        return AK_FALSE;
    }
    
}

T_BOOL radio_check(T_VOID)
{
    T_U8 data[2];

    if (AK_FALSE == i2c_read_data2(RADIO_I2C_ADDR, data, 2))
    {
        printf("Radio read failed!\n");
        return AK_FALSE;
    }

    return AK_TRUE;

}


T_BOOL radio_init(T_RADIO_INIT Init)
{
    T_U32 i = 0;
    T_U32 pll;   
    T_U8 data_tmp[2] = {0xd8, 0x81};
    T_U8 init_tmp[86];

    memcpy(init_tmp, initTable, 86);
  
    gpio_set_pin_dir(GPIO_FM_RESET, GPIO_DIR_OUTPUT);
    gpio_set_pin_level(GPIO_FM_RESET, 0);
    vtimer_delayms(10);
    gpio_set_pin_level(GPIO_FM_RESET, 1);    

    i2c_write_data2(RADIO_I2C_ADDR, data_tmp, 2);
    vtimer_delayms(500);

    Freq_Space = Init.FreqStep/1000;

    if (RADIO_JAPAN == Init.Area)
    {
        init_tmp[3] |= 0x02;                //band set
        Freq_Base = FREQ_BASE_76M;
    }

    if (Init.FreqStep == 50*1000)
    {
        init_tmp[3] |= 0x04;
        Freq_Space = 50;
    }
    else if (Init.FreqStep == 100*1000)
    {
        init_tmp[3] &= (~(1 << 1));
        Freq_Space = 100;
    }
    else if (Init.FreqStep == 200*1000)
    {
        init_tmp[3] |= 0x01;
        Freq_Space = 200;
    }

    init_tmp[6] = Init.Rssi; //RSSI 0~0x3f
    init_tmp[7] = Init.Volume;
  
    if (i2c_write_data2(RADIO_I2C_ADDR, init_tmp, 86) == AK_FALSE)
    {
        printf("radio init failed!\r\n");
        return AK_FALSE;
    }
    else
    {
        printf("radio init success!\r\n");

        return AK_TRUE;
    }
}


T_BOOL radio_exit(T_VOID)
{

     T_U8 DataTmp[2] = {0x00, 0x00};

    if (i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 2) == AK_FALSE)
    {
        return AK_FALSE;
    }
    else
    {
        return AK_TRUE;
    }

}


static T_U32 Freq2Pll(T_U32 Freq)
{  
    return ((Freq - Freq_Base) / (Freq_Space * 1000));
}


static T_U32 Pll2Freq(T_U32 Pll)
{
    return (Pll * Freq_Space * 1000 + Freq_Base);
}


T_VOID radio_line_in(T_BOOL enable)
{
    _AKSD_StartLineIn(enable);
}


T_VOID radio_print(T_VOID)
{
	T_U8 DataTmp[5];
	T_RADIO_STATUS Status;

    if (i2c_read_data2(RADIO_I2C_ADDR, DataTmp, 5))
    {
        printf("Radio Data: %x, %x, %x, %x, %x\n", DataTmp[0], DataTmp[1], DataTmp[2], DataTmp[3], DataTmp[4]);
    }
    else
        printf("radio data read error!!!\n");

    radio_get_status(&Status, 87500000, 108000000);
    printf("ReadyFlag: %d\n", Status.ReadyFlag);
    printf("LimitFlag: %d\n", Status.LimitFlag);
    printf("CurFreq: %d\n", Status.CurFreq);
    printf("IFCounter: %d\n", Status.IFCounter);
    printf("AdcLevel: %d\n", Status.AdcLevel);
}

#endif  

#endif  /* end of RADIO_TYPE */

/* end of file */

⌨️ 快捷键说明

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