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

📄 grp400s_driver.c

📁 TEA5761是目前飞利浦比较先进的FM芯片
💻 C
字号:
#include "typedef.h"

#if	defined(__dRADIO_GRP400S__)

#define	_GRP400S_DRIVER_H_GLOBAL_
#include <string.h>

#include "includes.h"
#include "GRP400S_Driver.h"

#include "xRadioLib.h"

#include "Peri_I2C.h"

#include "MLC3590_PORT_DEF.h"

#define GRP400S_I2C_ADDR					0x20

#define RADIO_GPIO_POWER_ON()				(pRADIO_CTRL = 1)
#define RADIO_GPIO_POWER_OFF()			(pRADIO_CTRL = 0)


// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
//
// STATIC
//
// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
static U8 s_ucRadioBand = 0;
static U16 s_usRadioFreq = 8910;

static U8 s_ucRadioWriteBuffer[7];
static U8 s_ucRadioReadBuffer[16];

#define RADIO_RETRY_CNT				3

// ****************************************************************************
// Radio_WriteData
// ****************************************************************************
static int Radio_WriteData(void)
{
	U8 ucRetry = 0;

RADIO_WRITE_START:	

	if (I2CTxData(GRP400S_I2C_ADDR, s_ucRadioWriteBuffer, 7) == FALSE)
	{
		if (ucRetry++ < RADIO_RETRY_CNT)
		{
			OSTimeDly(OS_DELAY_TIME(20));
			goto RADIO_WRITE_START;
		}
		
		return FALSE;
	}

	return TRUE;
}

// ****************************************************************************
// Radio_ReadData
// ****************************************************************************
static int Radio_ReadData(void)
{
	U8 ucRetry = 0;

RADIO_READ_START:	

	memset(s_ucRadioReadBuffer, 0, 16);
	if (I2CRxData(GRP400S_I2C_ADDR, s_ucRadioReadBuffer, 16) == FALSE)
	{
		if (ucRetry++ < RADIO_RETRY_CNT)
		{
			OSTimeDly(OS_DELAY_TIME(20));
			goto RADIO_READ_START;
		}

		return FALSE;
	}
	
	return TRUE;
}

// ****************************************************************************
// Radio_SetPllValue
// ****************************************************************************
static void Radio_SetPllValue(void)
{
	U8 ucTemp;
	U16 usRadioPll;
	U32 ulRadioFreq;

	ulRadioFreq = s_usRadioFreq * 10;
	
	usRadioPll = (U16)((4000 * (ulRadioFreq + 225)) / 32768);
	// usRadioPll = (U16)((4000 * (ulRadioFreq + 225)) >> 15);

	//set the PLL value to the write buffer
	ucTemp = (U8)((usRadioPll >> 8) & 0x3F);
	s_ucRadioWriteBuffer[1] &= 0xC0;
	s_ucRadioWriteBuffer[1] |= ucTemp;

	s_ucRadioWriteBuffer[2] = (U8)(usRadioPll & 0xFF);
}

// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
//
// EXTERN
//
// ****************************************************************************
// ****************************************************************************
// ****************************************************************************
// ****************************************************************************

// ****************************************************************************
// OEM_RADIODriverInit
// ****************************************************************************
void OEM_RADIODriverInit(void)
{
	U8	i;

	for( i = 0; i < 16; i ++ )
		s_ucRadioReadBuffer[i] = 0x00;

	//s_ucRadioWriteBuffer[0] = 0x00;	
	s_ucRadioWriteBuffer[0] = 0x00;	//INTREG	7Bit:X,		6bit:X,		5bit:X,		4bit:X,  	
									//INTREG	3(IFMSK):0,	2(LEVMSK):0,1(FRMSK):0, 0(BLMSK):0

	//s_ucRadioWriteBuffer[1] = 0x2B;	
	s_ucRadioWriteBuffer[1] = 0xAB;	//FRQSET	7(SUD):0,	6(SM):0,	5(FR_13):1,	4(FR_12):0
									//FRQSET	3(FR_11):1,	2(FR_10):0,	1(FR_09):0,	0(FR_08):1
									//FRQ_HIGH_BYTE

	//s_ucRadioWriteBuffer[2] = 0xED;	
	s_ucRadioWriteBuffer[2] = 0xED;	//FRQSET	7(FR_07):1,	6(FR_06):1,	5(FR_05):0,	4(FR_04):1	
									//FRQSET	3(FR_03):1,	2(FR_02):0,	1(FR_01):1,	0(FR_00):1
									//FRQ_LOW_BYTE
									//BASE-->MBCFM4U 

	//s_ucRadioWriteBuffer[3] = 0x40;	
	//s_ucRadioWriteBuffer[3] = 0xC9;	//TNCTRL	7:X,		6(PUPD_0):1,5(BLIM):0,	4(SWPM):0		
	s_ucRadioWriteBuffer[3] = 0x49;	//TNCTRL	7:X,		6(PUPD_0):1,5(BLIM):0,	4(SWPM):0			
									//TNCTRL	3(IFCTC):0,	2(AFM):0,	1(SMUTE):0, 0(SNC):0

	//s_ucRadioWriteBuffer[4] = 0x10;	
	s_ucRadioWriteBuffer[4] = 0x10;	//TNCTRL	7(MU):0,	6(SSL_1):0,	5(SSL_0):0,	4(HLSI):1		
									//TNCTRL	3(MST):0,	2(SWP):0,	1(DTC):0,	0(AHLSI):0

	//s_ucRadioWriteBuffer[5] = 0x00;	
	s_ucRadioWriteBuffer[5] = 0x00;	//TESTREG	7(LHM):0,	6(RHM):0,	5:X,		4(LHSW):0		
									//TESTREG	3(TRIGFR):0,2(LDX):0,	1(RFAGC):0,	0(INTCTRL):0

	s_ucRadioWriteBuffer[6] = 0x00;
	//s_ucRadioWriteBuffer[6] = 0xC9;	//TESTREG	7(DETT):0,	6:X,		5:X,		4(TM):0		
									//TESTREG	3(TB_3):0,	2(TB_2):0,	1(TB_1):0,	0(TB_0):0

	OEM_RADIODriverPwrOff();
}

// ****************************************************************************
// OEM_RADIODriverPwrOn
// ****************************************************************************
void OEM_RADIODriverPwrOn(void)
{
	RADIO_GPIO_POWER_ON();

	s_ucRadioWriteBuffer[3] |= BIT6;		// Power On

	OEM_RADIODriverSetFreq(s_usRadioFreq);
}

// ****************************************************************************
// OEM_RADIODriverPwrOff
// ****************************************************************************
void OEM_RADIODriverPwrOff(void)
{
	s_ucRadioWriteBuffer[3] &= ~BIT6;		// Power Off
	
	Radio_WriteData();

	RADIO_GPIO_POWER_OFF();
}

// ****************************************************************************
// OEM_RADIODriverSetFmBand
// ****************************************************************************
void OEM_RADIODriverSetFmBand(U8 ucFmBand)
{
	if (ucFmBand == RADIODRV_FMBAND_JAPAN)
		s_ucRadioWriteBuffer[3] |= BIT5;			// JAPAN
	else
		s_ucRadioWriteBuffer[3] &= ~BIT5;		// US

	if (ucFmBand == RADIODRV_FMBAND_USA)
		s_ucRadioWriteBuffer[4] |= BIT1;			// DTC75
	else
		s_ucRadioWriteBuffer[4] &= ~BIT1;		// DTC50

	s_ucRadioBand = ucFmBand;
}

// ****************************************************************************
// OEM_RADIODriverSetMute
// ****************************************************************************
void OEM_RADIODriverSetMute(U8 ucSetMute)
{
	if (ucSetMute == RADIODRV_MUTE_ON)
		s_ucRadioWriteBuffer[4] |= BIT7;			// Mute On
	else
		s_ucRadioWriteBuffer[4] &= ~BIT7;		// Mute Off

	if (s_ucRadioWriteBuffer[3] & BIT6)		// Power On Check
		Radio_WriteData();
}

