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

📄 radio.c

📁 这是用W77E58编写的控制GSM模块
💻 C
字号:
/* YuanGao electronic designe co.ldt
   (c) Copyright 2000,2001, All Rights Reserved  */

#include "global.h"
#include "util.h"
#include "radio.h"
#include "lcd.h"
#include "mem9346.h"


/*R3 to R0:*/
#define   STEP_9KHZ        0x900000
#define   STEP_25KHZ       0x320000

#define   F50KHZ           25
#define   F9KHZ             9

#define   AM_531KHZ        531
#define   AM_1621KHZ       1621
#define   FM_87P5MHZ       87500
#define   FM_108MHZ        108000

#define   ADDR_IN1_MODE        0x28
#define   ADDR_IN2_MODE        0x29
#define   ADDR_OUT_MODE        0x2a

#define   CTE_ENABLE           1


unsigned long Divisor;       /*P0 to P15 */
    #define   AM_DIV_MIN          4              /* DVS SNS = 00 */
    #define   AM_DIV_MAX          4095           
    #define   SW_DIV_MIN          272            /* DVS SNS = 01 */
    #define   SW_DIV_MAX          65535
    #define   FM_DIV_MIN          272            /* DVS SNS = 1* */
    #define   FM_DIV_MAX          65535

#define CPU_4M5HZ       0x00
#define CPU_7M2HZ       0x08



/*PLL fref:select the refrence frequency:by R0 to R3 */
unsigned long           PLL_fref = STEP_25KHZ;


unsigned char Band;
unsigned char Chanel = 0;
unsigned char Crystal;

unsigned long address;


bit bdata  STEREO_FLAG = 0;

#define   SET_RADIO_CE         RADIO_CE     = HIGH
#define   SET_RADIO_CL         RADIO_CL     = HIGH  
#define   SET_RADIO_DI         RADIO_DI     = HIGH  
#define   SET_RADIO_CS_TUN     RADIO_CS_TUN = HIGH  
#define   SET_RADIO_FM_ST      RADIO_FM_ST  = HIGH  
#define   SET_RADIO_MUTE       RADIO_MUTE   = HIGH  

#define   CLEAR_RADIO_CE       RADIO_CE     = LOW  
#define   CLEAR_RADIO_CL       RADIO_CL     = LOW  
#define   CLEAR_RADIO_DI       RADIO_DI     = LOW  
#define   CLEAR_RADIO_CS_TUN   RADIO_CS_TUN = LOW  
#define   CLEAR_RADIO_FM_ST    RADIO_FM_ST  = LOW  
#define   CLEAR_RADIO_MUTE     RADIO_MUTE   = LOW  



void Radio_init(void)
{                             

             address = 0x11A000;             /* 0x100000 */

             SET_RADIO_CL;
             CLEAR_RADIO_CE;
             CLEAR_RADIO_DI;

             RADIO_write_address(ADDR_IN2_MODE);
             RADIO_output_byte(0x11A180);             /* (AM/FM).FM = 11A180; (FM/AM).AM = 11A010 */

             Program_Search();

             RADIO_write_address(ADDR_IN1_MODE);
             RADIO_output_byte(0x360922);                   /* 0x040000 */

}


bit   Program_Search(void)
{

             unsigned long VCO;

             if(Band == AM_IN){
                VCO = (Divisor+ 450)/F9KHZ;           /* F9KHZ = 9 */
             }
             else{                                    /* Band == FM_IN */
                VCO = (Divisor+ 10700)/F50KHZ/2;      /* Divisor = 106200(106.2MHz) */
             }                                        /* VCO(DEC=HEX) =0x000922 */

             if(Band == AM_IN){
                VCO <<= 4;
                VCO = VCO|0x900000;    /*0x900000????? jy*/
             } else {
                VCO = PLL_fref|VCO;                      /* PLL_fref = STEP_25KHZ = 0x320000; */
             }
             RADIO_write_address(ADDR_IN1_MODE);
             RADIO_output_byte(VCO);

             RADIO_write_address(ADDR_IN1_MODE);
             RADIO_output_byte(VCO | 0x040000);

             if(!RADIO_TUNER_ON) return 1;
             else return 0;

}



void Radio_Band(void)
{

          if(Band == FM_IN) {
             Band = AM_IN;
             PLL_fref = STEP_9KHZ;
             Divisor = AM_531KHZ;

             RADIO_write_address(ADDR_IN2_MODE);
             RADIO_output_byte(0x11A010);             /* (AM/FM).FM = 11A180; (FM/AM).AM = 11A010 */

          }
          else{

             Band = FM_IN;
             PLL_fref = STEP_25KHZ; 
             Divisor = FM_87P5MHZ;

             RADIO_write_address(ADDR_IN2_MODE);
             RADIO_output_byte(0x11A180);             /* (AM/FM).FM = 11A180; (FM/AM).AM = 11A010 */

          }

}


void Radio_Divisor(unsigned char dir)
{

              if(dir){                                    /* auto search */
                 if(Band == AM_IN){
                    if(Divisor >= AM_1621KHZ) {
                       Divisor = AM_531KHZ;
                    }
                    else Divisor += F9KHZ;
                 }
                 else{                                   /* Band == FM_IN */
                    if(Divisor >= FM_108MHZ) {
                       Divisor = FM_87P5MHZ;
                    }
                    else Divisor += F50KHZ*2;
                 }
              }
              else{                                       /* no auto search */
                 if(Band == AM_IN){
                    if(Divisor <= AM_531KHZ) {
                       Divisor = AM_1621KHZ;
                    }
                    else Divisor -= F9KHZ;
                 }
                 else{
                    if(Divisor <= FM_87P5MHZ) {
                       Divisor = FM_108MHZ;
                    }
                    else Divisor -= F50KHZ*2;
                 }

              }
}


#if 0
void Radio_FM_on(unsigned char FMAM)
{
       if(FMAM){                  /*BO4*/
       
          address &= 0xFFFF0F;
          address |= 0x000080;
        
       }else
        
          address &= ~0x000080;
        
       RADIO_write_address(ADDR_IN2_MODE);
       RADIO_output_byte(address);
}
#endif


/***********************************************************************
*                        LC72130 input/output byte command             *
*                                                                      *
************************************************************************/
void RADIO_write_address(unsigned char RADIO_addr)
{
        unsigned char i;
        for(i=0;i<8;i++){


            if( RADIO_addr & 0x01)
                SET_RADIO_DI;
            else 
                CLEAR_RADIO_DI;

            CLEAR_RADIO_CL;
            CLEAR_RADIO_CL;
            RADIO_addr >>= 1;
            SET_RADIO_CL;

        }

}


void RADIO_output_byte(unsigned long RADIO_data)
{
        unsigned char i;
        SET_RADIO_CE;

        for(i=0; i<24; i++){
          if( RADIO_data & 0x01)
            SET_RADIO_DI;
          else 
            CLEAR_RADIO_DI;
            CLEAR_RADIO_CL;
            CLEAR_RADIO_CL;
            RADIO_data >>= 1;
            SET_RADIO_CL;
        }
        CLEAR_RADIO_CE;

}


⌨️ 快捷键说明

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