SI4730 收音机芯片资料与程序.doc
SI4730 收音机芯片资料与程序2010-03-06 12:50/*在网上看到关于这个SI4730的收音机芯片的资料比较少,所以现在特发上来,共有缘人参考,如有不对之处,请指出。!晶振:24MHz单片机:at89s52注:转载请注明出处,否则追究法律责任!日期:2010-03-06版本:v1.0设计者:swsSI4730资料下载地址:*/#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调谐频率 page.52#define FM_TRNSMITTER 0x30#define AM_RECEIVER 0x40 /AM调谐频率#define TX_TUNE_MEASURE 0x32uint Frequency_fm=875;uint Frequency_am=531;bit Mode = 0;sbit KEY_UP = P22; /向上搜台sbit KEY_DW = P23; /向下搜台sbit FM_AM_Choose = P24; /FM与AM选择bit FM_AM_ = 0;/*START condition:SCLK: -|_ SDIO:-|_ 1 | 2 | 3STOP condition:SCLK: _|- SDIO:_|-1 | 2 | 3DATA:SCLK:_|-|_|-|_ SDIO:_|-|_|- |<=>|RESET:SENB:_|-SDIO:_|-RST: _|-SCLK:_|- | 1 | 2 | 3*/sbit Si4730_Reset = P13;sbit Si4730_SCLK = P12;sbit Si4730_SDIO = P11;/如果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-) / 循环移入8个位 READ_SDIO = (bit)(write_data & 0x80); SCLK_HIGH; I2C_CLK_Delay(); SCLK_LOW; /SDA数据线上数据变化 write_data <<= 1; /调整发送位void Operation_Si4730_Write(uchar *data1,uchar numByte)uchar j;Si4730_start();Si4730_writebyte(WRITE_ADDR);/器件地址 0xc6Si4730_ack();I2C_CLK_Delay();for(j=LOW;j<numByte;j+,*data1+) Si4730_writebyte(*data1); Si4730_ack(); I2C_CLK_Delay();Si4730_stop(); /发送结束void Si4730_Power_Up_FM_AM_Choose(unsigned char mod) /fm,am选择 unsigned char write_buf3=0x01,0xd0,0x05;switch(mod) case FM_RECEIVER: /si4730 write_buf1 = 0xd0; /使用时钟晶振,32.768khz ,FM模式 write_buf2 = 0x05; /模拟L/R输出 break; case AM_RECEIVER: /si4730 write_buf1 = 0xd1; /使用时钟晶振,32.768khz ,AM模式 write_buf2 = 0x05; /模拟L/R输出 break;ResetSi47XX_2w();Operation_Si4730_Write(&(write_buf0), 3);/need wait >=300mSSi4730_Delay(250);Si4730_Delay(250);Si4730_Delay(120); void Si4730_Tune(char mod,unsigned short Channel_Freq)unsigned char write_buf5;write_buf0= mod; write_buf1= 0x00;write_buf2 = Channel_Freq >> 8; /写入高字节write_buf3 = Channel_Freq; /写入低字节write_buf4= 0x00; Operation_Si4730_Write(&(write_buf0), 5); void Search_FM() /调用手动FM 频率调整子程序 menu = 15 if(Mode) Frequency_fm += 10; /步进+0.1MHz if(Frequency_fm > Max_freq_FM) Frequency_fm = Min_freq_FM; else Frequency_fm -= 10; /步进-0.1MHz if(Frequency_fm < Min_freq_FM) Frequency_fm = Max_freq_FM; / Si4730_Power_Up(FM_RECEIVER); /向上搜台Si4730_Tune(FM_RECEIVER,Frequency_fm); /FM收音芯片数据刷新一次 /=fm end=/=am start=void Si4730_Tune_AM(char mod,unsigned short Channel_Freq)unsigned char write_buf6;write_buf0= mod; write_buf1= 0x00;write_buf2 = Channel_Freq >> 8; /写入高字节write_buf3 = Channel_Freq; /写入低字节write_buf4= 0x00;write_buf5= 0x00; Operation_Si4730_Write(&(write_buf0), 6); void Search_AM() /调用手动FM 频率调整子程序 menu = 95 if(Mode) Frequency_am += 9; /步进+9KHz if(Frequency_am > max_freq_AM) Frequency_am = min_freq_AM; else Frequency_am -= 9; /步进-9KHz if(Frequency_am < min_freq_AM) Frequency_am = max_freq_AM; / Si4730_Power_Up(AM_RECEIVER); /向上搜台Si4730_Tune_AM(AM_RECEIVER,Frequency_am); /AM收音芯片数据刷新一次 /=am end=/=main start=void main()Si4730_Delay(250);Si4730_Power_Up_FM_AM_Choose(FM_RECEIVER); /默认选择fmwhile(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; /向上搜台 Search_FM(); if(!KEY_DW) Si4730_Delay(100); if(!KEY_DW) Mode = LOW; /向下搜台 Search_FM(); else if(FM_AM_) / ResetSi47XX_2w(); if(!KEY_UP) Si4730_Delay(100); if(!KEY_UP) Mode = HIGH; /向上搜台 Search_AM(); if(!KEY_DW) Si4730_Delay(100); if(!KEY_DW) Mode = LOW; /向下搜台 Search_AM(); /=main end=