#include "include/FM.h"
#include "include/main.h"
#ifdef RADIO_INCLUDE
unsigned char fm_rd_byte[5] = {0,0,0,0,0}; // Read buf
unsigned char fm_wr_byte[5] = {0,0,0,0,0}; // write but
unsigned int fm_khz;
/*
void delay760(unsigned int count)
{
for(;count>0;count--) ;
// 1:0.84, 5:1.36, 10:1.96, 20:3.20, 30:4.48, 60:8.04, 80:10.6, 90:11.6, 100:13
}
*/
/* ---------------------------------- Command Function ------------------------------------ */
void fmw_hilo_side_rtn(unsigned char hilo)
{
if(hilo) fm_wr_byte[2] |= 0x10;
else fm_wr_byte[2] &= 0xef;
}
void fmw_all_mute_rtn(unsigned char onoff)
{
if(onoff) fm_wr_byte[0] |= 0x80;
else fm_wr_byte[0] &= 0x7f;
}
void fmw_search_mode_rtn(unsigned char onoff)
{
if(onoff) fm_wr_byte[0] |= 0x40;
else fm_wr_byte[0] &= 0xbf;
}
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 ------------------------------------- */
void fm_i2c_comm_s(void)
{
fm_i2c_wr
fm_i2c_data_lo
delay760(fm_i2c_Thold);
fm_i2c_clk_lo
delay760(fm_i2c_Thold);
}
void fm_i2c_out_byte(unsigned char *ptr)
{
unsigned char i, temp;
fm_i2c_wr
for(i=0;i<8;i++)
{
temp = *ptr << i;
temp &= 0x80;
if(temp) fm_i2c_data_hi
else fm_i2c_data_lo
delay760(fm_i2c_Tsetup);
fm_i2c_clk_hi
delay760(fm_i2c_Thold);
fm_i2c_clk_lo
delay760(fm_i2c_Thold);
}
}
unsigned char fm_i2c_get_ack(void)
{
unsigned int i=0;
fm_i2c_rd
fm_i2c_clk_hi
delay760(fm_i2c_Tcatch);
i = (unsigned int)(HwGDATA_B & 0x100);
delay760(fm_i2c_Tcatch);
fm_i2c_clk_lo
delay760(fm_i2c_Thold);
return i;
}
void fm_i2c_in_byte(unsigned char *ptr)
{
unsigned char i, temp=0;
fm_i2c_rd
for(i=0;i<8;i++)
{
fm_i2c_clk_hi
delay760(fm_i2c_Tcatch);
temp = (unsigned char)((HwGDATA_B & 0x100) >> 8 ); //
if(i == 0) *ptr = temp;
else *ptr = (*ptr << 1) | temp;
delay760(fm_i2c_Tcatch);
fm_i2c_clk_lo
delay760(fm_i2c_Thold);
}
}
void fm_i2c_do_ack(unsigned char bit)
{
fm_i2c_wr
if(bit) fm_i2c_data_hi
else fm_i2c_data_lo
delay760(fm_i2c_Tsetup);
fm_i2c_clk_hi
delay760(fm_i2c_Thold);
fm_i2c_clk_lo
delay760(fm_i2c_Thold);
}
void fm_i2c_comm_p(void)
{
fm_i2c_wr
fm_i2c_data_lo
delay760(fm_i2c_Tsetup);
fm_i2c_clk_hi
delay760(fm_i2c_Thold);
fm_i2c_data_hi
delay760(fm_i2c_Tbuf);
}
///////////////////////////////////////////////
unsigned char fm_rd_rtn(unsigned char *ptr)
{
unsigned char i = fm_rd_cmd;
fm_i2c_wr;
fm_i2c_clk_hi;
fm_i2c_data_hi;
delay760(fm_i2c_Tbuf);
fm_i2c_comm_s();
fm_i2c_out_byte(&i);
if(fm_i2c_get_ack() != i2c_ack)
{
fm_i2c_comm_p();
return i2c_err;
}
for(i=0;i<5;i++)
{
fm_i2c_in_byte(ptr);
if(i < 4) fm_i2c_do_ack(i2c_ack);
else fm_i2c_do_ack(i2c_noack);
ptr++;
}
fm_i2c_comm_p();
return i2c_ok;
}
unsigned char fm_wr_rtn(unsigned char *ptr)
{
unsigned char i = fm_wr_cmd;
fm_i2c_wr;
fm_i2c_clk_hi;
fm_i2c_data_hi;
delay760(fm_i2c_Tbuf);
fm_i2c_comm_s();
fm_i2c_out_byte(&i);
if(fm_i2c_get_ack() != i2c_ack)
{
fm_i2c_comm_p();
return i2c_err;
}
for(i=0;i<5;i++)
{
fm_i2c_out_byte(ptr);
if(fm_i2c_get_ack()) ;
else ;
ptr++;
}
fm_i2c_comm_p();
return i2c_ok;
}
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
delay760(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);
delay760(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;
fm_i2c_wr;
fm_i2c_clk_hi;
fm_i2c_data_hi;
// fm_pwr_on;
delay760(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_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_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
FM.rar_5767_FM_TEA 5767_tea?5767
版权申诉
179 浏览量
2022-09-19
14:12:30
上传
评论
收藏 3KB RAR 举报
局外狗
- 粉丝: 67
- 资源: 1万+
最新资源
- Screenshot_20240531_142703.jpg
- content_1717156058559.awb
- 使用平面转换、渐变色仿部分喜马拉雅界面
- 创建Pixi简单的应用和stage
- ArcGIS-Runtime-SDK-DotNet-100-15-5.vsix
- 基于3D-CNN的暴力行为检测python源码+文档说明+实验报告(高分项目)
- 2023 年 9 月 GESP C++ 一级真题.docx
- 基于Pytorch+Unet实现心脏右心室分割python源码+注释说明(高分项目)
- 基于Java和Javascript的中学选课系统设计源码
- 课程大作业-USV路径跟踪LOS控制算法matlab仿真源码+文档说明(高分项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0