// ****************************************************************************
// OEM_RADIODriverSetFreq
// ****************************************************************************
void OEM_RADIODriverSetFreq(U16 usFreq)
{
	U16 usFreqMax = 0, usFreqMin = 0;

	usFreqMax = 10800;
	if (s_ucRadioBand == RADIODRV_FMBAND_JAPAN)		// JAPAN Band Check
		usFreqMin = 7600;
	else
		usFreqMin = 8750;

	if (usFreq < usFreqMin)
		usFreq = usFreqMax;

	if (usFreq > usFreqMax)
		usFreq = usFreqMin;

	s_usRadioFreq = usFreq;

	if (s_ucRadioWriteBuffer[3] & BIT6)		// Power On Check
	{
		Radio_SetPllValue();
		Radio_WriteData();
	}
}

// ****************************************************************************
// OEM_RADIODriverGetFreq
// ****************************************************************************
int OEM_RADIODriverGetFreq(void)
{
	return s_usRadioFreq;
}

// ****************************************************************************
// OEM_RADIODriverManualSearch
// ****************************************************************************
void OEM_RADIODriverManualSearch(U8 ucDirection)
{
	U8 ucFreqStep = 0;

	if ((s_ucRadioBand == RADIODRV_FMBAND_EUROP) || (s_ucRadioBand == RADIODRV_FMBAND_WORLD))
		ucFreqStep = 5;
	else
		ucFreqStep = 10;

	if (ucDirection == RADIODRV_SEARCH_UP)
		s_usRadioFreq += ucFreqStep;
	else if (ucDirection == RADIODRV_SEARCH_DOWN)
		s_usRadioFreq -= ucFreqStep;

	OEM_RADIODriverSetFreq(s_usRadioFreq);
}

// ****************************************************************************
// OEM_RADIODriverAutoSearch
// ****************************************************************************
int OEM_RADIODriverAutoSearch(U8 ucDirection)
{
	int i;
	U8 ucAdc, ucIfCnt;
	U8 ucReady;
	
	OEM_RADIODriverManualSearch(ucDirection);
	
	for(i=0; i < 0xFF; i++)
	{
		OSTimeDly(OS_DELAY_TIME(5));
		Radio_ReadData();
		ucReady = (s_ucRadioReadBuffer[0] >> 1) & 0x01;
		if (ucReady)			// Ready Check
			break;
	}

	//get the ADC level and the IF counter
	ucAdc = (U8)((s_ucRadioReadBuffer[9] >> 4) & 0x0F);
	ucIfCnt = (U8)((s_ucRadioReadBuffer[8] >> 1) & 0x7F);

	//check the ADC level and the IF counter
	if ((ucAdc > 4) && (ucIfCnt > 0x20) && (ucIfCnt < 0x3E))
		return 1;

	return 0;
}

// ****************************************************************************
// OEM_RADIODriverGetStereoChannel
// ****************************************************************************
int OEM_RADIODriverGetStereoChannel(void)
{
	U8 ucStereo;
	
	Radio_ReadData();	
	ucStereo = (U8)((s_ucRadioReadBuffer[9] >> 2) & 0x01);

	return ucStereo;
}

// ****************************************************************************
// OEM_RADIODriverSetStereoChannel
// ****************************************************************************
int OEM_RADIODriverSetStereoChannel(U8 ucOnOff)
{
	return TRUE;
}

// ****************************************************************************
// OEM_RADIODriverGetAdcLevel
// ****************************************************************************
int OEM_RADIODriverGetAdcLevel(void)
{
	U8 ucAdc;

	Radio_ReadData();	
	
	ucAdc = (U8)((s_ucRadioReadBuffer[9] >> 4) & 0x0F);

	return ucAdc;
}

#endif	//defined(__dRADIO_GRP400S__)

⌨️ 快捷键说明

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