找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 14563|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

SI4730 收音機(jī)芯片資料與程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72519 發(fā)表于 2015-1-20 15:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在網(wǎng)上看到關(guān)于這個(gè)SI4730的收音機(jī)芯片的資料比較少,所以現(xiàn)在特發(fā)上來(lái),共有緣人參考,
如有不對(duì)之處,請(qǐng)指出。!

由于時(shí)間倉(cāng)促,自動(dòng)搜臺(tái)就沒(méi)有編寫(xiě),望有緣人寫(xiě)好后發(fā)上來(lái)分享。!。!
晶振:24MHz
單片機(jī):at89s52
注:轉(zhuǎn)載請(qǐng)注明出處,否則追究法律責(zé)任。。
日期:2010-03-06
版本:v1.0
設(shè)計(jì)者:sws
*/


#include"reg52.h"
#include"intrins.h"


typedef unsigned char uchar;
typedef unsigned int uint;
#define HIGH 1
#define LOW 0
#define SI4730_HIGH    //4730選擇地址定義
//#define SI4730_LOW
#define Max_freq_FM 10800      //108MHz
#define Min_freq_FM 8750   //87.5MHz
#define max_freq_AM 1701 //1701KHz
#define min_freq_AM 531
#define    FM_RECEIVER 0x20 //FM調(diào)諧頻率 page.52
#define    FM_TRNSMITTER 0x30
#define    AM_RECEIVER 0x40 //AM調(diào)諧頻率
#define    TX_TUNE_MEASURE 0x32
uint Frequency_fm=875;
uint Frequency_am=531;

bit Mode = 0;
sbit KEY_UP = P2^2;   //向上搜臺(tái)
sbit KEY_DW = P2^3;   //向下搜臺(tái)
sbit FM_AM_Choose = P2^4; //FM與AM選擇
bit FM_AM_ = 0;

/******************************************************
START condition:

SCLK: -----------|______

SDIO:-----|_____________
       1 |   2 | 3

STOP condition:

SCLK: ____|--------------

SDIO:____________|-------
1 | 2   |   3

DATA:

SCLK:_______________|---|________|----|_______

SDIO:___________|------------|____________|----
   |<==========>|


RESET:

SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST: ___________|------------------------------------
SCLK:__|---------------------------------------------
       |    1    |      2               |   3

******************************************************/
sbit Si4730_Reset = P1^3;
sbit Si4730_SCLK = P1^2;
sbit Si4730_SDIO = P1^1;

//如果SI4730的第六腳(SEN)接高電平那么地址是0x23,0x22
//如果SI4730的第六腳(SEN)接低電平那么地址是0xc7,0xc6

//#if 0 //address switch
#ifdef SI4730_LOW
#define READ_ADDR   0x23
#define WRITE_ADDR 0x22
#endif

#ifdef SI4730_HIGH
#define READ_ADDR   0xc7
#define WRITE_ADDR 0xc6
#endif

#define SCLK_HIGH Si4730_SCLK = HIGH
#define SCLK_LOW Si4730_SCLK = LOW

#define SDIO_HIGH Si4730_SDIO = HIGH
#define SDIO_LOW Si4730_SDIO = LOW
#define READ_SDIO Si4730_SDIO


//===============FM START===================

void _NOP()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}

void Si4730_Delay(unsigned char k)
{
uchar i,j;
for(i=150;i>0;i--)
   for(j=k;j>0;j--);
}

#define I2C_CLK_Delay() _NOP()


void ResetSi47XX_2w()
{
   Si4730_Reset = LOW;
   SCLK_HIGH;
   Si4730_Delay(100);
   SDIO_HIGH;
   Si4730_Delay(250);
   Si4730_Reset = HIGH;  
}

void Si4730_start()
{
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_ack()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
    I2C_CLK_Delay();
    SDIO_HIGH;
}

void Si4730_stop()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_writebyte(uchar write_data)   
{
uchar i;
for(i=8;i!=0;i--)    // 循環(huán)移入8個(gè)位
{
   READ_SDIO = (bit)(write_data & 0x80);
   SCLK_HIGH;
   I2C_CLK_Delay();
   SCLK_LOW; //SDA數(shù)據(jù)線(xiàn)上數(shù)據(jù)變化
   write_data <<= 1;   //調(diào)整發(fā)送位
}
}

void Operation_Si4730_Write(uchar *data1,uchar numByte)
{
uchar j;

Si4730_start();
Si4730_writebyte(WRITE_ADDR);//器件地址 0xc6
Si4730_ack();
I2C_CLK_Delay();
for(j=LOW;j<numByte;j++,*data1++)
{
   Si4730_writebyte(*data1);
   Si4730_ack();
   I2C_CLK_Delay();
}
Si4730_stop(); //發(fā)送結(jié)束
}

