/*C**************************************************************************
* NAME: RADIO.c
*----------------------------------------------------------------------------
* Copyright (c) 2005 zhuqiao.
*----------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*----------------------------------------------------------------------------
* PURPOSE:
* This is the software for A2394+DSA main program
*****************************************************************************/
#include <complier.h>
#include <global.h>
#include <radio.h>
void Send_Tuner (void);
/*F**************************************************************************
* NAME: Write_Byte
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* Write to lc72131Byte routine
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void Write_Byte(Byte bByte)
{
Byte i;
for(i = 0;i < 8;i++)
{
T_CL = 0;
if(bByte & 0x01) T_DI = 1;
else T_DI = 0;
T_CL = 1;
bByte >>= 1;
}
}
void write_24bit_data(void) //写lc72131 8byte
{
T_CE = 0; //命令模式
Write_Byte(RADIO_MODE_IN1);
T_CE = 1; //数据模式
Write_Byte(WriteData[0]);
Write_Byte(WriteData[1]);
Write_Byte(WriteData[2]);
T_CE = 0;
Write_Byte(RADIO_MODE_IN2);
T_CE = 1;
Write_Byte(WriteData[3]);
Write_Byte(WriteData[4]);
Write_Byte(WriteData[5]);
T_CE = 0;
}
DWORD Read_DATA() //读lc72131 3byte
{
BYTE i;
DWORD out_temp=0;
T_CE = 0;
//T_CL = 0;
Write_Byte(RADIO_MODE_OUT);
T_CE = 1;
T_CL = 0;
for(i=0;i<24;i++)
{
out_temp <<= 1;
T_CL = 1;
if(T_DO) out_temp |= 0x01;
T_CL = 0;
}
return out_temp;
}
/************************************************
*
* initial set
*
************************************************/
void radio_init()
{
Byte i;
for (i=0;i<6;i++)
{
WriteData[i]=0;
}
if(Band ==RADIO_BAND_FM)
{
// 8bit :(H)SNS DVS CTE XS RO R1 R2 R3(L)
// bit :(H) R3 R2 R1 R0 XS CTE DVS SNS (L) ZHUQIAO
// 0001 $ 0010b
WriteData[2] = 0x12; //0001=>ref=50//0011=>ref=25 FM: SNS DVS :* 1;COUNTER RESET: CTE=0; 4.5MHZ XS=0; PLL_FREQ 50KHZ R0R1R2R3=1100;
//(H)IOC1 IOC2 IO1 IO2 BO1 BO2 BO3 BO4(L)
// (H) BO4 BO3 BO2 BO1 IO2 IO1 IOC2 IOC1 (L)
// 1010 $ 0011b
WriteData[3] = 0xa3;
//(H)BO5 DOC0 DOC1 DOC2 UL0 UL1 DZ0 DZ1(L)
// (H) DZ1 DZ0 UL1 UL0 DOC2 DOC1 DOC0 BO5 (L)
// 1111 $ 0100b
WriteData[4] = 0xf4;
//(H)GT0 GT1 TBC DLC IFS TEST0 TEST1 TEST2(L)
// (H) TEST2 TEST1 TEST0 IFS DLC TBC GT1 GT0 (L)
// 0001 $ 0000b
WriteData[5] = 0x10; //GT=4ms
}
else
if(Band ==RADIO_BAND_AM)
{
// bit :(H) R3 R2 R1 R0 XS CTE DVS SNS (L) ZHUQIAO
// 1000 $ 0000b
WriteData[2] = AM_WRITE_2; //0x80 ref=10khz//0x90 ref=9k wM: SNS DVS :00;COUNTER RESET: CTE=0; 4.5MHZ XS=0; PLL_FREQ=10KHZ R0R1R2R3=0001;
// (H) BO4 BO3 BO2 BO1 IO2 IO1 IOC2 IOC1 (L)
// 1001 $ 0011b
WriteData[3] = 0x93;
// (H) DZ1 DZ0 UL1 UL0 DOC2 DOC1 DOC0 BO5 (L)
// 1111 $ 0100b
WriteData[4] = 0xf4;
// (H) TEST2 TEST1 TEST0 IFS DLC TBC GT1 GT0 (L)
// 0001 $ 0000b
WriteData[5] = 0x10; //GT=4ms
}
}
/************************************************
*
* When the FREQ value of FM is multi 100 of infact
* It is __wFreq * 10^2 KHz
*
************************************************/
void SetFreq(void) //设定分频值
{
wFreq=0;
if(Band== RADIO_BAND_AM)
{
wFreq=(AMFreq+AM_IF_FREQ)/AM_FREQ_REF; //9;
WriteData[0] =LOBYTE(wFreq<<4);//(freq%256)<<4;//LOBYTE(AMreal);
WriteData[1] =LOBYTE(wFreq>>4);//freq/16;//HIBYTE(AMreal);
}
else
{
wFreq=(FMFreq+FM_IF_FREQ)/FM_FREQ_REF;//10//=> (freq+ IF)*10/50/2 ..........//5;//*2;///25/2;
WriteData[0] =LOBYTE(wFreq);//freq%256;//
WriteData[1] =HIBYTE(wFreq); //freq/256;//
}
}
/*****************************************
FUNCTION
*****************************************/
void use_init()
{
preset_flag=0;
mem_flag=0;
radio_init();
Send_Tuner (); //指定调谐频率
}
void BandSel(void) //波段选择
{
if(Band ==RADIO_BAND_AM)
{
Band=RADIO_BAND_FM;
FM_location=1;
}
else
{
Band=RADIO_BAND_AM;
AM_location=1;
}
#ifdef USE_24C02
Wsave[0]=Band;//FAM_flag;
Write24c02(1,FAMBase);
#endif
use_init();
}
void freq_init(void) //读上次保存频率
{
wFreq=0;
#ifdef USE_24C02
Read24c02(1,FAMBase);
if(Rsave[0]) Band=1;
else Band=0;
Read24c02(2,100);
AMFreq=Rsave[0]*256+Rsave[1]; //vco
Rsave[0]=0;
Rsave[1]=0;
Read24c02(2,10);
FMFreq= Rsave[0]*256+Rsave[1]; //10620; vco
#endif
}
#ifdef USE_24C02
void SaveFreq(Byte n) //保存当前频率
{
if(Band==RADIO_BAND_AM)
{
Wsave[0]=AMFreq/256;
Wsave[1]=AMFreq%256;
Write24c02(2,(100+(n*2)));
}
else
{
Wsave[0]=FMFreq/256;
Wsave[1]=FMFreq%256;
Write24c02(2,(10+(n*2)));
}
}
#endif
void Send_Tuner (void) // 发送指定调谐频率 并保存
{
if(Band==RADIO_BAND_AM){
if(AMFreq<AM_BEGIN_FRQ)
AMFreq=AM_BEGIN_FRQ;
else
if(AMFreq>AM_END_FRQ)
AMFreq=AM_END_FRQ;
}
else {
if(FMFreq<FM_BEGIN_FRQ)
FMFreq=FM_BEGIN_FRQ;
else
if(FMFreq>FM_END_FRQ)
FMFreq=FM_END_FRQ;
}
#ifdef USE_24C02
SaveFreq(0);
#endif
SetFreq();
write_24bit_data();
}
void change_freq(BIT up) //改变一个步长
{
if(Band==RADIO_BAND_FM)
{
if(up)
{
FMFreq +=FM_STEP;
if(FMFreq>FM_END_FRQ) FMFreq=FM_BEGIN_FRQ;
}
else
{
FMFreq -=FM_STEP;
if(FMFreq<FM_BEGIN_FRQ) FMFreq=FM_END_FRQ;
}
}
else
{
if(up)
{
AMFreq +=AM_STEP;
if(AMFreq>AM_END_FRQ) AMFreq=AM_BEGIN_FRQ;
}
else
{
AMFreq -=AM_STEP;
if(AMFreq<AM_BEGIN_FRQ) AMFreq=AM_END_FRQ;
}
}
}
void tune_up_down(Bit up) //单步搜索
{
preset_flag=0;
mem_flag=0;
change_freq(up);
Send_Tuner();
}
void mem_key() //保存预设节目
{
if(mem_flag)
{
mem_flag = 0;
#ifdef USE_24C02
if(Band==RADIO_BAND_AM)
SaveFreq(AM_location);
else SaveFreq(FM_location);
#endif
}
else
{
mem_flag = 1;
preset_flag=1;
}
}
void Call_save_freq (void) //调用预置频率/保存预置频率
{
preset_flag=1;
if(Band==RADIO_BAND_AM)
{
if(AM_location<20)
AM_location++;
else AM_location=1;
if(mem_flag) return;
else
{
#ifdef USE_24C02
Read24c02(2,(50+(AM_location*2)));
AMFreq=Rsave[0]*256+Rsave[1];
#endif
}
}
else
{
if(FM_location<20)
FM_location++;
else FM_location=1;
if(mem_flag) return;
else
{
#ifdef USE_24C02
Read24c02(2,(10+(FM_location*2)));
FMFreq=Rsave[0]*256+Rsave[1];
#endif
}
}
Send_Tuner();
}
BIT st_flag=0;
void set_STEREO() //BO3 bit
{
flash_flg=1;
st_flag=~st_flag;
if(st_flag) WriteData[3] &=~0x40; // low mono
else WriteData[3] |=0x40; // high stereo
write_24bit_data();
vfd_st_mono(st_flag);
}
void Delayms(BYTE temp)
{
unsigned char i;
while(--temp)
{
i=170;
while(--i);
}
}
DWORD Auto_check()
{
unsigned char looptime=0;
WriteData[3]&=~0x80;
WriteData[5]|=0x03;//0x02
WriteData[2]&=~0x04;
SetFreq();
write_24bit_data();
T_CE=1;
WriteData[2]|=0x04; //CTE :1
write_24bit_data();
Delayms(70);
do
{
looptime++;
if(looptime>100) break; //10