mh201a.c

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

C
262
字号
#include <stdio.h>
#include "ct_sys.h"
#include "ct_iic.h"
#include "ct_nim.h"
#include "MH201A.h"
#include "nim_config.h"

#define TUNER_ADD  	 			0xC2
#define ANANLOG_DEMO_ADD  	 	0x86

#define TUNER_IFKHZ   	36167
#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);     
}
#endif



#if 0
/*******************************************************************************************/
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


bool8 ANANLOG_DEMO_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, ANANLOG_DEMO_ADD, &u32Handle)!= DRV_OK)
		{		
			printf("\nCT_IIC_Open 0 Error");
	        return FALSE;
	    }
	}
	else
	{
		if( CT_IIC_Open(EN_CT_IIC_BUS_1, ANANLOG_DEMO_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 CT221_ProgramTuner_MH201A(u32 dwFreqkHz, u8 dwBWandFreqkHz)
{
    u32 dwTunerFreq;
	u32 uPllStep = 62500;
    bool8 status  = FALSE;

	u8  au8Buffer[5];

	//Set ANANLOG_DEMO for AGC control in Digital mode
	au8Buffer[0] = 0x00;
	
	au8Buffer[1] = 0x16;
	if(dwBWandFreqkHz == 8)
		au8Buffer[1] = 0x16 | 0x80;		//for 8M

	au8Buffer[2] = 0x70;
	au8Buffer[3] = 0x08;
	//printf("%hx %hx %hx %hx\n", au8Buffer[0], au8Buffer[1], au8Buffer[2], au8Buffer[3]);
	ANANLOG_DEMO_Write(au8Buffer, 4);

	/* calculate IF frequency (MHz *6)*/
    dwTunerFreq = (dwFreqkHz + 36125) * 1000;

	dwTunerFreq += uPllStep/2;
    dwTunerFreq /= uPllStep;

    au8Buffer[0] = (u8)((dwTunerFreq>>8) & 0x7F);   /* high byte*/
    au8Buffer[1] = (u8)(dwTunerFreq & 0xFF);        /* low byte*/

	//dwTunerFreq = FreqMHzx6/1000;
	au8Buffer[2]=0xC0;

	au8Buffer[3]=0x00;
	/* ChargePump Setting */
	if(dwFreqkHz <=142500)
	{	    //83uA
		au8Buffer[3]=au8Buffer[3] & 0x1F;
		au8Buffer[3]=au8Buffer[3] | 0x40;
	}
	else if(dwFreqkHz <=296500)
	{       //122uA
		au8Buffer[3]=au8Buffer[3] & 0x1F;
		au8Buffer[3]=au8Buffer[3] | 0x60;
	}
	else if(dwFreqkHz <=426000)
	{       //163uA
		au8Buffer[3]=au8Buffer[3] & 0x1F;
		au8Buffer[3]=au8Buffer[3] | 0x80;
	}
	else if(dwFreqkHz <=602000)
	{       //254uA
		au8Buffer[3]=au8Buffer[3] & 0x1F;
		au8Buffer[3]=au8Buffer[3] | 0xa0;
	}
	else if(dwFreqkHz <=870000)
	{       //400uA
		au8Buffer[3]=au8Buffer[3] & 0x1F;
		au8Buffer[3]=au8Buffer[3] | 0xc0;
	}
	else
	{
		printf("Out of Range");
	}
	/* End of ChargePump Setting */

/*
	if(MOPLL_TOP==7){
		au8Buffer[2] &= 0xc7;
		au8Buffer[2] |= 0x30;
	}
*/

//	au8Buffer[2] |= 0xF2; charge pump sinking current. just for test.

	/* Port Selection & Default LNA ON when Digital channel */
	/* Port BS4 is ON when Digital channel */
    au8Buffer[3] &= 0xe0;
	if(dwFreqkHz < 145000)       
		au8Buffer[3] |= 0x01;
	else if(dwFreqkHz < 429000)	
		au8Buffer[3] |= 0x02;
	else if(dwFreqkHz < 870000)	
		au8Buffer[3] |= 0x08;
	else	printf("Error Input Centerfreq");

	//if(LNA_ON_OFF) 
		au8Buffer[3] |= 0x04; //Digital channel "LNA_ON_OFF=true;" recommendation.
	//else           
		//au8Buffer[3] &= 0xFB;

	if(dwFreqkHz <=426000)	   
		au8Buffer[4]=0x81;
	else if(dwFreqkHz <=870000) 
		au8Buffer[4]=0x82;

	//printf("%hx %hx %hx %hx %hx\n", au8Buffer[0], au8Buffer[1], au8Buffer[2], au8Buffer[3], au8Buffer[4]);	
	status = Tuner_Write(au8Buffer, 5);
    return status;
}


⌨️ 快捷键说明

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