📄 tv_tuner.c
字号:
#include "..\inc\public2.h"
#include "..\inc\Tuner_FP_Tab.h"
BYTE RegB,RegC,RegE;
void I2C_SendStart2();
void I2C_SendStop2();
void I2C_SendByte2(BYTE);
BYTE I2C_GetByte2(bit);
long int _Fp = Fp_VL_Start;
BYTE _SIF = 0;
BYTE _CS = 0;
BYTE _FINE = 0x80;
extern void I2C_Delay(unsigned char);
void TV_Init()
{
#ifdef DEMOD_WRID
Set_SIF(2);
Set_DEMOD();
#endif
Set_Fosc(Fp_VL_Start,_FINE);
}
unsigned int Set_VL()
{
Set_Fosc(Fp_VL_Start,0x80);
return Fp_VL_Start;
}
unsigned int Set_VH()
{
Set_Fosc(Fp_VH_Start,0x80);
return Fp_VH_Start;
}
unsigned int Set_UHF()
{
Set_Fosc(Fp_UHF_Start,0x80);
return Fp_UHF_Start;
}
void Set_Fosc( unsigned int fp_p, unsigned char fine)
{
BYTE i, tmp;
if ( (fp_p >= Fp_VL_Start) && (fp_p < Fp_VH_Start) )
tmp = PLL_CTR2_VL; // V-L
else if ( (fp_p >= Fp_VH_Start) && (fp_p < Fp_UHF_Start) )
tmp = PLL_CTR2_VH; // V-H
else if ( fp_p <= Fp_UHF_End )
tmp = PLL_CTR2_UHF; // UHF
else
{
tmp = PLL_CTR2_VL;
fp_p = Fp_VL_Start;
}
I2C_SendStart2();
I2C_SendByte2(PLL_WRID); //Write W_ID
if ( fp_p >= _Fp )
{
I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)/256);
I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)%256);
I2C_SendByte2(PLL_CTR1);
I2C_SendByte2(tmp); //VL VH UH select
}
else
{
I2C_SendByte2(PLL_CTR1);
I2C_SendByte2(tmp); //VL VH UH select
I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)/256);
I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)%256);
}
I2C_SendStop2(); //Stop
_Fp = fp_p;
_FINE = fine;
for(i=0;i<200;i++)
{
I2C_SendStart2();
I2C_SendByte2(PLL_WRID|0x1); //Write W_ID
tmp = I2C_GetByte2(1);
I2C_SendStop2();
if ( (tmp&0xC0) == 0x40 ) // Locked
break;
}
for(i=0;i<200;i++); // Delay
#ifdef DEMOD_WRID
if ( TV_If_AFC() )
for(i=0;i<250;i++); // Delay
#endif
}
#ifdef DEMOD_WRID
void Set_CS(BYTE cs)
{
_CS = cs;
}
void Set_SIF(BYTE sif)
{
_SIF = sif;
}
void Set_DEMOD()
{
BYTE sif;
switch (_CS)
{
case NTSC :
case NTSC443 :
case NTSCN :
_CS = NTSC;
break;
default :
_CS = PAL;
break;
}
switch ( _SIF )
{
case M:
sif = 0;
break;
case BG:
sif = 1;
break;
case DK:
sif = 3;
break;
case I:
sif = 2;
break;
case L:
_CS = SECAM;
sif = 3;
break;
}
switch (_CS)
{
case NTSC:
RegB = 0x16;
RegC = 0x30; // -16dB takeover
RegE = 0x00;
break;
case PAL:
RegB = 0xD6;//0xD6;
RegC = 0x70;//60 // -16dB takeover
RegE = 0x00;//0x40;
break;
case SECAM: // SECAM L
RegB = 0x06;//0x46;
RegC = 0x70;//0x50; // 0 dB takeover
RegE = 0x00;//40
break;
}
// RegB = RegB | 0x01; // Sound trap bypass
#ifdef PIF_38_9
RegE = RegE | 0x08 | sif; // 08 for VIF38.9MHz
#endif
#ifdef PIF_38_0
RegE = RegE | 0x0C | sif; // 0C for VIF38.0MHz
#endif
/*
RegB = 0xC6;//0x16;
RegC = 0x60;//0x70;
RegE = 0x89;
*/
I2C_SendStart2();
I2C_SendByte2(DEMOD_WRID); // Write W_ID
I2C_SendByte2(0x0);
I2C_SendByte2(RegB);
I2C_SendByte2(RegC);
I2C_SendByte2(RegE);
I2C_SendStop2();
}
bit TV_If_AFC()
{
BYTE d_status;
I2C_SendStart2();
I2C_SendByte2(DEMOD_WRID|0x01); //Write W_ID
d_status = I2C_GetByte2(1);
I2C_SendStop2();
if ( (d_status&0xC0) == 0xC0 )
return 1;
else
return 0;
}
bit TV_If_Locked()
{
BYTE d_status;
I2C_SendStart2();
I2C_SendByte2(DEMOD_WRID|0x01); //Read W_ID
d_status = I2C_GetByte2(1)&0xDF;
I2C_SendStop2();
if ( (d_status==0xC4) ||(d_status==0xC2) || (d_status==0xC0) || (d_status==0xDE) || (d_status==0xDC) )
return 1;
else
return 0;
}
#endif
void I2C_SendStart2(void)
{
I2C_SDA2 = 1;
I2C_Delay(2);
I2C_SCL2 = 1;
I2C_Delay(2);
I2C_SDA2 = 0;
I2C_Delay(2);
I2C_SCL2 = 0;
I2C_Delay(2);
}
void I2C_SendStop2(void)
{
I2C_SDA2 = 0;
I2C_Delay(2);
I2C_SCL2 = 1;
I2C_Delay(2);
I2C_SDA2 = 1;
I2C_Delay(2);
}
void I2C_SendByte2(BYTE val)
{
BYTE i;
for (i=0; i<8; i++)
{
I2C_SDA2 = (bit)(val & 0X80);
I2C_Delay(2);
I2C_SCL2 = 1;
val <<= 1;
I2C_Delay(2);
I2C_SCL2 = 0;
I2C_Delay(2);
}
I2C_SDA2 = 1;
I2C_Delay(2);
I2C_SCL2 = 1;
I2C_Delay(2);
I2C_SCL2 = 0;
I2C_Delay(2);
}
BYTE I2C_GetByte2(bit ACK_NACK)
{
BYTE i;
BYTE rd_byte;
rd_byte = 0;
for(i=0; i<8; i++)
{
I2C_SCL2 = 1;
rd_byte <<= 1;
I2C_Delay(2);
rd_byte |= I2C_SDA2;
I2C_SCL2 = 0;
I2C_Delay(2);
}
I2C_SDA2 = ACK_NACK;
I2C_Delay(2);
I2C_SCL2 = 1;
I2C_Delay(2);
I2C_SCL2 = 0;
I2C_Delay(2);
I2C_SDA2 = 1;
I2C_Delay(2);
return(rd_byte);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -