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

📄 zl10353.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 Copyright (c) Afe Labs 2005

	All rights are reserved. Reproduction in whole or in parts is
    prohibited without the prior written consent of the copyright owner.
   ----------------------------------------------------------------------

    Module: ZL10353.C

    Purpose: Zarlink ZL10353 programming procedure

    Version: 2.2

    Compiler: Keil 8051 C Compiler v6.20

    Reference:
    [1] Keil C51 Compiler User's Guide 01.97, Keil Software, Inc.
    [2] ZL10353 Design Manual, March 2005, Revision number 1.03

   ----------------------------------------------------------------------
    Modification:

    Date	 Author 	 Reason (what and why)
    July 10 '05  Laser           Original.
    Oct 11 '05   Laser           Add ZL10353 Signal Lock
    Oct 19 '05   Laser           Modify ZL10353 programming procedure
    Dec 17 '05   Laser           Add ZL10353 Frequency Offset read
    Jan 13 '06   Laser/Peter     Fix the bug of BW=6,64QAM,8K,CR=7/8,GI=1/4

   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

#define _ZL10353_C_

/* ------------------------------------
    Header Files
   ------------------------------------ */
#include "datatype.h"
#include "drviic.h"
#include "drvtimer.h"
#include "ZL10353.h"
#include "RF_Tuner_DVB.h"
/* ------------------------------------
    Macro Definitions
   ------------------------------------ */


/* ------------------------------------
    Type Definitions
   ------------------------------------ */


/* ------------------------------------
    Variables Definitions
   ------------------------------------ */
static U8 u8addr;
static U8 au8Data[5];


/* ------------------------------------
    Function Prototypes
   ------------------------------------ */


