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

📄 tea5767收音模块源码.txt

📁 这个是一个收音盒的驱动程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
}

void fmw_search_dir_rtn(unsigned char dir)
{
 if(dir) fm_wr_byte[2] |= 0x80;
 else fm_wr_byte[2] &= 0x7f;
}

void fmw_search_level_rtn(unsigned char level)
{
 switch(level)
 {
  case all_level : fm_wr_byte[2] &= 0x9f;
         break;
  case lo_level :  fm_wr_byte[2] &= 0xbf;
         fm_wr_byte[2] |= 0x20;
         break;
  case mid_level : fm_wr_byte[2] |= 0x40;
         fm_wr_byte[2] &= 0xdf;
         break;
  case hi_level  : fm_wr_byte[2] |= 0x60;
         break;
 }
}

void fmw_stereo_rtn(unsigned char onoff)
{ 
 if(onoff) fm_wr_byte[2] &= 0xf7;
 else   fm_wr_byte[2] |= 0x08;
}

void fmw_mute_left_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[2] |= 0x04;
 else   fm_wr_byte[2] &= 0xfb;
}

void fmw_mute_right_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[2] |= 0x02;
 else   fm_wr_byte[2] &= 0xfd;
}

void fmw_stand_by_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[3] |= 0x40;
 else   fm_wr_byte[3] &= 0xbf;
}

void fmw_band_sel_rtn(unsigned char sel)
{
 if(sel) fm_wr_byte[3] |= 0x20;
 else    fm_wr_byte[3] &= 0xdf;
}

void fmw_xtal_sel_rtn(unsigned char sel)
{
 if(sel) fm_wr_byte[3] |= 0x10;
 else    fm_wr_byte[3] &= 0xef;
}

void fmw_soft_mute_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[3] |= 0x08;
 else   fm_wr_byte[3] &= 0xf7;
}

void fmw_hcc_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[3] |= 0x04;
 else   fm_wr_byte[3] &= 0xfb;
}

void fmw_snc_rtn(unsigned char onoff)
{
 if(onoff) fm_wr_byte[3] |= 0x02;
 else   fm_wr_byte[3] &= 0xfd;
}

void fmw_search_indi_rtn(unsigned char sel)
{
 if(sel) fm_wr_byte[3] |= 0x01;
 else fm_wr_byte[3] &= 0xfe;
}

void fmw_pll_ref_rtn(unsigned char sel)
{
 if(sel) fm_wr_byte[4] |= 0x80;
 else    fm_wr_byte[4] &= 0x7f;
}

void fmw_deemph_rtn(unsigned char sel)
{
 if(sel) fm_wr_byte[4] |= 0x40;
 else    fm_wr_byte[4] &= 0xbf;
}

unsigned char fmr_ready_flag_rtn(void)
{
 return (unsigned char)((fm_rd_byte[0] >> 7) & 0x01);
}

unsigned char fmr_band_limit_rtn(void)
{
 return (unsigned char)((fm_rd_byte[0] >> 6) & 0x01);
}

unsigned short fmr_pll_rtn(void)
{
 unsigned short temp = 0;
 
 temp = (unsigned short)((fm_rd_byte[0] & 0x3f) << 8);
 temp |= (unsigned short)fm_rd_byte[1];
 
 return temp;
}

unsigned char fmr_stereo_indi_rtn(void)
{
 return (unsigned char)((fm_rd_byte[2] >> 7) & 0x01);
}

unsigned char fmr_if_count_rtn(void)
{
 return (unsigned char)(fm_rd_byte[2] & 0x7f);
}

unsigned char fmr_level_adc_rtn(void)
{
 return (unsigned char)((fm_rd_byte[3] >> 4) & 0x0f);
}

/* ------------------------------ End Command function ------------------------------------- */
unsigned char fm_rd_rtn(unsigned char *ptr)
{
 return (unsigned char)(i2c_read((unsigned int)I2C_FM, (unsigned char)fm_slaveaddr, (char)I2C_SUBADDR_NOUSE, ptr, (unsigned char)5));
}

unsigned char fm_wr_rtn(unsigned char *ptr)
{
 return (unsigned char)(i2c_write((unsigned int)I2C_FM, (unsigned char)fm_slaveaddr, (char)I2C_SUBADDR_NOUSE, ptr, (unsigned char)5));
}

