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 + -
显示快捷键?