⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 此程序为twell8806驱动程序
💻 C
字号:
#include "Config.h"

#if defined( SUPPORT_PC ) || defined ( SUPPORT_DTV )

#include "reg.h"
#include "typedefs.h"
#include "i2c.h"
#include "adc.h"
#include "printf.h"
#include "main.h"
#include "tw88.h"
#include "pc_eep.h"
#include "measure.h"

// Address
#define PLLDIVM		0xc4
#define PLLDIVL		0xc5
#define PHASE		0xc7
#define RGB_SEL		0xd0
#define ADCMODE		0xc1
#define ADC_POWER	0xc3
#define VCOCURR		0xc6

//=============================================================================
//                             ADC Functions
//=============================================================================
CODE BYTE DTV_YPbPr_AD9883_init[] = 
{
	ADCI2CAddress, 51,

	0xc5, 0xc1,	// Sync control
	0xc6, 0x26,	// No Inversion/Csync from Sync slicer/SOG from SOYIN Pad/HPol=Neg/HSync=Composite Sync Separation input/LLPLL

	0xc5, 0xcd, // Vsync Control
	0xc6, 0x00, // Vsync: From Composite Sync Separation Output

	0xc5, 0xd0, // Clamp Gain Control
	0xc6, 0x00, // YUV

	0xc5, 0xd1, // Clamp Mode Control
	0xc6, 0x18, // 

	0xc5, 0xc8, // Hsync Output Width
	0xc6, 0x20, // 

	0xc5, 0xd2, // Clamp Start Position
	0xc6, 0x50, // 
	
	0xc5, 0xd3, // Clamp Stop Position
	0xc6, 0x80, // 

	0xc5, 0xd5, // SOG Threshold
	0xc6, 0x0f, // 

	0xc5, 0xd6, // Pre-Coast
	0xc6, 0x08, // 

	0xc5, 0xd7, // Post-Coast
	0xc6, 0x08, // 

//
	0xc5, 0xe0, // Clamp Level Mode = Default Mode
	0xc6, 0x03,                                  

	0xc5, 0xe1, // Y Programable Clamp Level      
	0xc6, 0x10,                                  

	0xc5, 0xe2, // UV Programable Clamp Level     
	0xc6, 0x80,                                  

	0xc5, 0xc3, // Power                          
	0xc6, 0x03, // SOG On/PLL On                  

	0xc5, 0xc9, // Gain 0x100                          
	0xc6, 0x07,                                  

	0xc5, 0xca,                                  
	0xc6, 0x00,                                   

	0xc5, 0xcb,                                  
	0xc6, 0x00,                                   

	0xc5, 0xcc,                                  
	0xc6, 0x00,  

	0x33, 0x85,
	0x38, 0x0e,
	0x49, 0x30,
	0x48, 0x4e,
	0x47, 0x7e,
	0x4a, 0x16,
	0x4b, 0x16,
	0x4d, 0x10,
	0x4c, 0xe2,
	0x40, 0x27,
	0x41, 0x00,
	0x42, 0x20,
	0x44, 0x0b,

	0xff, 0xff
};

