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