void Si4730_Power_Up_FM_AM_Choose(unsigned char mod) //fm,am選擇
{
unsigned char write_buf[3]={0x01,0xd0,0x05};
switch(mod)
{
   case FM_RECEIVER:        //si4730
      write_buf[1] = 0xd0; //使用時(shí)鐘晶振,32.768khz ,FM模式
      write_buf[2] = 0x05; //模擬L/R輸出  
      break;

     case AM_RECEIVER:           //si4730
       write_buf[1] = 0xd1; //使用時(shí)鐘晶振,32.768khz ,AM模式
       write_buf[2] = 0x05; //模擬L/R輸出
       break;
}
Operation_Si4730_Write(&(write_buf[0]), 3);//need wait >=300mS
Si4730_Delay(250);
Si4730_Delay(250);
Si4730_Delay(120);
}

void Si4730_Tune(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[5];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫(xiě)入高字節(jié)
write_buf[3] = Channel_Freq;     //寫(xiě)入低字節(jié)

write_buf[4]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 5);  
}

void Search_FM()   //調(diào)用手動(dòng)FM 頻率調(diào)整子程序 menu = 15
{
   if(Mode)
   {
    Frequency_fm += 10;   //步進(jìn)+0.1MHz
    if(Frequency_fm > Max_freq_FM)
     Frequency_fm = Min_freq_FM;
   }

   else
   {
    Frequency_fm -= 10;   //步進(jìn)-0.1MHz
    if(Frequency_fm < Min_freq_FM)
     Frequency_fm = Max_freq_FM;
   }
// Si4730_Power_Up(FM_RECEIVER); //向上搜臺(tái)
Si4730_Tune(FM_RECEIVER,Frequency_fm); //FM收音芯片數(shù)據(jù)刷新一次
}

//=================fm end============

//===============am start==============

void Si4730_Tune_AM(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[6];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫(xiě)入高字節(jié)
write_buf[3] = Channel_Freq;     //寫(xiě)入低字節(jié)

write_buf[4]= 0x00;
write_buf[5]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 6);  
}

void Search_AM()   //調(diào)用手動(dòng)FM 頻率調(diào)整子程序 menu = 95
{
   if(Mode)
   {
    Frequency_am += 9;   //步進(jìn)+9KHz
    if(Frequency_am > max_freq_AM)
     Frequency_am = min_freq_AM;
   }

   else
   {
    Frequency_am -= 9;   //步進(jìn)-9KHz
    if(Frequency_am < min_freq_AM)
     Frequency_am = max_freq_AM;
   }
// Si4730_Power_Up(AM_RECEIVER); //向上搜臺(tái)
Si4730_Tune_AM(AM_RECEIVER,Frequency_am); //AM收音芯片數(shù)據(jù)刷新一次
}

//=======================am end========================

//==============main start=======================

void main()
{
ResetSi47XX_2w();
Si4730_Delay(250);
while(1)
{
   if(!FM_AM_Choose)
   {
    Si4730_Delay(100);
    if(!FM_AM_Choose)
    {
      FM_AM_ = ~FM_AM_;
      if(!FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(FM_RECEIVER); //fm選擇
      }
      else if(FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(AM_RECEIVER ); //am選擇
      }

    }
   }


    if(!FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺(tái)
      Search_FM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺(tái)
      Search_FM();
      }
    }
   }

    else if(FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺(tái)
      Search_AM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺(tái)
      Search_AM();
      }
    }
   }
}
}

//=================main end=====================


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:71523 發(fā)表于 2015-1-20 16:02 | 只看該作者
這個(gè)沒(méi)有顯示頻率的,我不會(huì)加上顯示頻率,用的是1602,
回復(fù)

使用道具 舉報(bào)

板凳
ID:71523 發(fā)表于 2015-1-20 16:08 | 只看該作者
include"reg52.h"
#include"intrins.h"
#include "LCD1602_4w.h"

typedef unsigned char uchar;
typedef unsigned int uint;
#define HIGH 1
#define LOW 0
#define SI4730_HIGH    //4730選擇地址定義
//#define SI4730_LOW
#define Max_freq_FM 10800      //108MHz
#define Min_freq_FM 8750   //87.5MHz
#define max_freq_AM 1701 //1701KHz
#define min_freq_AM 531
#define    FM_RECEIVER 0x20 //FM調(diào)諧頻率 page.52
#define    FM_TRNSMITTER 0x30
#define    AM_RECEIVER 0x40 //AM調(diào)諧頻率
#define    TX_TUNE_MEASURE 0x32
uint Frequency_fm=875;
uint Frequency_am=531;

