📄 lg_yizhi_tuner.c
字号:
#include "iic.h"
#include "LGIT.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include "ftypes.h"
#include "..\taskproc\inc\Sys_head.h"
#include "..\inc\Memhead.h"
#include "Frontend.h"
#if LG_C_TUNER
#define DELAY_TIME 22500
#define CHIPADDRESS 0x18
unsigned long uSysClk=58000000;
float m_iIfagcMax=145;//130
float m_iIfagcMin=100;//80
float m_iRfagcMax=255;
float m_iRfagcMin=0;
unsigned long uIF=36125000;
unsigned char bSyncReg ;
unsigned char TunerB[8];
int GLOBALLOCK=0;
unsigned char ii=0;
unsigned long freq_result[]={};
unsigned short Esum;
float ber_value;
unsigned char _Qammode;
void TunerWrite(_chanFrequency);
void TDA10021_iWrI2c(int address,int data);
unsigned char TDA10021_iRdI2c(int address) ;
char FE_Set_Tuner(unsigned long _chanFrequency,unsigned long _chanSymbolRate, unsigned char _Qammode);
int FE_GetLK (void);
unsigned char FE_Get_Quality(void);
void Snrprocess(unsigned char *snrReturn);
void Powerprocess(unsigned char *powerReturn);
int Berprocess(unsigned char* berReturn);
void Sleep(int x);
void Autosearch();
unsigned char FE_Get_Quality(void)
{
}
void Sleep(int x)
{
unsigned i, j;
for(i=0; i<x; i++)
{
for(j=0; j< DELAY_TIME; j++)
{
}
}
}
void TDA10021_iWrI2c(int address,int data) //向TDA10021写数
{
unsigned char IIC_data[3] ;
unsigned char buffer1;
IIC_data[0] = address ;
IIC_data[1] = data ;
buffer1 = FD_I2C_Write(&i2cHandle, CHIPADDRESS, IIC_data, 2);
if(buffer1 != FD_OK)
{
MXT_printf("\n***********tda10021 IIC write error ***********");
}
}
unsigned char TDA10021_iRdI2c(int address) //从TDA10021读数
{
unsigned char IIC_data[2] ;
unsigned char buffer1;
IIC_data[0] = address;
buffer1 = FD_I2C_Read(&i2cHandle, CHIPADDRESS, &IIC_data[0], 1, &IIC_data[1] , 1);
if(buffer1 != FD_OK)
{
MXT_printf("\n***********tda10021 IIC read error ***********");
}
return IIC_data[1] ;
}
char FE_Set_Tuner(unsigned long _chanFrequency,unsigned long _chanSymbolRate, unsigned char _Qammode)
{
int m_iIfagcread;
unsigned char foundgain,buffer;
m_fSymbolrate=_chanSymbolRate*1000;
m_iModulation=_Qammode;
_chanFrequency=_chanFrequency/100;
foundgain=0;
unsigned char buffer3;
MXT_printf("\n******** LG DVB-C ********");
if((_chanFrequency<10) || (_chanFrequency>900) || (_chanSymbolRate>8000)|| (_chanSymbolRate<1000))
{
TunerWrite(0); //MHZ
return 0;
}
TSB_set_tsb1(0);//海信复位问题
Sleep(10);
TSB_set_tsb1(1);
TunerWrite(_chanFrequency); //MHZ
//Sleep(10);
Q10021Init();
Q10021WriteSymbolRate((unsigned long)(m_fSymbolrate));/*Input parameter: Symbol rate*/
Q10021WriteQam(m_iModulation); /*Input parameter 64QAM -->2*/
Q10021RunAlgo((unsigned long)(m_fSymbolrate),&foundgain,1,1);/*ubAutoGain,ubAutoSpecInv);//ubAutoGain,ubAutoSpecInv-->1,1*/
Sleep(2);
//buffer = TDA10021_iRdI2c(0x17);
//MXT_printf("\n******** 111AGC_TUNER=%d********",buffer);
FE_GetLK();
}
void Adjust_FrequencyOrder(void)
{
int i;
unsigned long tempFreg[200];
unsigned char LocateNumber = 0;
for(i=0;i<=Global_Variables.Searchmaxtp;i++)
{
if(AutoSearch_TP[i]->transFreq > 40000)
{
LocateNumber = i;
break;
}
}
if(LocateNumber > 0)
{
for(i=0;i<=Global_Variables.Searchmaxtp;i++)
{
tempFreg[i] = AutoSearch_TP[i]->transFreq;
}
for(i=1;i<=Global_Variables.Searchmaxtp;i++)
{
if((i+LocateNumber-1) <= Global_Variables.Searchmaxtp)
AutoSearch_TP[i]->transFreq = tempFreg[(i+LocateNumber-1)%(Global_Variables.Searchmaxtp+1)];
else
AutoSearch_TP[i]->transFreq = tempFreg[(i+LocateNumber-1)%Global_Variables.Searchmaxtp];
}
}
}
void GetStartTP_StopTP(unsigned int FreqStart ,unsigned int FreqEnd ,unsigned short *StartTP, unsigned short *StopTP)
{
U32 tempFrequency;
U32 i;
if(FreqStart > FreqEnd)
{
tempFrequency = FreqStart;
FreqStart = FreqEnd;
FreqEnd = tempFrequency;
}
for(i=1;i<=100;i++)
{
if((FreqStart >= All_Default_Tp[i]->transFreq) && (FreqStart <= All_Default_Tp[i+1]->transFreq))
*StartTP = i;
if((FreqEnd >= All_Default_Tp[i]->transFreq) && (FreqEnd <= All_Default_Tp[i+1]->transFreq))
*StopTP = i;
}
MXT_printf("\n*****autosearch***** StartTP:%d StopTP:%d " ,*StartTP,*StopTP);
}
unsigned char autosearch_tuner(int FreqStart ,int FreqEnd ,unsigned short auto_symbolrate,
unsigned char auto_modulation, unsigned char adjust_freq_order)
{
unsigned long channelfreq;
unsigned char k=0,i,m,ii,foundgain,bAGC1,bAGC2,p;
U32 tunerWaitTime;
extern U32 G_FP_ScanTimer;
U16 StartTP=0,StopTP=0;
U32 liu;
FE_Set_Tuner(400*100,auto_symbolrate,auto_modulation);
if (Global_Variables.AutoSearching != 1)
{
Global_Variables.AutoSearching = 1 ;
}
foundgain=0;
Q10021Init();
AutoSearch_TP[0]->transFreq = 0;
AutoSearch_TP[0]->transSymbol = 0 ;
AutoSearch_TP[0]->transPolor = 0 ;
Global_Variables.Searchmaxtp = 0 ;
Q10021WriteSymbolRate(auto_symbolrate*1000);/*Input parameter: Symbol rate*/
Q10021WriteQam(auto_modulation); /*Input parameter 64QAM -->2*/
GetStartTP_StopTP(FreqStart*100,FreqEnd*100,&StartTP,&StopTP);
for(liu = StartTP;liu<=StopTP;liu++) //必须大于起始频率的10MHZ
{
channelfreq = All_Default_Tp[liu]->transFreq/100;
if (Global_Variables.AutoSearchExit == 1)
{
Global_Variables.AutoSearchExit = 0 ;
MXT_printf("\n*****somekey press and return *********");
return 0;
}
TunerWrite(channelfreq);
tunerWaitTime = G_FP_ScanTimer;
while((G_FP_ScanTimer-tunerWaitTime) < 10)
{
//bAGC1 = TDA10021_iRdI2c(0x17);
bAGC2 = TDA10021_iRdI2c(0x2f);
//MXT_printf("\n******** auto search AGC_TUNER=%d********",bAGC1);
//MXT_printf("\n******** auto search AGC_IF=%d********",bAGC2);
if (bAGC2 < 135)
break;
}
MXT_printf("\n********channelfreq=%d,%d********",channelfreq,bAGC2);
if(bAGC2 < 135){
MXT_printf("\n********channelfreq=%d********",channelfreq);
for(p=0;p<3;p++)
{
//TunerWrite(channelfreq);
//Sleep(5);
Q10021WriteSymbolRate(auto_symbolrate*1000);/*Input parameter: Symbol rate*/
Q10021WriteQam(auto_modulation); /*Input parameter 64QAM -->2*/
Q10021RunAlgo(auto_symbolrate*1000,&foundgain,1,1);/*ubAutoGain,ubAutoSpecInv);//ubAutoGain,ubAutoSpecInv-->1,1*/
tunerWaitTime = G_FP_ScanTimer;
while((G_FP_ScanTimer-tunerWaitTime) < 50)
{
m=FE_GetLK (); //锁定标志
if(m==1)//lock
break;
}
if(m==1)//lock
{
MXT_printf(" lock");
//signalfreq[k]=n;
k++;
AutoSearch_TP[k]->transFreq = channelfreq*100;
AutoSearch_TP[k]->transSymbol = auto_symbolrate ;
AutoSearch_TP[k]->transPolor = auto_modulation ;
Global_Variables.Searchmaxtp ++ ;
break;
//signalnumber++;
} //保存频点
}
}
Search_Process(channelfreq,FreqStart,FreqEnd);
}
if (adjust_freq_order) {
Adjust_FrequencyOrder();
}
return 1 ;
}
void TunerWrite(_chanFrequency)
{
unsigned long m_fRfin;
m_fRfin=_chanFrequency;
int i,j, k ,err ;
int status;
//CHAR buff[128];
long maincounter;
double error;
int pllic_lock;
unsigned char buffer;
/*******************************************************************/
/************** Make PLL 7 Byte Data ********************/
/*******************************************************************/
maincounter=(long)((m_fRfin+36.125)/(62.5f*0.001));
error=(double)(m_fRfin+36.125)*1000-(double)(maincounter*(long)62.5);
if(error>(double)62.5/2)maincounter+=1;
//TunerB[1]=TUNER_ADDRESS;
TunerB[0]=(unsigned char)((maincounter>>8)&0x007f) ;
TunerB[1]=(unsigned)(maincounter&0x00ff);
TunerB[2]=0x86;
if(m_fRfin<150.0) TunerB[3]=0x01;
else if(m_fRfin>448.0) TunerB[3]=0x04;
else TunerB[3]=0x02;
//ChipWriteMasked(0x0f,0x80,0x80); /* iic sw on(Bypass Tuner)*/
buffer = TDA10021_iRdI2c(0x0f);
buffer= buffer|0x80; //BYPIIC=1
TDA10021_iWrI2c(0x0f,buffer);
Sleep(5); /*msec delay*/
//I2cReadWrite(WRITE,TunerB[1],&TunerB[2],4);
buffer=FD_I2C_Write(&i2cHandle, 0xc2, TunerB, 4);
if(buffer != FD_OK)
{
MXT_printf("\n***********pll IIC write error ***********");
}
Sleep(5); /*msec delay*/
//ChipWriteMasked(0x0f,0x80,0x00); /* iic sw off(Bypass Tuner)*/
buffer = TDA10021_iRdI2c(0x0f);
buffer= buffer&0x7f; //BYPIIC=0
TDA10021_iWrI2c(0x0f,buffer);
/*Pll lock check */
status=TunerRead();
Sleep(5);
if(status) pllic_lock=1; else pllic_lock=0;
}
unsigned char TunerRead()
{
int err ;
int i ;
i = 0 ;
err = -1 ;
unsigned char buffer;
unsigned char TunerS[2];
buffer = TDA10021_iRdI2c(0x0f);
buffer= buffer|0x80; //BYPIIC=1
TDA10021_iWrI2c(0x0f,buffer);
FD_I2C_Read(&i2cHandle, 0xc2, &TunerS[0], 0, &TunerS[1] , 1);
//MXT_printf("\n********Tuner Status=0x%x********",TunerS[1]);
buffer = TDA10021_iRdI2c(0x0f);
buffer= buffer&0x7f; //BYPIIC=0
TDA10021_iWrI2c(0x0f,buffer);
if((TunerS[1]&0x40)==0x40)
return(1);
else
return(0);
Sleep(10);
}
void Q10021Init()
{
int i;
unsigned char pByte[3], bByte,buffer;
long lDeltaF;
pByte[0] = 0x1c;/*AC_sConfig.bPLL_M_Factor;*/
pByte[1] = 0; /*AC_sConfig.bPLL_N_Factor;*/
pByte[2] = 0x11;/*AC_sConfig.bPLL_P_Factor;*/
/* write the PLL registers with PLL bypassed*/
TDA10021_iWrI2c(0x28,pByte[0]);
TDA10021_iWrI2c(0x29,pByte[1]);
TDA10021_iWrI2c(0x2a,pByte[2]);
// ChipWriteMasked(0x2a, 0x10, 0);
buffer = TDA10021_iRdI2c(0x2a);
buffer= buffer&0xef;
TDA10021_iWrI2c(0x2a,buffer);
//buffer = TDA10021_iRdI2c(0x2a);
//MXT_printf("\n********in pll Status=0x%x********",buffer);
/* enable AGC2 and set PWMREF*/
buffer = TDA10021_iRdI2c(0x2e);
buffer= buffer|0x08;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -