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

📄 ad9887.c

📁 此为ADI公司的ADC芯片的软件控制,可为多煤体应用开发.
💻 C
📖 第 1 页 / 共 4 页
字号:
         PostCoast = 5;
         SyncTHR=16;
         break;
      default: /* unknown resolution */
         break;
      }

	/* Set sample phase */
	AD9887_SetPhase(Phase);

	/*  PLLDIV = PixelRate / HFreq. */
   AD9887_SetPLLDiv(HorTotalTime);

   /* Set VCO Range and CP Current */
   RegVal.bits.reserved1 = 0;
   RegVal.bits.reserved2 = 1;
	RegVal.bits.current = Current;
	RegVal.bits.vcornge = VcoRange;
	rc = AD9887_Write(AD9887_VCO, RegVal.byte);

   /* Set Clamp and Duration */
   AD9887_SetClamp(Clamp, Duration);

   // set sync on green parameters
   AD9887_Write(AD9887_PRECOAST,     PreCoast);
   AD9887_Write(AD9887_POSTCOAST,     PostCoast);
   AD9887_Read(AD9887_CONTROL2, &ControlBits2Val.byte);
   ControlBits2Val.bits.res0          = 0;
   ControlBits2Val.bits.res1          = 0;
   ControlBits2Val.bits.res2          = 0;
   ControlBits2Val.bits.syncgrnsl     = SyncTHR; 
   AD9887_Write(AD9887_CONTROL2, ControlBits2Val.byte);

   return (rc);
} /* AD9887_PLL */
/******************************************************************************/

/*****************************************************************************/
TA2D_Result AD9887_InitPLL(void)
{
   TA2D_Result rc;
	rc = AD9887_SetPLLDiv(1693);
   rc = AD9887_Write(AD9887_VCO, 0x48);

   return (rc);
}
/******************************************************************************/

/******************************************************************************/
TA2D_Result AD9887_SetVCORange(TBYTE VCORange)
{
	TA2D_Result rc;
	union {
		TAD9887_VcoCurrent bits;
		TBYTE byte;
		} RegVal;

   if(VCORange > 3)
   	return A2D_IllegalValue;

	rc = AD9887_Read(AD9887_VCO, &RegVal.byte);
	RegVal.bits.vcornge = VCORange;
	rc = AD9887_Write(AD9887_VCO, RegVal.byte);

   return rc;
}
/******************************************************************************/

/******************************************************************************/
TA2D_Result AD9887_GetVCORange(TBYTE *VCORange)
{
	TA2D_Result rc;
	union {
		TAD9887_VcoCurrent bits;
		TBYTE byte;
		} RegVal;

	rc = AD9887_Read(AD9887_VCO, &RegVal.byte);
   *VCORange = RegVal.bits.vcornge;

   return rc;
}
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *  AD9884A_SetPLLDiv- Set PLL divide ratio
 *
 *
 *  description:
 *  ------------
 *  PLLDIVM = MSB(plldiv)
 *  PLLDIVL = LSB(plldiv) << 4
 *
 *
 *  Protoype:
 *  ----------
 *  TA2D_Result AD9887_SetPLLDiv(TWORD plldiv)
 *  Where:
 *  plldiv - PLL divide ratio
 *  Returns:
 *  A2D_OK/A2D_ERROR
 *
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  Ori	   21/10/2001  creation
 *
 */

TA2D_Result AD9887_SetPLLDiv(TWORD plldiv)
{
	TA2D_Result rc = A2D_OK;

	/* plldiv is in the range 0-0xfff */
	if (plldiv > 0xfff)
		rc = A2D_IllegalValue;
	else	/* legal value */
		{
      plldiv--;
		rc = AD9887_Write(AD9887_PLLDIVM, (TBYTE)(plldiv >> 4));
		rc = AD9887_Write(AD9887_PLLDIVL, plldiv << 4);
		}

	return (rc);

} /* AD9887_SetPLLDiv */
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *  AD9887_GetPLLDiv- Get PLL divide ratio
 *
 *
 *  description:
 *  ------------
 *  PLLDIVM = MSB(plldiv)
 *  PLLDIVL = LSB(plldiv) << 4
 *
 *
 *  Protoype:
 *  ----------
 *  TWORD AD9887_GetPLLDiv(void)
 *  Where:
 *
 *  Returns:
 *  plldiv - PLL divide ratio
 *
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  Ori	   21/10/2001  creation
 *
 */