bit Mode = 0;
sbit KEY_UP = P2^2;   //向上搜臺(tái)
sbit KEY_DW = P2^3;   //向下搜臺(tái)
sbit FM_AM_Choose = P2^4; //FM與AM選擇
bit FM_AM_ = 0;

//LCD1602_4w
sbit LCD_RS = P1^0;            
sbit LCD_RW = P1^1;
sbit LCD_EP = P1^2;
#define LCD_EN  LCD_EP
#define LCD_DATA    P0



/******************************************************
START condition:

SCLK: -----------|______

SDIO:-----|_____________
       1 |   2 | 3

STOP condition:

SCLK: ____|--------------

SDIO:____________|-------
1 | 2   |   3

DATA:

SCLK:_______________|---|________|----|_______

SDIO:___________|------------|____________|----
   |<==========>|


RESET:

SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST: ___________|------------------------------------
SCLK:__|---------------------------------------------
       |    1    |      2               |   3

******************************************************/
sbit Si4730_Reset = P1^3;
sbit Si4730_SCLK = P1^2;
sbit Si4730_SDIO = P1^1;

//如果SI4730的第六腳(SEN)接高電平那么地址是0x23,0x22
//如果SI4730的第六腳(SEN)接低電平那么地址是0xc7,0xc6

//#if 0 //address switch
#ifdef SI4730_LOW
#define READ_ADDR   0x23
#define WRITE_ADDR 0x22
#endif

#ifdef SI4730_HIGH
#define READ_ADDR   0xc7
#define WRITE_ADDR 0xc6
#endif

#define SCLK_HIGH Si4730_SCLK = HIGH
#define SCLK_LOW Si4730_SCLK = LOW

#define SDIO_HIGH Si4730_SDIO = HIGH
#define SDIO_LOW Si4730_SDIO = LOW
#define READ_SDIO Si4730_SDIO


//===============FM START===================

void _NOP()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}

void Si4730_Delay(unsigned char k)
{
uchar i,j;
for(i=150;i>0;i--)
   for(j=k;j>0;j--);
}

#define I2C_CLK_Delay() _NOP()


void ResetSi47XX_2w()
{
   Si4730_Reset = LOW;
   SCLK_HIGH;
   Si4730_Delay(100);
   SDIO_HIGH;
   Si4730_Delay(250);
   Si4730_Reset = HIGH;  
}

void Si4730_start()
{
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_ack()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
    I2C_CLK_Delay();
    SDIO_HIGH;
}

void Si4730_stop()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_writebyte(uchar write_data)   
{
uchar i;
for(i=8;i!=0;i--)    // 循環(huán)移入8個(gè)位
{
   READ_SDIO = (bit)(write_data & 0x80);
   SCLK_HIGH;
   I2C_CLK_Delay();
   SCLK_LOW; //SDA數(shù)據(jù)線(xiàn)上數(shù)據(jù)變化
   write_data <<= 1;   //調(diào)整發(fā)送位
}
}

void Operation_Si4730_Write(uchar *data1,uchar numByte)
{
uchar j;

Si4730_start();
Si4730_writebyte(WRITE_ADDR);//器件地址 0xc6
Si4730_ack();
I2C_CLK_Delay();
for(j=LOW;j<numByte;j++,*data1++)
{
   Si4730_writebyte(*data1);
   Si4730_ack();
   I2C_CLK_Delay();
}
Si4730_stop(); //發(fā)送結(jié)束
}

void Si4730_Power_Up_FM_AM_Choose(unsigned char mod) //fm,am選擇
{
unsigned char write_buf[3]={0x01,0xd0,0x05};
switch(mod)
{
   case FM_RECEIVER:        //si4730
      write_buf[1] = 0xd0; //使用時(shí)鐘晶振,32.768khz ,FM模式
      write_buf[2] = 0x05; //模擬L/R輸出  
      break;

     case AM_RECEIVER:           //si4730
       write_buf[1] = 0xd1; //使用時(shí)鐘晶振,32.768khz ,AM模式
       write_buf[2] = 0x05; //模擬L/R輸出
       break;
}
Operation_Si4730_Write(&(write_buf[0]), 3);//need wait >=300mS
Si4730_Delay(250);
Si4730_Delay(250);
Si4730_Delay(120);
}

void Si4730_Tune(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[5];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫(xiě)入高字節(jié)
write_buf[3] = Channel_Freq;     //寫(xiě)入低字節(jié)

write_buf[4]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 5);  
}

void Search_FM()   //調(diào)用手動(dòng)FM 頻率調(diào)整子程序 menu = 15
{
   if(Mode)
   {
    Frequency_fm += 10;   //步進(jìn)+0.1MHz
    if(Frequency_fm > Max_freq_FM)
     Frequency_fm = Min_freq_FM;
   }

   else
   {
    Frequency_fm -= 10;   //步進(jìn)-0.1MHz
    if(Frequency_fm < Min_freq_FM)
     Frequency_fm = Max_freq_FM;
   }
// Si4730_Power_Up(FM_RECEIVER); //向上搜臺(tái)
Si4730_Tune(FM_RECEIVER,Frequency_fm); //FM收音芯片數(shù)據(jù)刷新一次
}

//=================fm end============

//===============am start==============

void Si4730_Tune_AM(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[6];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫(xiě)入高字節(jié)
write_buf[3] = Channel_Freq;     //寫(xiě)入低字節(jié)

write_buf[4]= 0x00;
write_buf[5]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 6);  
}

void Search_AM()   //調(diào)用手動(dòng)FM 頻率調(diào)整子程序 menu = 95
{
   if(Mode)
   {
    Frequency_am += 9;   //步進(jìn)+9KHz
    if(Frequency_am > max_freq_AM)
     Frequency_am = min_freq_AM;
   }

   else
   {
    Frequency_am -= 9;   //步進(jìn)-9KHz
    if(Frequency_am < min_freq_AM)
     Frequency_am = max_freq_AM;
   }
// Si4730_Power_Up(AM_RECEIVER); //向上搜臺(tái)
Si4730_Tune_AM(AM_RECEIVER,Frequency_am); //AM收音芯片數(shù)據(jù)刷新一次
}

//=======================am end========================

//==============main start=======================

void main()
{
ResetSi47XX_2w();
Si4730_Delay(250);
while(1)
{
   if(!FM_AM_Choose)
   {
    Si4730_Delay(100);
    if(!FM_AM_Choose)
    {
      FM_AM_ = ~FM_AM_;
      if(!FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(FM_RECEIVER); //fm選擇
      }
      else if(FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(AM_RECEIVER ); //am選擇
      }

    }
   }


    if(!FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺(tái)
      Search_FM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺(tái)
      Search_FM();
      }
    }
   }

    else if(FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {

      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺(tái)
      Search_AM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺(tái)
      Search_AM();
      }
    }
   }
}
}

//=================main end=====================

新建文件夾 (3).rar (5.93 KB, 下載次數(shù): 74)

先不管1602怎么定義接MCU,現(xiàn)在報(bào)錯(cuò),說(shuō)什么沒(méi)定義,你幫看一下


回復(fù)

使用道具 舉報(bào)

地板
ID:71523 發(fā)表于 2015-1-20 16:11 | 只看該作者
我只是你這程序加上#include "LCD1602_4w.h",然后加上1602的接線(xiàn)定義后翻譯出錯(cuò),請(qǐng)求版主大家?guī)涂匆幌拢趺礃釉谀惆l(fā)的程序上加上頻率顯示,MCU你可隨便定義,我改就行,期盼你的回復(fù)
回復(fù)

使用道具 舉報(bào)

5#
ID:75609 發(fā)表于 2015-3-29 15:02 | 只看該作者
我現(xiàn)在也要做si4730收音機(jī),一起努力吧
回復(fù)

使用道具 舉報(bào)

6#
ID:88407 發(fā)表于 2015-8-16 00:13 | 只看該作者
好東西,學(xué)習(xí),學(xué)習(xí),
回復(fù)

使用道具 舉報(bào)

7#
ID:229361 發(fā)表于 2019-1-10 16:35 | 只看該作者

好東西,學(xué)習(xí),學(xué)習(xí),
回復(fù)

使用道具 舉報(bào)

8#
ID:403593 發(fā)表于 2019-11-8 08:59 | 只看該作者
正在找它的資料,感謝分享!
回復(fù)

使用道具 舉報(bào)

9#
ID:166475 發(fā)表于 2021-11-8 12:24 來(lái)自觸屏版 | 只看該作者
timer.h:  #ifndef __TIMER_H_  #define __TIMER_H_  //如果外部需要使用這些變量或函數(shù),直接包含頭文件即可。  //如果不對(duì)外開(kāi)放的函數(shù),就不需要添加  //注:在C源文件中,函數(shù)聲明要補(bǔ)全  extern int timerCnt;  extern int timerStatu;  extern void TimerStart();  extern void TimerStop();  extern void TimerInit();  #endif
回復(fù)

使用道具 舉報(bào)

10#
ID:838732 發(fā)表于 2024-9-23 21:34 | 只看該作者
這個(gè)程序用不了哦
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表