void fmw_pll_rtn(unsigned char hilo, unsigned int fm_freq)
{
 unsigned char temp;
 unsigned short fm_pll_val = 0;
 
 if(hilo) fm_pll_val = (unsigned short)((4000*(fm_freq+225))/32768); // calc PLL decoder
 else  fm_pll_val = (unsigned short)((4000*(fm_freq-225))/32768);
 
 temp = (unsigned char)((fm_pll_val >> 8) & 0x3f);
 fm_wr_byte[0] &= 0xc0;
 fm_wr_byte[0] |= temp;
 
 temp = (unsigned char)fm_pll_val;
 fm_wr_byte[1] = temp;
 
 fmw_hilo_side_rtn(hilo);
}

unsigned char fm_hilo_optimal(unsigned int fm_freq)
{
 unsigned char status;
 unsigned char temp;
 unsigned char levelhigh, levellow;
 
 fmw_pll_rtn(hi_side, fm_freq+450); // Set PLL value High
 status = fm_wr_rtn(fm_wr_byte);  // Send Command


        delay720(20000);  
     
 status = fm_rd_rtn(fm_rd_byte);  // Read status
 
 levelhigh = fmr_level_adc_rtn(); // Get ADC value
  
 fmw_pll_rtn(hi_side, fm_freq-450); // Set PLL value Low
 status = fm_wr_rtn(fm_wr_byte);
 
 delay720(20000);  

     
 status = fm_rd_rtn(fm_rd_byte);
 
 levellow = fmr_level_adc_rtn();
  
 if(levelhigh < levellow) temp = hi_side;
 else temp = lo_side;
 
 return temp;
}

void fm_init(void)
{
 unsigned char i;
#if 0 /* lhm */
 i2c_wr
 i2c_clk_hi
 i2c_data_hi
#endif /* lhm */ 
// fm_pwr_on // 20050111
 
 delay720(100);   
 
 fm_khz = 89100; //107700;
 
 
 fmw_all_mute_rtn(on);     // MUTE OFF
 fmw_search_mode_rtn(off);    // OFF SearchMode
 fmw_search_dir_rtn(up);     // Search direction is up
 fmw_search_level_rtn(mid_level);  // search ADC level is middle
// fmw_search_level_rtn(lo_level);  // search ADC level is middle
 fmw_stereo_rtn(on);      // Steleo ON
 fmw_mute_left_rtn(off);     // Left force mono off
 fmw_mute_right_rtn(off);    // Right force mono 0ff
 fmw_stand_by_rtn(on);     // Stanby off
// fmw_band_sel_rtn(japan);    // Japan FM zone
 fmw_band_sel_rtn(us_eu);    // Japan FM zone
 fmw_xtal_sel_rtn(xtal_32768);   // set the x-tal to 32.768 KHz
 fmw_soft_mute_rtn(on);
 fmw_hcc_rtn(on);      // HCC ON
 fmw_snc_rtn(on);      // SNC ON
 fmw_search_indi_rtn(on);    // Pin 14 is output for the ready flag
 fmw_pll_ref_rtn(ref_65_dis);   // 6.5Mhz ref. not enable
 fmw_deemph_rtn(deemph50);    // deemphasis is 50us
 
 i = fm_hilo_optimal(fm_khz);   // HILO algorithm -> find optimize PLL
 fmw_pll_rtn(i, fm_khz);
 fmw_all_mute_rtn(off); 
 i = fm_wr_rtn(fm_wr_byte);
}
/*---------------------------------------- Change Hz and Auto Scan ---------------------------------------- */
void fm_manual_scan(unsigned char dir)
{ 
 unsigned char status;
 
 
 if(dir)
 {
  if(fm_khz >= 108000) fm_khz = 87500;
  else     fm_khz += scan_step;
 }
 else
 { 
  if(fm_khz <= 87500) fm_khz = 108000;
  else    fm_khz -= scan_step;
 }
        
 status = fm_hilo_optimal(fm_khz);
       
 fmw_pll_rtn(status, fm_khz);
  
 //fmw_all_mute_rtn(off); // TEST

 status = fm_wr_rtn(fm_wr_byte);

 //LCD_DisplayChannelForFM(fm_khz);
 
}

