dtt74530.c

来自「DVB软件,基于CT216软件的开发源程序.」· C语言 代码 · 共 343 行

C
343
字号
#include <string.h>
#include "ct_type.h"
#include "ct_os.h"
#include "ct_sys.h"
#include "ct_iic.h"
#include "ct_nim.h"
#include "DTT74530.h"

//#define IIC_UART
#define TUNER_ADD   	0xC0
//static u8 szBuffer[8];
#if 0
#ifdef IIC_UART
/*******************************************************************************************/
bool8 Tuner_Write(u8 *pu8Buffer , u8 u8Length)
{
    if ((pu8Buffer == NULL)||
        (u8Length > MAX_IIC_BURST_LENGTH)||
        (u8Length==0))
    {        
        return FALSE;
    }

    if ( IIC2UART_Write(TUNER_ADD, *pu8Buffer, (pu8Buffer+1), (u8Length-1)) == FALSE )
	{		    
	    return FALSE;
	}
    return TRUE;
}
/*******************************************************************************************/
bool8 Tuner_Read(u8 *pu8Buffer, u8 u8Length)
{
    if ((pu8Buffer == NULL)||(u8Length > MAX_IIC_BURST_LENGTH))
    {
        return FALSE;
    }    
    
	if ( IIC2UART_Read(TUNER_ADD, 0, pu8Buffer, u8Length, FALSE) == FALSE )
	{
	    return FALSE;
	}

    return TRUE;
}
#else
/*******************************************************************************************/
bool8 Tuner_Write(u8 *pu8Buffer , u8 u8Length)
{
    u32 u32Handle;	
    
	if (CT_NIM_GetBus() == EN_CT_NIM_BUS_0)
	{
		if( CT_IIC_Open(EN_CT_IIC_BUS_0, TUNER_ADD, &u32Handle)!= DRV_OK)
		{		
			printf("\nCT_IIC_Open 0 Error");
	        return FALSE;
	    }
	}
	else
	{
		if( CT_IIC_Open(EN_CT_IIC_BUS_1, TUNER_ADD, &u32Handle)!= DRV_OK)
		{		
			printf("\nCT_IIC_Open 1 Error");
	        return FALSE;
	    }		
	}
#ifdef NIM_SW_IIC
	if(CT_SW_IIC_WriteData(u32Handle, pu8Buffer, u8Length) != DRV_OK )
#else
	if(CT_IIC_WriteData(u32Handle, pu8Buffer, u8Length) != DRV_OK )
#endif
	{		
		printf("\nCT_IIC_WriteData Error");
		CT_IIC_Close(u32Handle);
		return(FALSE);
	}
	
	CT_IIC_Close(u32Handle);
	return (TRUE);     
}
/*******************************************************************************************/
bool8 Tuner_Read(u8 *pu8Buffer, u8 u8Length)
{    
    u32 u32Handle;
		
	if (CT_NIM_GetBus() == EN_CT_NIM_BUS_0)
	{
		if( CT_IIC_Open(EN_CT_IIC_BUS_0, TUNER_ADD, &u32Handle)!= DRV_OK)
		{
			printf("\nR CT_IIC_Open 0 Error");
        	return FALSE;
        }
	}
	else
	{
		if( CT_IIC_Open(EN_CT_IIC_BUS_1, TUNER_ADD, &u32Handle)!= DRV_OK)
		{
			printf("\nR CT_IIC_Open 1 Error");
        	return FALSE;		
        }
	}

#ifdef NIM_SW_IIC
	if(CT_SW_IIC_ReadData(u32Handle, pu8Buffer, u8Length) != DRV_OK )
#else
	if(CT_IIC_ReadData(u32Handle, pu8Buffer, u8Length) != DRV_OK )
#endif
	{
		printf("\nR CT_IIC_ReadData Error");
		CT_IIC_Close(u32Handle);		
		return FALSE;
	}
	
	CT_IIC_Close(u32Handle);
	return (TRUE) ;
}
#endif
#endif
static u8 data[6];
static bool8 b8TunerDebugMode = FALSE;
/*******************************************************************************
 * Program DTT74530 tuner
 *******************************************************************************/