TWORD AD9887_GetPLLDiv(void)
{
	TWORD plldiv = 0;
	TBYTE pllbyte;

	AD9887_Read(AD9887_PLLDIVM, &pllbyte);
	plldiv = (TWORD)pllbyte << 8;
	AD9887_Read(AD9887_PLLDIVL, &pllbyte);
	plldiv |= pllbyte;
	plldiv >>= 4;

	return (plldiv + 1);

} /* AD9887_GetPLLDiv */
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *  AD9887_SetClamp- Set clamping parameters
 *
 *
 *  description:
 *  ------------
 *  Set clamping parameters - signal source, signal polarity, placement and duration..
 *  The function actually calls to the on-board A2D function.
 *
 *
 *  Protoype:
 *  ----------
 *  TA2D_Result AD9887_SetClamp(TBYTE Placement, TBYTE Duration)
 *
 *  Where:
 *  Placement - Position of the internally generated clamp in pixel periods (1-255).
 *  Duration - Clamp duration in pixel periods (1-255).
 *  Returns:
 *  A2D_OK
 *
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  ori	   21/10/2001  creation
 *
 */

TA2D_Result AD9887_SetClamp(TBYTE Placement, TBYTE Duration)
{
	TA2D_Result rc;

	if (Placement == 0 || Duration == 0)
		rc = A2D_IllegalValue;
	else
	  {
		rc = AD9887_Write(AD9887_CLPLACE, Placement);
		rc = AD9887_Write(AD9887_CLDUR, Duration);
		}

	return (rc);

} /* AD9887_SetClamp */
/******************************************************************************/

/******************************************************************************/
static TA2D_Result AD9887_Read(TAD9887_Registers Reg, TBYTE *Data)
{
	TA2D_Result rc = A2D_OK;
	T_I2CERROR i2c;

	i2c = I2CReadByte(I2C_AD9887, (TBYTE)Reg, Data, I2C_MAIN_BUS);
	if (i2c != I2C_OK)
		rc = A2D_NoResponse;

	return(rc);

}
/******************************************************************************/

/******************************************************************************/
static TA2D_Result AD9887_Write(TAD9887_Registers Reg, TBYTE Data)
{
	TA2D_Result rc = A2D_OK;
	T_I2CERROR i2c;

	i2c = I2CWriteByte(I2C_AD9887, (TBYTE)Reg, Data, I2C_MAIN_BUS);
	if (i2c != I2C_OK)
		rc = A2D_NoResponse;

	return(rc);

}
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *  AD9887_SetOutput- A2D module set output mode
 *
 *
 *  description:
 *  ------------
 *
 *  Sets single or parallel output
 *
 *  Protoype:
 *  ----------
 *  TA2D_Result AD9884A_SetOutput(int parallel)
 *  Where:
 *  Returns:
 *  A2D_OK or A2D_DeviceNotSupported
 *
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  Ori	22/10/2001  creation
 *
 */

TA2D_Result AD9887_SetOutput(int parallel)
{
	TA2D_Result rc = A2D_OK;
	union {
		TAD9887_ModeControl1 bits;
		TBYTE byte;
		} ModeControl1Val;

	if (rc == A2D_OK)
   {
		 rc = AD9887_Read(AD9887_MODCONTROL1, &ModeControl1Val.byte);
		 if (parallel)
		 {
			 ModeControl1Val.bits.chmode     = 1;		   /* Simoltaneous data */
			 ModeControl1Val.bits.outputmode = 1;		   /* Simoltaneous data */
		 }
		 else
		 {
			 ModeControl1Val.bits.chmode     = 0;		   /* single data */
			 ModeControl1Val.bits.outputmode = 0;		   /* mux  data */
		 }
		 rc = AD9887_Write(AD9887_MODCONTROL1, ModeControl1Val.byte);
   }


	return (rc);

}  /* AD9887_SetOutput */
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *
 *
 *  description:
 *  ------------
 *
 *  Get Input Format Not support in this modal
 *
 *  Protoype:
 *  ----------
 *  TA2D_Result AD9884A_SetOutput(int parallel)
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  ori	 22/10/2001  creation
 *
 */

static TA2D_InputFormat currentFormat = A2D_Graphics;
TA2D_Result AD9887_SetInputFormat(TA2D_InputFormat NewFormat)
{
	TA2D_Result rc = A2D_OK;

	if(NewFormat == A2D_Hdtv)
		AD9887_InitHdtv();
	else if (NewFormat == A2D_Graphics)
   	AD9887_InitGraphic();
	else if (NewFormat == A2D_DVI)
   	AD9887_InitDVI();
   currentFormat = NewFormat;
	return(rc);
}
/******************************************************************************/

/******************************************************************************/
TA2D_Result AD9887_GetInputFormat(TA2D_InputFormat *Format)
{
	TA2D_Result rc = A2D_OK;

   *Format = currentFormat;
	return(rc);
}
/******************************************************************************/

/******************************************************************************/
/*
 *  Copyright (c) 1999-2000 Oplus Technologies INC.  All Rights resreved.
 *
 *
 *
 *  description:
 *  ------------
 *
 *  Init the A/D to HDTV working parameters (YPbPr input)
 *
 *  Protoype:
 *  ----------
 *  static void AD9887_InitHdtv()
 *  history:
 *
 *  who  	when        what
 *  ---  	----------  ----
 *  ori	 22/10/2001  creation
 *
 */
static void AD9887_InitHdtv()
{
   union {
		TAD9887_ModeControl1 bits;   // 0x0E
		TBYTE byte;
	} ModeControl1Val;

	union {
		TAD9887_PllClampControl bits;   // 0x0F
		TBYTE byte;
	} PllClampControlVal;

	union {
		TAD9887_ModeControl2 bits;   // 0x10
		TBYTE byte;
	} ModeControl2Val;

   
   union {
		TAD9887_ActiveInterface bits;   // 0x12
		TBYTE byte;
	} ActiveInterfaceVal;

   union {
		TAD9887_ControlBits1 bits;   // 0x14
		TBYTE byte;
	} ControlBits1Val;

   union {
		TAD9887_ControlBits2 bits;   // 0x16
		TBYTE byte;
	} ControlBits2Val;

   union {
		TAD9887_VcoCurrent bits;   // 0x03
		TBYTE byte;
	} VcoCurrentVal;

   union {
		TAD9887_Phase bits;   // 0x04
		TBYTE byte;
	} PhaseVal;

   EVB_SwitchDataInput(0);   // set external mux for HDTV

   // Active interface
   AD9887_Read(AD9887_ACIN, &ActiveInterfaceVal.byte);
   ActiveInterfaceVal.bits.pwrdn     = 1;
   ActiveInterfaceVal.bits.coastsel  = 1;
   ActiveInterfaceVal.bits.actvsysel = 1; // Vsync on green
   ActiveInterfaceVal.bits.actvsyovr = 1; //  Vsync override
   ActiveInterfaceVal.bits.acthsyovr = 1; // Hsync override
   ActiveInterfaceVal.bits.acthsysel = 1; // Hsync on green
   ActiveInterfaceVal.bits.ais       = 0;
   ActiveInterfaceVal.bits.aio       = 1;
   AD9887_Write(AD9887_ACIN, ActiveInterfaceVal.byte);

   // pll divider control
   AD9887_Write(AD9887_PLLDIVM,      0x89);
   AD9887_Write(AD9887_PLLDIVL,      0x80);

   // VCO and current
   AD9887_Read(AD9887_VCO, &VcoCurrentVal.byte);
   VcoCurrentVal.bits.current = 3;
   VcoCurrentVal.bits.vcornge = 2;
   VcoCurrentVal.bits.reserved2 = 1;
   AD9887_Write(AD9887_VCO, VcoCurrentVal.byte);

   //Clock generator
   AD9887_Read(AD9887_PHASE, &PhaseVal.byte);
   PhaseVal.bits.phase = 6;
   AD9887_Write(AD9887_PHASE, PhaseVal.byte);

   //clamp timing
   AD9887_Write(AD9887_CLDUR,         0x0A);
   AD9887_Write(AD9887_CLPLACE,       0x28);

   // input gain
   AD9887_Write(AD9887_REDGAIN,      0x80);
   AD9887_Write(AD9887_GRNGAIN,      0x80);
   AD9887_Write(AD9887_BLUGAIN,      0x80);

   // input offset
   AD9887_Write(AD9887_REDOFST,      0x80);
   AD9887_Write(AD9887_GRNOFST,      0x80);
   AD9887_Write(AD9887_BLUOFST,      0x80);

   // mode control 1
   AD9887_Read(AD9887_MODCONTROL1, &ModeControl1Val.byte);
   ModeControl1Val.bits.vsyncinv =  1;
   ModeControl1Val.bits.abinv    =  1;
   ModeControl1Val.bits.outputmode =  1;
   ModeControl1Val.bits.chmode =  1; // dual pixel mode
  // ModeControl1Val.bits.hsyncpol = 0;

⌨️ 快捷键说明

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