/***********************************************************************************
  Subject:    ZL10353 Power On Initialization
  Function:   ZL10353_Power_On_Initialization
  Parmeter:   None
  Return:     0(FAIL) mean I2C fail, 1(PASS) mean I2C success
  Remark:     ZL10353 Power On default is as the following
		Crystal=20.48MHz
		IF=36.1667MHz
		BW=6MHz
************************************************************************************/
BOOLEAN ZL10353_Power_On_Initialization ( void )
{
	//Config, Register 0x50 (MPEG_EN, ADC_EN, Logic_EN)
	//Set ZL10353 System Clock with 20.48MHz, Register 0x51/0x52/0x53/0x54
	u8addr = 0x50;
	au8Data[0] = 0x0B;
	au8Data[1] = 0x04; //normal ADC sampling rate
	#if TS_CLK_INV
	au8Data[1] &= ~BIT6; //Invert Clock
	#else
	au8Data[1] |= BIT6;  //Normal Clock
	#endif

	#if TS_PARALLEL_OUTPUT
	au8Data[1] &= ~BIT5;  //Parallel Output
	#else
	au8Data[1] |= BIT5; //Serial Output
	#endif

	au8Data[2] = 0x46;
	au8Data[3] = 0x15;
	au8Data[4] = 0x0F;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 5, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Wait 200us for PLL is stable !
	MDrv_Timer_Delayms( 1 );

	//Full software reset, Register 0x55
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x55, 0x80 ) == FALSE)
	{
		return FAIL;
	}

	//ADC_Ctl, Register 0xEA (0-->1-->0)
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0xEA, 0x01 ) == FALSE)
	{
		return FAIL;
	}
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0xEA, 0x00 ) == FALSE)
	{
		return FAIL;
	}

	//??????, Register 0x9C
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x9C, 0xA1 ) == FALSE)
	{
		return FAIL;
	}

	//Initializate ZL10353 coefficient table for Bandwidth=6MHz
	if( ZL10353_6M_BW_Coefficient_Write() == FALSE)
	{
		return FAIL;
	}

	//******Set both RF AGC and IF AGC output by default in ZL10353 ******
	//AGC_Ctl_5, Register 0x8E
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x8E, 0x00 ) == FALSE)
	{
		return FAIL;
	}

	//AGC_IF_LOLIM, Register 0x90
	//AGC_RF_HILIM, Register 0x91
	//AGC_IF_Max, Register 0x92
	//AGC_IF_Min, Register 0x93 (IF_Min)
	//AGC_RF_Max, Register 0x94 (RF_Max)
	u8addr = 0x90;
	au8Data[0] = 0x00;
	au8Data[1] = 0xFF;
	au8Data[2] = 0xFF;
	au8Data[3] = 0x00;
	au8Data[4] = 0xFF;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 5, au8Data) == FALSE )
	{
		return FAIL;
	}

	//AGC_RF_Min, Register 0x58 (RF_Min)
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x58, 0x00 ) == FALSE)
	{
		return FAIL;
	}
	//AGC_KIF, Register 0x95
	//AGC_KRF, Register 0x96
	u8addr = 0x95;
	au8Data[0] = 0x3F;
	au8Data[1] = 0x3F;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//OP_Ctrl_0, Register 0x5A (RF_Lev disable, AGC2 Enabled, BKEER_Inv=1)
	//Set 0x4C if RF AGC disable

    if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x5A, 0x4C ) == FALSE)
	{
		return FAIL;
	}

	//********************************************************************

	//CAPT_Range, Register 0x5F
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x5F, 0x12 ) == FALSE)
	{
		return FAIL;
	}

	//ACQ_Ctl, Register 0x5E
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x5E, 0x40 ) == FALSE)
	{
		return FAIL;
	}

	//IF Frequency Setting(IF=36.1667MHz and F_ADC=45.056MHz)
	//If using XC3028, this two register value need to be change in order to meet XC3028 IF=4.57MHz.
	//Please contact with AFe Lab to get further information !
	//Register 0x6C/0x6D
	u8addr = 0x6C;
	au8Data[0] = 0xCD;
	au8Data[1] = 0x7E;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	#if 0 //leo_04042006 no need to do it
	//Set bandwidth of ZL10353 with default 6MHz
	if( ZL10353_BW_Programming( BW_6_MHz ) == FALSE)
	{
		return FAIL;
	}
	#endif

	//FSM_GO, Register 0x71
	if( ZL10353_FSM_Restart()== FALSE)
	{
		return FAIL;
	}

	#if 0
	au8Data[0]=RF_Tuner_Address;
	au8Data[1]=0;
	au8Data[2]=0;
	au8Data[3]=0xD8;
	au8Data[4]=0x20;
	ZL10353_Tuner_Programming( au8Data );
	#endif

	return PASS;
}

/************************************************************************************************
  Subject:    ZL10353 Bandwidth Programming
  Function:   ZL10353_BW_Programming
  Parmeter:   BW
		  0 --> 6MHz Bandwidth
		  1 --> 7MHz Bandwidth
		  2 --> 8MHz Bandwidth
  Return:     0(FAIL) mean I2C fail, 1(PASS) mean I2C success
  Remark:     This function is using only with Crystal of ZL10353 is 20.48MHz
*************************************************************************************************/
BOOLEAN ZL10353_BW_Programming ( U8 BW )
{
	//Bandwidth Setting(20.48MHz Xtal), Register 0x64,0x65,0x66,0xCC
	switch ( BW )
	{
		case BW_6_MHz:
			au8Data[0] = 0x30; au8Data[1] = 0x4D;
			au8Data[2] = 0xEC; au8Data[3] = 0xDD;
			break;
		case BW_7_MHz:
			au8Data[0] = 0x35; au8Data[1] = 0x5A;
			au8Data[2] = 0xE9; au8Data[3] = 0x73;
			break;
		case BW_8_MHz:
			au8Data[0] = 0x36; au8Data[1] = 0x67;
			au8Data[2] = 0xE5; au8Data[3] = 0x73;
			break;
	}
	//BW_CTL, Register 0x64
	//TRL_Nominal_Rate (1,0), Register 0x65/0x66
	u8addr = 0x64;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 3, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Register 0xCC
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0xCC, au8Data[3] ) == FALSE )
	{
		return FAIL;
	}

	switch ( BW )
	{
		case BW_6_MHz:
			au8Data[0] = 0x06; au8Data[1] = 0x07;
			au8Data[2] = 0x31;
			break;
		case BW_7_MHz:
		case BW_8_MHz:
			au8Data[0] = 0x20; au8Data[1] = 0x03;
			au8Data[2] = 0x2B;
			break;
	}

	//Register 0xDC, 0xDD
	//fix the bug of BW=6, 64QAM, 8K, CR=7/8, GI=1/4 or 1/8
	u8addr = 0xDC;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//IF_AGC_Targets, Register 0x56
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x56, au8Data[2] ) == FALSE )
	{
		return FAIL;
	}

	//MCLK_Ctl, Register 0x5C
	switch ( BW )
	{
		case BW_6_MHz:
			au8Data[0] = 0x9C;
			break;
		case BW_7_MHz:
			au8Data[0] = 0x86;
			break;
		case BW_8_MHz:
			au8Data[0] = 0x75;
			break;
	}
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x5C, au8Data[0] ) == FALSE )
	{
		return FAIL;
	}

	//FSM_GO, Register 0x71
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x71, 0x01 ) == FALSE )
	{
		return FAIL;
	}

	return PASS;
}

