📄 tmbsl1306.c
字号:
// store board if the config has been updated
g1306Instance[TunerUnit].config.uBoard = uValue;
break;
case CPUMP:
g1306Instance[TunerUnit].config.bCPump = (UInt8)uValue;
break;
default:
return TMBSL_ERR_TUNER_BAD_PARAMETER;
}
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl1306GetConfig:
//
// DESCRIPTION: Get the config of the 1306
//
// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
// TMBSL_ERR_TUNER_NOT_INITIALIZED
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306GetConfig(
tmUnitSelect_t TunerUnit, // I: Tuner unit number
UInt32 uItemId, // I: Identifier of the item to modify
UInt32* puValue // I: Value to set for the config item
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (TunerUnit > MAX_UNITS)
return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
// test the object
if (g1306Instance[TunerUnit].init == False)
return TMBSL_ERR_TUNER_NOT_INITIALIZED;
//--------------
// get the value
//--------------
switch((tm1306cfgIndex_t)uItemId)
{
case BOARD:
*puValue = g1306Instance[TunerUnit].config.uBoard;
break;
case CPUMP:
*puValue = g1306Instance[TunerUnit].config.bCPump;
break;
case GETNBOFUNIT:
*puValue = MAX_UNITS;
break;
default:
return TMBSL_ERR_TUNER_BAD_PARAMETER;
}
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl1306SetRf:
//
// DESCRIPTION: Set the PLL of the 1306
//
// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
// TMBSL_ERR_TUNER_NOT_INITIALIZED
// TMBSL_ERR_TUNER_BAD_PARAMETER
// TMBSL_ERR_IIC_ERR
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306SetRf(
tmUnitSelect_t TunerUnit, // I: Tuner unit number
UInt32 uRf // I: Frequency in hertz
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (TunerUnit > MAX_UNITS)
return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
// test the object
if (g1306Instance[TunerUnit].init == False)
return TMBSL_ERR_TUNER_NOT_INITIALIZED;
// don't test the RF to avoid side effect during scanning
//if(uRf < RF_MIN || uRf > RF_MAX)
// return TMBSL_ERR_TUNER_BAD_PARAMETER;
//--------------
// set the value
//--------------
// calculate the tuner reg
t1306CalcReg(&g1306Instance[TunerUnit], &uRf);
// printf("check1 time");
// write in the tuner
if (g1306Instance[TunerUnit].systemFunc.SY_Write(
g1306Instance[TunerUnit].uHwAddress,
0, NB_REGISTERS, g1306Instance[TunerUnit].pTunerReg) != 1)
return TMBSL_ERR_IIC_ERR;
// printf("check2 time");
// printf("tuner Address %x",g1306Instance[TunerUnit].uHwAddress);
// printf("data %x",g1306Instance[TunerUnit].pTunerReg->pTunerReg[2]);
// store value
g1306Instance[TunerUnit].uRfProg = uRf;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl1306GetRf:
//
// DESCRIPTION: Get the frequency programmed in the tuner
//
// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
// TMBSL_ERR_TUNER_NOT_INITIALIZED
// TM_OK
//
// NOTES: The value returned is the one stored in the object
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl1306GetRf(
tmUnitSelect_t TunerUnit, // I: Tuner unit number
UInt32* puRf // O: Frequency in hertz
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (TunerUnit > MAX_UNITS)
return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
// test the object
if (g1306Instance[TunerUnit].init == False)
return TMBSL_ERR_TUNER_NOT_INITIALIZED;
//--------------
// get the value
//--------------
// the read function can't be used
*puRf = g1306Instance[TunerUnit].uRfProg;
return TM_OK;
}
//-----------------------------------------------------------------------------
// Internal functions:
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// FUNCTION: t1306CalcReg:
//
// DESCRIPTION: Calculate the value to set in the registers of the tuner
//
// RETURN: always true
//
// NOTES: This function doesn't write in the tuner
//-----------------------------------------------------------------------------
//
Bool
t1306CalcReg (
ptm1306object_t p1306object, // I: tuner object
UInt32* puRf // IO: frequency in hertz
)
{
UInt32 uFreqPll;
UInt32 u32val;
UInt8 TUNERADDRESS = 0xC2; //default 4 pin , address open(0xC2) circuit.
UInt8 TUNERBYTE2 = 0x0B;
UInt8 TUNERBYTE3 = 0xF5;
UInt8 TUNERBYTE4 = 0xC2; //normal 4MHz, 166.66kHz
UInt8 TUNERBYTE5 = 0x78; //CP 122uA, UHF
UInt8 TUNERBYTE6 = 0x82; //AGC 220nA, 118dBuVpp
Int32 CP;
UInt32 X_tal;
UInt32 Ratio;
Int32 point; // AGC takeover point ( internal ) or select external mode
UInt32 RF_Step;
UInt32 N;
X_tal = 4000000;
*puRf -= 36130000; /* return into RF Input check - IF */
//printf(" Frequency %d",*puRf);
//getch();
if(*puRf <=56000000)
{
CP=2 ; //54uA
}
else if(*puRf <=108000000)
{
CP=3; //83uA
}
else if(*puRf <=120000000)
{
CP=4; //122uA
}
else if(*puRf <=140000000)
{
CP=5; //163uA
}
else if(*puRf <=148000000)
{
CP=6; //254uA
}
else if(*puRf <=175000000)
{
CP=7; //400uA
}
else if(*puRf <=188000000)
{
CP=2 ; //54uA
}
else if(*puRf <=260000000)
{
CP=3; //83uA
}
else if(*puRf <=344000000)
{
CP=4; //122uA
}
else if(*puRf <=368000000)
{
CP=5; //163uA
}
else if(*puRf <=436000000)
{
CP=6; //254uA
}
else if(*puRf <=471000000)
{
CP=7; //400uA
}
else if(*puRf <=568000000)
{
CP=4; //122uA
}
else if(*puRf <=640000000)
{
CP=5; //163uA
}
else if(*puRf <=716000000)
{
CP=6; //254uA
}
else if(*puRf <=870000000)
{
CP=7; //400uA
}
else
{
}
switch(CP)
{
case(1):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
break;
case(2):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0x20;
break;
case(3):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0x40;
break;
case(4):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0x60;
break;
case(5):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0x80;
break;
case(6):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0xA0;
break;
case(7):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0xC0;
break;
case(8):
TUNERBYTE5=TUNERBYTE5 & 0x1F;
TUNERBYTE5=TUNERBYTE5 | 0xE0;
break;
default:
break;
}
if(*puRf <=175000000)
{
TUNERBYTE5 =(TUNERBYTE5&0xf0) + 0x01 ; //VHF LOW
}
else if(*puRf <=471000000)
{
TUNERBYTE5 = (TUNERBYTE5 &0xf0) + 0x02; //VHF
}
else if(*puRf <=900000000)
{
TUNERBYTE5 = (TUNERBYTE5 & 0xf0) + 0x04; //UHF
}
else
{
}
/* part CP & Band control */
/* printf("0 --> Ratio : 2MHz, 62.5 kHz step\n");
printf("1 --> Ratio : 4MHz, 142.86kHz step\n");
printf("2 --> Ratio : 4MHz, 166.67kHz step\n");
printf("3 --> Ratio : 1MHz, 50 kHz step\n");
printf("4 --> Ratio : 4MHz, 125 kHz step\n");
*/
/* case(0x00): 62.5kHz step size QAM or Analogue Demod */
TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
//break;
/* case(0x01):
TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
TUNERBYTE4 = (TUNERBYTE4 | 0x01);
break;
case(0x02):
TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
TUNERBYTE4 = (TUNERBYTE4 | 0x02);
break;
case(0x03):
TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
TUNERBYTE4 = (TUNERBYTE4 | 0x03);
break;
case(0x04):
TUNERBYTE4 = (TUNERBYTE4 & 0xF8);
TUNERBYTE4 = (TUNERBYTE4 | 0x04);
break;
default:
break;
*/
/* case(0x00): */
Ratio = 64;
//break;
/* case(0x01):
Ratio = 28.;
break;
case(0x02):
Ratio = 24.;
break;
case(0x03):
Ratio = 80.;
break;
case(0x04):
Ratio = 32.;
*/
// OSC = *puRf + 36130000;
*puRf += 36130000; /* check + IF */
RF_Step = X_tal/Ratio;
p1306object->uPllStep = RF_Step;
N = (UInt32) ( (*puRf/RF_Step) ) & 0x7FFF;
if(((*puRf*10/RF_Step ) - (*puRf/RF_Step)*10) >= 5)
N = N + 1;
/* printf("%f, %x",temp_val,(long)temp_val);
getch();
*/
TUNERBYTE2 = (0x7F) & (N>>8);
TUNERBYTE3 = 0xFF & N;
/* AGC part */
/* printf("AGC take-over point\n");
printf("0 --> 124dBuVpp\n");
printf("1 --> 121dBuVpp\n");
printf("2 --> 118dBuVpp, default mode at POR\n");
printf("3 --> 115dBuVpp\n");
printf("4 --> 112dBuVpp\n");
printf("5 --> 109dBuVpp\n");
printf("6 --> Iagc=0, External AGC\n");
printf("7 --> Vagc=3.5V, Disabled\n");
*/
point = 3; // 112dBuVpp -- measurement
// point = 7; // 112dBuVpp max voltage adjustment. 炼沥侩.
TUNERBYTE6 = (TUNERBYTE6&0xF8) | point; //-- measurement
// TUNERBYTE4 = (TUNERBYTE4 | 0xF0); //charge pump sinking current adjustment. 炼沥侩.
/* printf("AGC time constant bit\n");
printf("0 --> Iagc=220nA, T=2s with C=150nF(normal)\n");
printf("1 --> Iagc=9uA, T=50ms with C=150nF\n");
*/
// if(AGC_T==1)
// TUNERBYTE6|=(AGC_T<<3);
//else if(AGC_T==0)
TUNERBYTE6&=(0xF7);
p1306object->pTunerReg[0] = TUNERBYTE2;
p1306object->pTunerReg[1] = TUNERBYTE3;
p1306object->pTunerReg[2] = TUNERBYTE4;
p1306object->pTunerReg[3] = TUNERBYTE5;
p1306object->pTunerReg[4] = TUNERBYTE6;
#if 0
/* TDA6651 200MHZ */
p1306object->pTunerReg[0] = 0x05;
p1306object->pTunerReg[1] = 0x89;
p1306object->pTunerReg[2] = 0xc2;
p1306object->pTunerReg[3] = 0x52;
p1306object->pTunerReg[4] = 0x85;
#endif
#if 1
for(u32val=0;u32val<5;u32val++)
printf("data 0x%X 0x%X ", u32val, p1306object->pTunerReg[u32val]);
#endif
//----------
// byte n...
//----------
return True;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -