td1600al.c

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

C
237
字号
#include <stdio.h>
#include "ct_os.h"
#include "ct_sys.h"
#include "ct_iic.h"
#include "ct_nim.h"
#include "TD1600AL.h"

#define TDM1316AL_1
//#define DEVICE_ADD  	0x1E
#define TUNER_ADD   	0xC0
#define TUNER_IFKHZ   	36167

//#define IIC_UART

static u8 szBuffer[8];
static u8 stval = 0x08;
#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
/*******************************************************************************
 * Program TD1611 tuner
 *******************************************************************************/
bool8 CT221_ProgramTuner_TD1600AL(u32 dwFreqkHz, u8 dwBWandFreqkHz)
{
	u8  ucIndex;/* index into tuner control table*/	
	u8  status;

	unsigned long dwTunerFreq;

	//printf("\n Freq = %d, B.W = %d",dwFreqkHz,dwBWandFreqkHz);

#ifdef TDM1316AL_1
	u16 sTunerFreqTableMHZ[12] = {50,94,124,164,254,384,444,564,794,0,0,0};
	u8  sTunerControlTable[12] = {0x61,0xa1,0xc1,0x62,0xa2,0xc2,0x64,0xa4,0xe4,0,0,0};
	#define TABLE_COUNT 9
#else
	unsigned int sTunerFreqTableMHZ[12]  = {48,144,161,330,447,610,754,0x00,0x00,0x00,0x00,0x00};
	unsigned char sTunerControlTable[12] = {0x01,0x01,0x02,0x02,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00};
	unsigned char sTunerControlTable1[12]= {0xbc,0xf4,0xbc,0xf4,0xbc,0xf4,0xfc,0x00,0x00,0x00,0x00,0x00};
	#define TABLE_COUNT 7
#endif
	unsigned int FcompkHzx100 = 16667;

		/*scan table for control bytes s*/
	dwTunerFreq = dwFreqkHz / 1000; /* RF (MHz)*/
	for (ucIndex = TABLE_COUNT; ucIndex > 1; ucIndex--)
		{
				if ((dwTunerFreq) >= sTunerFreqTableMHZ[ucIndex-1]) break;
		}

	/* Get control byte for RF frequency*/
#ifdef TDM1316AL_1
		szBuffer[2] = 0xca;
		szBuffer[3] = sTunerControlTable[ucIndex-1];
#else

		szBuffer[2] = sTunerControlTable1[ucIndex-1];
		szBuffer[3] = sTunerControlTable[ucIndex-1];  

#endif
	/* add in bandwidth switching */
	switch (dwBWandFreqkHz)
		{
			case 6: szBuffer[3] |= 0x00; break;
			case 7: szBuffer[3] |= 0x00; break;
			case 8: szBuffer[3] |= stval; break;
			default: break;
		}
		//printf("\n stval==[%d]\n",stval);

	/* calculate LO frequency*/
	dwTunerFreq = dwFreqkHz; /* kHz*/

	/* IF offset*/
	/*	dwTunerFreq -= TUNER_IFKHZ; */
	dwTunerFreq += TUNER_IFKHZ;
	/* convert frequency to divider ratio*/
	dwTunerFreq = (dwTunerFreq * 1000) / FcompkHzx100;
	dwTunerFreq += 5;
	dwTunerFreq /= 10;     /*round off the result*/

	szBuffer[0] = (u8) ((dwTunerFreq >> 8) & 0xff);
	szBuffer[1] = (u8) (dwTunerFreq & 0xff);
	
	//printf("\n Tuner Data = 0x%hX 0x%hX 0x%hX 0x%hX",szBuffer[0],szBuffer[1],szBuffer[2],szBuffer[3]);		
	status = Tuner_Write(&szBuffer[0], 4);
	
	CT_OS_MS_Delay(5);
	szBuffer[2] = 0x80;
	status = Tuner_Write(&szBuffer[0], 4);

	CT_OS_MS_Delay(5);

	return (TRUE);
}

/*******************************************************************************
 * Check TD1611 tuner lock
 *******************************************************************************/
bool8 Check_tuner_lock(void)
{   
	bool8	        b8TunerLock;        
    u8			    buffer[1];
   
	Tuner_Read(buffer, 1);
//	printf("\n[Tuner] %d", buffer[0]);

    if ((buffer[0] & 0x48) != 0) /* Lock flag is bit B6 of the Read register */
	{
//		printf("\n>>PLL is locked!");
    	b8TunerLock = TRUE;
	}else
	{
//		printf("\n>>PLL is unlock!");
		b8TunerLock = FALSE;
	}
	
//  b8TunerLock = TRUE;
    if (b8TunerLock == TRUE)
	{		
		return	TRUE;
	}
	else
	{		
		return	FALSE;
	}
}

void Reset_paras(u8 val)
{
	stval = val;	 
}

⌨️ 快捷键说明

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