unsigned char fm_auto_scan(unsigned char dir)
{
 unsigned char status, curlev, curifc;
 
 if(dir)
 {
  if(fm_khz >= 108000) fm_khz = 87500;
  else     fm_khz += scan_step;
 }
 else
 { 
  if(fm_khz <= 87500) fm_khz = 108000;
  else    fm_khz -= scan_step;
 }
 
 //fmw_all_mute_rtn(on); // TEST
 status = fm_wr_rtn(fm_wr_byte); // Edit By Jim
 status = fm_hilo_optimal(fm_khz);
 fmw_pll_rtn(status, fm_khz);
 status = fm_wr_rtn(fm_wr_byte);
        
// delay720(20000);
 delay720(30000);

     
 status = fm_rd_rtn(fm_rd_byte);
 curlev = fmr_level_adc_rtn();
 curifc = fmr_if_count_rtn();

// LCD_DisplayChannelForFM(fm_khz);
 
/*
 if(fm_khz == 88000) 
  fm_khz = 88000;
 else if(fm_khz == 89100) 
  fm_khz = 89100;
 else if(fm_khz == 89700) 
  fm_khz = 89700;
 else if(fm_khz == 91900) 
  fm_khz = 91900;
 else if(fm_khz == 93100) 
  fm_khz = 93100;
 else if(fm_khz == 93900) 
  fm_khz = 93900;
 else if(fm_khz == 95100) 
  fm_khz = 95100;
 else if(fm_khz == 95700) 
  fm_khz = 95700;
 else if(fm_khz == 95900) 
  fm_khz = 95900;
 else if(fm_khz == 97300) 
  fm_khz = 97300;
 else if(fm_khz == 98100) 
  fm_khz = 98100;
 else if(fm_khz == 99100) 
  fm_khz = 99100;
 else if(fm_khz == 99600) 
  fm_khz = 99600;
 else if(fm_khz == 100000) 
  fm_khz = 100000;
 else if(fm_khz == 101100) 
  fm_khz = 101100;
 else if(fm_khz == 101900) 
  fm_khz = 101900;
 else if(fm_khz == 102700) 
  fm_khz = 102700;
 else if(fm_khz == 103500) 
  fm_khz = 103500;
 else if(fm_khz == 105300) 
  fm_khz = 105300;
 else if(fm_khz == 106100) 
  fm_khz = 106100;
 else if(fm_khz == 106900) 
  fm_khz = 106900;
 else if(fm_khz == 107700) 
  fm_khz = 107700;
*/ 
// if((curlev > 3) && (0x30 < curifc) && (curifc < 0x3c)  ) return 1; // scan_level
 if((curlev > 3) && (0x30 < curifc) && (curifc < 0x3c)  ) return 1; // scan_level
 else
  return 0;
}

unsigned int fm_auto_scan_detect(unsigned char dir)
{
 unsigned char status, i; 
 unsigned char index = 1; // Edit By Jim
 
 unsigned int dumy_fm_khz = fm_khz;
 
 
 for(i=0;i<10;i++)
 {
  if(fm_auto_scan(dir)) index++;
  else break;
 }
   
 if(index%2)
 {
  if(dir) fm_khz = dumy_fm_khz + (unsigned int)((index/2)*100);
  else    fm_khz = dumy_fm_khz - (unsigned int)((index/2)*100);
 }
 else
 {
  if(dir) fm_khz = dumy_fm_khz + (unsigned int)(((index/2)-1)*100);
  else    fm_khz = dumy_fm_khz - (unsigned int)((index/2)*100);
 }
 
 status = fm_hilo_optimal(fm_khz);
 fmw_pll_rtn(status, fm_khz);
 //fmw_all_mute_rtn(off);  TEST
 
 status = fm_wr_rtn(fm_wr_byte);
         
// LCD_ClearOneLine(2);
// lcd_var(0, 2, fm_khz);
// LCD_DisplayChannelForFM(fm_khz);
 return fm_khz;
}
#endif
#endif
 

⌨️ 快捷键说明

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