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

📄 radio_tea5767.c

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

#if (RADIO_TYPE == 0)

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


#define REF_FREQ            32768       //refrence frequence
#define IF_FREQ             225000      //fIF = 225kHz
#define RADIO_I2C_ADDR      0xc0

static T_U32 Freq2Pll(T_U32 Freq);
static T_U32 Pll2Freq(T_U32 Pll);

#ifdef OS_EMBEDED

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

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

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

        ready = (T_BOOL)((DataTmp[0] & 0x80) >> 7);
        if (AK_FALSE == ready)
        {
            printf("radio_get_status(): ready not ok\r\n");
            continue;
        }

        tmpStatus.ReadyFlag   = ready;

        tmpStatus.LimitFlag   = (T_BOOL)((DataTmp[0] & 0x40) >> 6);
        Pll = DataTmp[0] & 0x3f;
        Pll = (Pll << 8) + DataTmp[1];
        curFreq = Pll2Freq(Pll);

        if ((curFreq < FreqMin) || (curFreq > FreqMax))
        {
            printf("radio_get_tmpStatus(): PLL read error\r\n");
            continue;
        }
        tmpStatus.CurFreq = curFreq;
        tmpStatus.IFCounter   = DataTmp[2] & 0x7f;
        tmpStatus.Stereo = (DataTmp[2] & 0x80) >> 7;
        tmpStatus.AdcLevel    = (DataTmp[3] &0xf0) >> 4;

        printf("debug token: freq = %d, adclevel = %d\r\n", tmpStatus.CurFreq, tmpStatus.AdcLevel);
        ReadSuccess = AK_TRUE;
        break;
    }

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

T_BOOL radio_set_param (T_RADIO_PARM *Param)
{
    T_U32 Pll;
    T_U8 DataTmp[5] = {0x00, 0x00, 0x10, 0x11, 0x80};

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

    AK_DEBUG_OUTPUT("debug token: radio_set_param(): freq = %d\r\n", Param->Freq);

    if (Param->MuteFlag)
        DataTmp[0] |= 0x80;

    if (Param->SearchFlag)
        DataTmp[0] |= 0x40;

    if (Param->SearchDir)
        DataTmp[2] |= 0x80;

    if (Param->MonoStereo)
        DataTmp[2] |= 0x08;

    if (Param->Freq)
    {
        Pll = Freq2Pll(Param->Freq);
        DataTmp[0] |= (T_U8)((Pll >> 8) & 0x3f);
        DataTmp[1] = (T_U8)(Pll & 0x00ff);
    }

    if (Param->StopLevel)
    {
       DataTmp[2] |= (Param->StopLevel << 5);
    }

    if (Param->BandLimit)
    {
        DataTmp[3] |= (T_U8)(1 << 5);
    }

    if (i2c_write_data2(RADIO_I2C_ADDR, DataTmp, 5) == AK_FALSE)
    {
        printf("radio5767_set_param(): radio write fail\r\n");
        return AK_FALSE;
    }
    else
    {
        return AK_TRUE;
    }
}

T_BOOL radio_check(T_VOID)
{
    T_U8 data[5] = {0};

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

    return AK_TRUE;

}


T_BOOL radio_init(T_U32 Freq, T_RADIO_AREA RadioArea)
{
    T_RADIO_PARM Param;

    /* set the radio init param */
    Param.MuteFlag = AK_FALSE;
    Param.SearchFlag = AK_FALSE;
    Param.SearchDir = AK_FALSE;
    Param.Freq = Freq;
    Param.MonoStereo = AK_FALSE;
    Param.StopLevel = 0;

    if (RADIO_JAPAN == RadioArea)
    {
        Param.BandLimit = AK_TRUE;
    }
    else
    {
        Param.BandLimit = AK_FALSE;
    }

    if(radio_set_param(&Param))
    {
        AK_DEBUG_OUTPUT("LINE IN IS OPENED!!\n");
        return AK_TRUE;
    }
    else
    {
   // 	I2C_Test();
        return AK_FALSE;
    }

}


T_BOOL radio_exit(T_VOID)
{
     T_U8 DataTmp[5] = {0x80, 0x00, 0x00, 0x5E, 0x00};

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


static T_U32 Freq2Pll(T_U32 Freq)
{
    return (((Freq + IF_FREQ) << 2 ) >> 15); // qual to   return (((Freq + IF_FREQ) << 2 )/REF_FREQ);
}


static T_U32 Pll2Freq(T_U32 Pll)
{
    if (((Pll << 15) >> 2) < IF_FREQ)
    {
        printf("Pll2Freq(): PLL is bad parm\r\n");
        return 0;
    }
    else
    {
        /*High injection: fRF = (PLL*REF_FREQ)/4 - IF_FREQ */
        return (((Pll << 15) >> 2) - IF_FREQ);
    }
}


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))
    {
        AK_DEBUG_OUTPUT("Radio Data: %x, %x, %x, %x, %x\n", DataTmp[0], DataTmp[1], DataTmp[2], DataTmp[3], DataTmp[4]);
    }
    else
        AK_DEBUG_OUTPUT("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 + -