bool8 CT221_ProgramTuner_DTT74530(u32 RfFreq, u8 dwBWandFreqkHz)
{
	if(b8TunerDebugMode)
	{
		return TRUE;
	}

   	//u8 status;
   	long  maincounter;   	   	
   	float TunerFreq;
   	u32 Fosc;
   	//float if_freq = 36.167;
   	u8 stepsize = 0;
   	u8 if_out_level = 109;//112, 109, 106, 103, 100, 97, 94
   	
   	TunerFreq = RfFreq / 1000.0;
	Fosc = TunerFreq + 36;  //MHz   
   	//Tuner Address
   	data[0] = TUNER_ADD;	
	
	//maincounter = (long)((TunerFreq+if_freq)/(stepsize*0.001) + 0.5);    switch(RS)
	if(stepsize == 0)
		maincounter = TunerFreq * 6.0   + 216.0;      // 166.667 KHz
	else if(stepsize == 1)	
		maincounter = TunerFreq * 7.0   + 252.0;      // 142.875 KHz
	else if (stepsize == 2) 
		maincounter = TunerFreq * 12.5  + 450.0;      // 80.0 KHz
	else if(stepsize == 3) 
		maincounter = TunerFreq * 16.0  + 576.0;      // 62.5 KHz
	else if(stepsize == 4)
		maincounter = TunerFreq * 32.0  + 1125.0;     // 31.25 KHz
	else 
		maincounter = TunerFreq * 20.0  + 720.0;      // 50MHz

	// Divider Byte 1 & 2
	data[1] = (u8)((maincounter>>8)&0x007f);
	data[2] = (u8)(maincounter&0x00ff);
 
	// Control Byte 1	//[1 0 ATP2 ATP1 ATP0 RS2 RS1 RS0]
	data[3] = 0x80;
	//ab = data[3];
	

	//set ATP2 ATP1 ATP0
	if(if_out_level == 112) 
	{ 
		data[3] |= 0x00;
	}
	else if(if_out_level == 109) 
	{
		data[3] |= 0x08;
	} 
	else if(if_out_level == 106) 
	{ 
		data[3] |= 0x10;
	}
	else if(if_out_level == 103) 
	{
		data[3] |= 0x18;
	}  
	else if(if_out_level == 100) 
	{
		data[3] |= 0x20;
	} 
	else if(if_out_level == 97) 
	{
		data[3] |= 0x28;
	}
	else if(if_out_level == 94) 
	{
		data[3] |=0x30;
	}
	else                  
	{
		data[3] |= 0x38;
	}
	
	//data[3] = ab;
		
	//Reference Divider Ratio bit set[**** * RS2 RS1 RS0]	
	if(stepsize == 0)
		data[3] |= 0x00;//166.67KHz
	else if(stepsize == 1)	
		data[3] |= 0x01;//142.85KHz
	else if (stepsize == 2) 
		data[3] |= 0x02;//80KHz
	else if(stepsize == 3) 
		data[3] |= 0x03;//62.5KHz
	else if(stepsize == 4) 			
		data[3] |= 0x04;//31.25KHz
	else 
		data[3] |= 0x05;//50KHz 
		
	// Band-switch Byte 
	data[4] = 0x00;
	
	// Charge Pump current set bit[CP1 CP0 ** **BS2 BS1]
	if(Fosc <= 121.0)      
	{
		data[4] |= 0x01;	
	} 
	else if(Fosc <= 141.0) 
	{
		data[4] |= 0x41;	
	}
	else if(Fosc <= 166.0) 
	{
		data[4] |= 0x81;
	}
	else if(Fosc <= 182.0) 
	{
		data[4] |= 0xC1;
	}
	else if(Fosc <= 286.0) 
	{
		data[4] |= 0x02;
	}
	else if(Fosc <= 386.0) 
	{
		data[4] |= 0x42;
	}
	else if(Fosc <= 446.0) 
	{
		data[4] |= 0x82;
	}
	else if(Fosc <= 466.0) 
	{
		data[4] |= 0xC2;
	}
	else if(Fosc <= 506.0) 
	{
		data[4] |= 0x00;
	}
	else if(Fosc <= 761.0) 
	{
		data[4] |= 0x40;
	}
	else if(Fosc <= 846.0) 
	{
		data[4] |= 0x80;
	}	
	else                    
	{
		data[4] |= 0xC0;
	} 
	
	//Antenna power switch BS4
	data[4] |= 0x08;   //Antenna power on;

    //SAW filter bandwidth
    if(dwBWandFreqkHz == 8)
	   data[4] |= 0x04;//IF amplifier

	// Control Byte 2
	data[5] = 0xc3;

	//High/Low AGC current setting
	data[5] |= 0x20;	//High AGC current
	//data[5] &= (~(0x20));	//Low AGC current

	//Power Standby mode-control bit	
	//data[5] |= 0x10;		//Standby mode	
	data[5] &= (~(0x10));	//Normal mode

		
	/* I2C Data Write Sequences[07.02.24. By csd]
	1. Start-ADB-DB1-DB1-CB1-BB-CB2-Stop ==> COM.I2cReadWrite(WRITE,*data, &data[1],5);
	2. Start-ADB-DB1-CB1-Stop. Start-ADB-DB1-BB--CB2-Stop
	   ==> COM.I2cReadWrite(WRITE,*data, &data[1],2);
	       Sleep(50);
	       COM.I2cReadWrite(WRITE,*data, &data[3],3);
	       Sleep(10);
	3. Both write sequences is ok!!  */
	//printf("%02hx %02hx %02hx %02hx %02hx\n", data[1], data[2], data[3], data[4], data[5]);
	Tuner_Write(&data[1],5);
	CT_OS_MS_Delay(100);
	
	Tuner_Write(&data[0],1);
	//printf("%02hx \n", data[0]);
	if( (data[0] & 0x40) == 0x40)
	{
		data[5] &= (~(0x20));	//Low AGC current
		Tuner_Write(&data[1],5);
		//printf("%02hx %02hx %02hx %02hx %02hx\n", data[1], data[2], data[3], data[4], data[5]);
	}

	return TRUE;
}

void Debug_DTT74530(bool8 b8Switch)
{
	if(b8Switch)
		b8TunerDebugMode = TRUE;
	else
		b8TunerDebugMode = FALSE;
}

bool8 RegWreit_DTT74530(u32 u32index, u8 u8value)
{
	if( (u32index <= 5) && (u32index != 0) )
	{
		data[u32index] = u8value;
		printf("DB1=0x%02hx DB2=0x%02hx\n", data[1], data[2]);
		printf("CB1=0x%02hx BB=0x%02hx CB2=0x%02hx\n", data[3], data[4], data[5]);		
		Tuner_Write(&data[1],5);	
		return TRUE;
	}
	printf("index error\n");
	return FALSE;
}

bool8 RegRead_DTT74530(void)
{	
	printf("DB1=0x%02hx DB2=0x%02hx\n", data[1], data[2]);
	printf("CB1=0x%02hx BB=0x%02hx CB2=0x%02hx\n", data[3], data[4], data[5]);	
	Tuner_Write(&data[0],1);
	printf("SB=%02hx \n", data[0]);
	return TRUE;
}

⌨️ 快捷键说明

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