CODE BYTE RGB_AD9883_init[] = 
{
	ADCI2CAddress, 52,

	0xc5, 0xc1,	// Sync control
	0xc6, 0x38,	
	0xc5, 0xc3,
	0xc6, 0x01,
	0xc5, 0xcd, // Vsync Control
	0xc6, 0x01, // Vsync: From Composite Sync Separation Output
	0xc5, 0xd0, // Clamp Gain Control
	0xc6, 0x08, // RGB
	0xc5, 0xd1, // Clamp Mode Control
	0xc6, 0x18, // 
	0xc5, 0xc8, // Hsync Output Width
	0xc6, 0x20, // 
//
	0xc5, 0xd2, // Clamp Start Position
	0xc6, 0x50, // 
	0xc5, 0xd3, // Clamp Stop Position
	0xc6, 0x80, // 
	0xc5, 0xd5, // SOG Threshold
	0xc6, 0x04, // 
	0xc5, 0xd6, // Pre-Coast
	0xc6, 0x00, // 
	0xc5, 0xd7, // Post-Coast
	0xc6, 0x00, // 

//
	0xc5, 0xe0, // Clamp Level Mode = Default Mode
	0xc6, 0x03,                                  
	0xc5, 0xe1, // Y Programable Clamp Level      
	0xc6, 0x10,                                  
	0xc5, 0xe2, // UV Programable Clamp Level     
	0xc6, 0x10,                                  
	0xc5, 0xc3, // Power                          
	0xc6, 0x01, // SOG Off/PLL On                  
	0xc5, 0xc9, // Gain 0x100                          
	0xc6, 0x07,                                  
//
	0xc5, 0xca,                                  
	0xc6, 0x00,                                   
	0xc5, 0xcb,                                  
	0xc6, 0x00,                                   
	0xc5, 0xcc,                                  
	0xc6, 0x00,  
//	0xc5, 0xc1, // Sync Control                                 
//	0xc6, 0x20,                                   
	0x33, 0x05,
	0x38, 0x0e,
	0x49, 0x38,
	0x48, 0x4b,
//
	0x47, 0x79,
	0x4a, 0x08,
	0x4b, 0x08,
	0x4d, 0x00,
	0x4c, 0xf3,
	0x40, 0x06,
	0x41, 0x00,
	0x42, 0x04,
	0x44, 0x1f,

	0x06, 0x08,
	0xff, 0xff

};

void SetADCMode(BYTE mode)
{
	#ifdef DEBUG_PC
	dPuts("\r\n SetADCMode");
	#endif

	if( mode==DTV ) {	// DTV-YPbPr
		#ifdef DEBUG_PC
		dPuts(" -- Analog for SOG");
		#endif
		I2CDeviceInitialize( DTV_YPbPr_AD9883_init );
	}
	else {			// RGB
		#ifdef DEBUG_PC
		dPuts(" -- Analog for HV");
		#endif
		I2CDeviceInitialize( RGB_AD9883_init );
	}
}

WORD GetCoarse(void)
{
	WORD buf;

	buf = ReadADC(PLLDIVM) << 8;
	buf |= ReadADC(PLLDIVL);

	return buf;
}

void SetCoarse(WORD i)
{
	#ifdef DEBUG_PC
	dPrintf("\r\nSet Coarse->%04x(%d) ", i, i);
	#endif

	WriteADC(PLLDIVM, (BYTE)(i >> 8));
	WriteADC(PLLDIVL, (BYTE)(i));
}

void SetPhase(BYTE j)
{
	#ifdef DEBUG_PC
	dPrintf("\r\nSet Phase->%04x ", (WORD)j);
	#endif

	WriteADC(PHASE, j&0x1f);
}

BYTE GetPhaseCurrent(void)
{
	return ReadADC(PHASE) & 0x1f;
}

BYTE SetVCORange(DWORD _IPF)
{
	BYTE VCO_CURR, oldv, chged=0;
	BYTE val;
	
	val = _IPF / 1000000L;
	
	if     ( val < 15 )		VCO_CURR = 0x01;	// 00 001
	else if( val < 34 )		VCO_CURR = 0x02;	// 00 010
	else if( val < 45 )		VCO_CURR = 0x0b;	// 01 101
	else if( val < 63 )		VCO_CURR = 0x0d;	// 01 101
	else if( val < 70 )		VCO_CURR = 0x0e;	// 10 101
	else if( val < 80 )		VCO_CURR = 0x14;	// 10 100
	else if( val <100 )		VCO_CURR = 0x16;	// 10 101
	else if( val <110 )		VCO_CURR = 0x16;	// 10 110
	else					VCO_CURR = 0x1d;	// 11 110
	
	oldv = ReadADC(VCOCURR) & 0x1f;	// curr VCO_CURR value  
	val = VCO_CURR;
	if( oldv != val ) {
		chged = 1;
		WriteADC(VCOCURR, val);		//
		delay(1);					// time to stabilize
	}

	#ifdef DEBUG_PC
	dPrintf("\r\nSetVCO=%02x, changed=%d", (WORD)val, (WORD)chged );
	#endif

	return chged;
}


#endif	// SUPPORT_PC


⌨️ 快捷键说明

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