/************************************************************************************************
  Subject:    ZL10353_6M_BW_Coefficient_Write
  Function:   ZL10353_6M_BW_Coefficient_Write
  Parmeter:   None
  Return:     0(FAIL) mean I2C fail, 1(PASS) mean I2C success
  Remark:     It's using on BW=6 of ZL10353 shadow table (ZL10353 default table is 7/8MHz)
*************************************************************************************************/
BOOLEAN ZL10353_6M_BW_Coefficient_Write ( void )
{
	//UPIF_ELPFIL_COEFF_WRITE=1, OFDM_BW=0
	if( MDrv_IIC_WriteByte( ZL10353_devAddr, 0x64, 0x3C ) == FALSE )
	{
		return FAIL;
	}

	//Addr=0, New Coefficient is 1204
	u8addr = 0x9A;
	au8Data[0] = 0xB4;
	au8Data[1] = 0x04;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
 	{
		return FAIL;
	}

	//Addr=1, New Coefficient is -1587
	//u8addr = 0x9A;
	au8Data[0] = 0xCD;
	au8Data[1] = 0x19;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
 	{
		return FAIL;
	}

	//Addr=2, New Coefficient is 647
	//u8addr = 0x9A;
	au8Data[0] = 0x87;
	au8Data[1] = 0x22;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=3, New Coefficient is -579
	//u8addr = 0x9A;
	au8Data[0] = 0xBD;
	au8Data[1] = 0x3D;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=4, New Coefficient is -1511
	//u8addr = 0x9A;
	au8Data[0] = 0x19;
	au8Data[1] = 0x4A;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=5, New Coefficient is 777
	//u8addr = 0x9A;
	au8Data[0] = 0x09;
	au8Data[1] = 0x53;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=6, New Coefficient is -1087
	//u8addr = 0x9A;
	au8Data[0] = 0xC1;
	au8Data[1] = 0x6B;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=7, New Coefficient is -1444
	//u8addr = 0x9A;
	au8Data[0] = 0x5C;
	au8Data[1] = 0x7A;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=8, New Coefficient is 907
	//u8addr = 0x9A;
	au8Data[0] = 0x8B;
	au8Data[1] = 0x83;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=9, New Coefficient is -1225
	//u8addr = 0x9A;
	au8Data[0] = 0x37;
	au8Data[1] = 0x9B;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=10, New Coefficient is -1426
	//u8addr = 0x9A;
	au8Data[0] = 0x6E;
	au8Data[1] = 0xAA;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=11, New Coefficient is 991
	//u8addr = 0x9A;
	au8Data[0] = 0xDF;
	au8Data[1] = 0xB3;
	if( MDrv_IIC_WriteBytes(ZL10353_devAddr, 1, &u8addr, 2, au8Data) == FALSE )
	{
		return FAIL;
	}

	//Addr=12, IPSHIFTS=4, OPSHIFTS=-2
	//u8addr = 0x9A;

⌨️ 快捷键说明

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