?? adc.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 + -