📄 tuner.c
字号:
/*
****************************************************************************
Copyright 2001 Philips Semiconductors Limited,
35/F,Panglin Plaza, No. 2002,Jia BIn Road,Luo Hu District,Shenzhen 518001, PRC.
All rights are reserved. Reproduction in whole or in part is prohibited
without the prior written consent of the copyright owner.
COMPANY CONFIDENTIAL
***************************************************************************
Filename : Tuner.c
Rev Date Author
____________________________________________________________________________
1.0 2002/01/13 Tenon Mao
TEA5767 basic control
*/
#define XTAL32K
#define LowestFM 87500 //87.5MHz for EUR only for USA 87.9M
#define HighestFM 108000 //108.Mhz
#define InitVCO 98000 // 98.00 MHz for reset Freq
#define STEP 100 //setp size =100KHz.
#define AST_STEP 200 //200
#define MAX_STATION 20
#define TUNER_DELAY 250000 //250MS
#ifdef XTAL32K
#define REFERENCE_FREQ 32.768
#else
#define REFERENCE_FREQ 50.000
#endif
#define pcf_8566_addr 0x7C
#define KEY_NONE 0x00 // no key pressed
/**********************
* INCLUDE FILES *
**********************/
/* Standard include files */
/* Project include files */
#include "global.h"
#include "tuner.h"
/**********************
* LOCAL TYPEDEFS *
**********************/
/**********************
* EXPORTED DATA *
**********************/
BYTE data SearchLevel=3;
BYTE idata WriteDataWord[5]; // write tea5767H dataword
BYTE idata ReadDataWord[5]; // read tea5767H dataword
unsigned long idata TunerStation[20]; //save radio station FM Value HEX format
///For assembly data
BIT data FlagMute = False; // flag to Mute R&L
BIT data FlagSearch = False; // flag to search or preset mode
BIT data FlagSearchtUp =True; // flag for search direction
BYTE data FlagLevel =2; // flag for current search level
BIT data FlagHighInjection=False;
BIT data FlagMono = False; // flag to force mono
//Mute L
//Mute R
//SWPORT1 for GPIO out
BIT data FlagSWPORT2=Low; // flag for level of pin15
//standy_by
//Japan or ther area
//XTAL selecton 1 for 32k
BIT data FlagSoftMute = True;//False; // flag to force mono
//HCC
//SNC
BIT data FlagSWPORT1=True; // 1= confige as indication of found!!
//PLL selection 0
//Deem 1.
BYTE data NowStation=0;
BYTE data Max_Station=0;
unsigned long gdwSearchedVCO; // vco frequency after search command
unsigned long gdwPresetVCO=89800; // target vco frequency for Preset
unsigned long gdwWorkingVCO; // displayed vco frequency
BIT data NotFound = True;
BIT data BandLimit = False; // Indicate the end of band
//unsigned char TunerSearchTimer; //Timeout for serach
/**********************
* EXPORTED DATA *
**********************/
BYTE idata gbNewKey = KEY_NONE; // new key code
BYTE idata _gbOldKey = KEY_NONE; // old key code
BYTE idata _gbHoldKeyState = 0x00; // key holding state; high nibble: hold key flags, low nibble: hold key counter
UINT16 idata _gwKeyOldTime = 0; // previously getting key instant
BYTE idata _gbKeyCount=0;
/**********************
* STATIC DATA *
**********************/
/**********************
* LOCAL MACROS *
**********************/
/**********************
* FUNCTION PROTOTYPES *
**********************/
extern BYTE idata _gbOldKey;
/*********************************************************
* NAME : Delay10us
* Time delay in 10us.
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* twDelay delay time in 10us@16.9344MHz
*
* Externals Usage
* --------------------------------------------------------
* none
*
* Additional information:
* none
*********************************************************/
void Delay10us(UINT16 twDelay)
{
UINT16 i;
for( i=0;i<twDelay;i++ )
{
// _nop_();
// _nop_();
}
}
/****************************************************************************/
/* Command Delay */
/****************************************************************************/
void CMD_Delay(BYTE i)
{
for (; i!=0; i--) ;
}
void CMD_CheckHighSCL()
{
I2cSCL = 1;
}
void CMD_SendStart()
{
I2cSCL = 1;
CMD_Delay(CMD_DELAY);
I2cSDA = 0;
CMD_Delay(CMD_DELAY);
I2cSCL = 0;
CMD_Delay(CMD_DELAY);
}
void CMD_SendStop()
{
I2cSDA = 0;
CMD_CheckHighSCL();
CMD_Delay(CMD_DELAY);
I2cSDA = 1;
CMD_Delay(CMD_DELAY);
}
BYTE CMD_SendByte(BYTE bByte)
{
BYTE i;
BIT Acknowledge=1;
for(i=0;i<8;i++)
{
if(bByte&0x80)
I2cSDA=1;
else
I2cSDA=0;
bByte<<=1;
CMD_Delay(CMD_DELAY);
CMD_CheckHighSCL();
I2cSCL =0;
}
I2cSDA=1;
I2cSCL=1;
CMD_Delay(CMD_DELAY);
if (I2cSDA) Acknowledge=0;
I2cSCL=0;
CMD_Delay(CMD_DELAY);
return Acknowledge;
}
BYTE CMD_GetByte(BYTE Acknowledge)
{
BYTE i,bByte=0, bMask=0x80;
for(i=0;i<8;i++)
{
CMD_Delay(CMD_DELAY);
I2cSCL=1;
if(I2cSDA)bByte|=bMask;
bMask >>= 1;
I2cSCL =0;
}
I2cSDA =(Acknowledge)?1:0;
CMD_CheckHighSCL();
CMD_Delay(CMD_DELAY);
I2cSCL =0;
I2cSDA =1;
CMD_Delay(CMD_DELAY);
return bByte;
}
//////////////////////////////////////////////
void Tuner_I2cSendData()
{
BYTE i;
EA=0;
CMD_SendStart();
if (CMD_SendByte(0x0c0)) //chip addr of write data to driver
{
for (i=0; i<5; i++)
{
if (!CMD_SendByte(WriteDataWord[i])) //0 err
{
break;
}
}
}
CMD_SendStop(); //???
EA=1;
CMD_Delay(CMD_DELAY);
CMD_Delay(CMD_DELAY);
}
Byte SearchRead1=0; //for test only!!!
Byte SearchRead2=0;
Byte SearchRead3=0;
Byte SearchRead4=0;
Byte SearchRead5=0;
void Tuner_I2cReadData()
{
BYTE i;
#if 1 //test only!!
for (i=0; i<=4; i++)
{
ReadDataWord[i]=0;
}
SearchRead1=ReadDataWord[0];
SearchRead2=ReadDataWord[1];
SearchRead3=ReadDataWord[2];
SearchRead4=ReadDataWord[3];
SearchRead5=ReadDataWord[4];
Delay10us(2);
#endif
CMD_SendStart();
if (CMD_SendByte(0x0c1)) //chip addr of read data
{
for (i=0;i<5;i++)
ReadDataWord[i] =(i==4)? CMD_GetByte(1):CMD_GetByte(0); //the last byte with ACK.
CMD_SendStop();
}
else CMD_SendStop();
#if 1 //test only!!
SearchRead1=ReadDataWord[0];
SearchRead2=ReadDataWord[1];
SearchRead3=ReadDataWord[2];
SearchRead4=ReadDataWord[3];
SearchRead5=ReadDataWord[4];
Delay10us(2);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -