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