5807的C驱动程序

合集下载

HP_580G7-引导制作已经固件升级

HP_580G7-引导制作已经固件升级

HP PROLIANT DL580 G7制作引导固件升级U盘以及升级固件操作一:首先制作U盘引导盘:双击hpusbkey点击下一步:如下图:同意条款并且下一步.创建一个USB key(主意U盘会自动格式化,请保留原USB内数据。

的盘。

准备好以后,在此界面状态下插入。

是ISO镜像,就如图选择。

最后一栏则为空U盘。

最好准备大于1G的U盘。

选择下一步进行格式U盘,并且安装引导驱动和文件。

需主意的是,WIN7或者08下安装,会出现假死卡机状态,可以忽视,等待它读写完成即可。

切勿急于拔出U盘或者拿出光盘。

直至出现完成。

制作引导U盘成功。

在LINUX操作系统中,点击系统——重启,或打开终端,输入init6。

插入升级包U盘。

自动进入HP USB启动界面,出现下图,回车。

选择Interactive Firmware Update Version9.30,回车。

选择升级过程语言English。

同意条款,点击下一步选择Firmware栏,点击Install Firmware。

建立可用更新。

选择HP Smart Update Firmware –ML-DL-SL 300/500/700/900 SeriesBundle for Linux,并在下列选择ALLOW NON-BUNDLE PRODUCTS 和ALLOW NON-BUNDLE VERSIONS。

在Select items to be Installed界面,选择可用最新版本。

点击Install。

11.进行安装。

12. 升级成功,点击reboot now。

13. 拔出U盘。

RDA5807m+IIC收音机51单片机C程序

RDA5807m+IIC收音机51单片机C程序

RDA5807m驱动程序+ IIC 程序/****************************************************************************** ************ 介绍: RD5807M收音机程序供电3.3v 主控使用51单片机显示使用LCD1602** 作者: 胖子** 时间:2016-1-5** 地点:桂林电子科技大学******************************************************************************* **********/#include <reg51.h>#include <string.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int#define lint long intuchar code xian[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar code hang[]={0xfe,0xfd,0xfb,0xf7}; //矩阵键盘扫描使用//RDA 的寄存器地址#define RDA_R00 0X00 //读出16个位的ID =0X5800#define RDA_R02 0X02 //DHIZ[15],DMUTE[14]静音,MONO[13]声道,BASS[12]重低音,SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:4]时钟源选择,SOFTRESET[1]软复位,ENABLE[0]电源使能#define RDA_R03 0X03 //CHAN[15:6],TUNE[4],BAND[3:2],SPACE[1:0] 设置频率带宽步长#define RDA_R04 0X04 //STCIEN[14],DE[11],I2Senable[6],#define RDA_R05 0X05 //INT_MODE[15],SEEKTH[14:8](设定自动搜索信号强度阀值),LNA_PORT_SEL[7:6]=0b10,LNA_ICSEL_BIT[5:4],VOLUME[3:0]音量;#define RDA_R0A 0X0A //STC[14]seek complete SF[13]seek fail readchan[9:0]当前频道#define RDA_R0B 0X0B //RSSI[15:9],FM TRUE[8]当前频道是一个节目台#define RDA_READ 0X23 //读RDA5807#define RDA_WRITE 0X22 //写RDA5807//IO操作函数sbit SDA=P2^1;sbit SCL=P2^0;sbit RW =P1^1;sbit RS=P1^0;sbit EN=P2^5;uchar code a[]="FM: . ";uchar code b[]="Vol: RSSI: ";uchar code shu[]="0123456789";uchar num ;void delayms(uint x) //延迟程序uint i,j;for(i=x;i>0;i--)for(j=113;j>0;j--);}/*********************************************** 矩阵键盘程序********************************************************************/uchar ScanKey() //矩阵键盘扫描返回值是当前按键数值如没按下则返回值为零{uint x,y;for(x=0;x<4;x++){uchar temp,gaowei;P3=hang[x]; //分行置零temp=P3&0xf0;if(temp!=0xf0){delayms(10);if(temp!=0xf0){gaowei=P3/16; //判断是第几列的按键按下,将数据装入高四位switch(gaowei){case 0xe:y=0; break;case 0xd:y=1; break;case 0xb:y=2; break;case 0x7:y=3; break;}while(temp!=0xf0){temp=P3&0xf0;}return xian[x][y];}}}return 0;}/******************************************************* LCD1602程序************************************************************************/void write_com(unsigned char com)RS=0;P0=com;delayms(5);EN=1;delayms(5);EN=0;}void write_data(unsigned char date){RS=1;P0=date;delayms(5);EN=1;delayms(5);EN=0;}void init_1602(){P0=0xc0;RW =0;EN=0;write_com(0x38); //éè??16*2??ê?£?5*7μ??ó£?8??êy?Y?úwrite_com(0x0c); //éèa??ê?£?2ê?1a±êwrite_com(0x06); //D′ò×?·?oóμ??·ó1write_com(0x01); //??êá?£?êy?Yá?}void DisplayFrq(float Frq) //显示频率{uint F;F=Frq*10;write_com(0x80+3);write_data(shu[F/1000]);delayms(1);write_data(shu[F/100%10]);delayms(1);write_data(shu[F/10%10]);delayms(1);write_com(0x80+7);write_data(shu[F%10]);delayms(1);}void DisplayVol(uint Vol) //显示音量{write_com(0x80+0x40+4);write_data(shu[Vol/10]);delayms(1);write_data(shu[Vol%10]);delayms(1);}void Display_mute() //显示静音{write_com(0x80+0x40+4);write_data('x');delayms(1);write_data('x');delayms(1);}void Display_RSSI(uint RSSI) //显示信号强度{write_com(0x80+0x40+14);write_data(shu[RSSI/10]);delayms(1);write_data(shu[RSSI%10]);delayms(1);}/*----------------------------------------IIC通信程序---------------------------------------------------*/ void IIC_delayms() //用于IIC延时{_nop_();_nop_();_nop_();_nop_();}void OpenIIC() //IIC启动信号{SDA=1;SCL=1;IIC_delayms();SDA=0;IIC_delayms();SCL=0;}void CloseIIC() //IIC停止信号{SCL=0;SDA=0;IIC_delayms();SCL=1;SDA=1;IIC_delayms();}uchar IIC_Wait_Ack(void) //IIC发送字节后等待从机发送响应信{uchar ucErrTime=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();while(SDA==1){ucErrTime++;if(ucErrTime>250){CloseIIC();return 1;}}SCL=0;return 0;}void IIC_Ack(void) //{SCL=0;SDA=0; //0±íê?ó|′eIIC_delayms();SCL=1;IIC_delayms();SCL=0;}void IIC_NAck(void) //IIC 非应答信号{SCL=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;}void IICsendByte(uchar txd) //IIC·写一个字节{uchar t;SCL=0;for(t=0;t<8;t++){if(((txd&0x80)>>7)==1)SDA=1;elseSDA=0;txd<<=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;IIC_delayms();}}uchar IICReadByte(unsigned char ack) //IIC读一个字节{unsigned char i,receive=0;SDA=1; //51单片机讲引脚置高可设为输入引脚for(i=0;i<8;i++ ){SCL=0;IIC_delayms();SCL=1;receive<<=1;if(SDA==1)receive++;IIC_delayms();}if (!ack)IIC_NAck();elseIIC_Ack();return receive;}uint ReadReg(uchar regAddr) //芯片读寄存器{uint buf;OpenIIC();IICsendByte(RDA_WRITE); //发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr); //发送寄存器地址IIC_Wait_Ack();OpenIIC();IICsendByte(RDA_READ); // 发送芯片地址方向为读IIC_Wait_Ack();buf = IICReadByte(1);buf = buf<<8;buf =buf|IICReadByte(0);CloseIIC();return buf;}void WriteReg(uchar regAddr,uint val) //芯片写寄存器{OpenIIC();IICsendByte(RDA_WRITE); //发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr); //发送寄存器地址IIC_Wait_Ack();IICsendByte(val>>8);IIC_Wait_Ack();IICsendByte(val&0XFF);IIC_Wait_Ack();CloseIIC();}void Vol_Set(uchar vol) //音量设置0~15{uint temp=0;temp=ReadReg(RDA_R05);temp&=0xfff0;WriteReg(0x05,vol|temp) ;}void Mute_Set(uchar mute) //静音设置1为静音0为不静音{uint temp=0;temp=ReadReg(0X02);if(!mute)temp|=1<<14;else temp&=~(1<<14);WriteReg(0X02,temp) ;}void Bass_Set(uchar bass) //频带设置{uint temp=0;temp=ReadReg(0X02);if(bass)temp|=1<<12;else temp&=~(1<<12);WriteReg(0X02,temp) ;}uchar Rssi_Get(void) //信号强度获取0~63{uint temp=0;temp=ReadReg(0X0B);temp=(temp>>9)&0x7f;return temp;}void Seekth_Set(uint rssi) //自动搜台信号阈值强度0~15 默认为8 数值越低搜到的台越多{uint temp;rssi = rssi & 0xf;temp=ReadReg(0X05);temp&=~(0xf<<8);temp|= rssi<<8;WriteReg(0X05,temp) ;}void Seek_direction(uchar direction) //搜台方向1向上搜索0向下搜索{uint temp;temp=ReadReg(RDA_R02);temp&=~(1<<9);if(direction == 1)temp|= 1<<9;// if(direction == 0)// temp|= 0<<9;WriteReg(0X05,temp) ;}void Freq_Set(uint freq) //频率设置单位是:10KHz 6500~10800{uint temp;uchar spc=0,band=0;uint fbtm,chan;temp=ReadReg(0X03);temp&=0X001F;band=(temp>>2)&0x03;spc=temp&0x03;if(spc==0)spc=10;else if(spc==1)spc=20;else spc=5;if(band==0)fbtm=8700;else if(band==1||band==2)fbtm=7600;else{fbtm=ReadReg(0X53);fbtm*=10;}if(freq<fbtm)return;chan=(freq-fbtm)/spc;chan&=0X3FF;temp|=chan<<6;temp|=1<<4;WriteReg(RDA_R03,temp) ;delayms(20);// while((ReadReg(0X0B)&(1<<7))==0);}unsigned int seek_channel(void) //半自动搜台{unsigned long temp;temp=ReadReg(RDA_R02);temp |= (1<<8);WriteReg(RDA_R02,temp) ; //SEEK位置一使能自动搜台while( (ReadReg(RDA_R0A)&(1<<14)) == 0 ) // 等待STC位置一表示搜索完成{delayms(10); //?óê±10ms}temp = ((ReadReg(RDA_R0A)&0x3FF) * 100000 + 87000000)/10000 ; //获取当前频率return temp; //返回搜到电台频率单位是:10Khz}void FM_enable(uchar flag) //1 使能芯片0 禁用芯片{uint temp;temp=ReadReg(RDA_R02);if(flag ==1 )temp |=1;if(flag == 0)temp &= ~0x1;WriteReg(RDA_R02,temp);}void RDA_Init(void) //RDA3?ê??ˉ{WriteReg(RDA_R02,0x0002); //软复位delayms(30);WriteReg(RDA_R02,0xd081); //?§32.768Khz ?òé÷??μíò? á¢ì?éùSKMODE = 1÷μ?±??μê±í£?1WriteReg(RDA_R03,0x0000); //?μ?êéè?a87MHz £?2100Khz ?μ′??a87M~108MWriteReg(RDA_R04,0x0040); //?ù±WriteReg(RDA_R05,0X8882); //ò?á?éèavol=2 ÷·§?μ?a8FM_enable(1); //??Dé?μ?Seekth_Set(8); //自动搜台信号阈值强度0~15 默认为8 数值越低搜到的台越多}void display_1602(){write_com(0x80);for(num=0;num<34;num++){write_data(a[num]);delayms(5);}write_com(0x80+0x40);for(num=0;num<34;num++){write_data(b[num]);delayms(5);}}void main(){unsigned char Key_num=0,Vol=1,RSSI=0,mute=1;unsigned int RXFreq=8830,time=0;unsigned int Diantai[40]={8830};char Num=0,station=1;unsigned int test=7896;unsigned int temp=10;init_1602();display_1602();RDA_Init(); //RDA5807初始化Freq_Set(8830); //频率设置Vol_Set(2) ;DisplayFrq(88.3);DisplayVol(2); //显示音量while (1){time++;if(time>1000)Display_RSSI(Rssi_Get()); //显示信号强度Key_num=ScanKey();switch(Key_num){case 1: { if(RXFreq==8800)RXFreq=8800; //频率减else RXFreq-=10;Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);while(0!=ScanKey()); //按键释放break;}case 2:{ if(RXFreq==10800)RXFreq=10800;//频率加else RXFreq+=10;Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);while(0!=ScanKey()); //按键释放break;}case 5: { //声音减if(Vol==0)Vol=0;elseVol-=1;Vol_Set(Vol);DisplayVol(Vol); //显示音量while(0!=ScanKey()); //按键释放break;}case 6:{ if(Vol==15)Vol=15; //声音加else Vol+=1;Vol_Set(Vol);DisplayVol(Vol); //显示音量while(0!=ScanKey()); //按键释放break;}case 7:{ if(mute==1) //静音{Mute_Set(1);Display_mute(); //显示静音while(0!=ScanKey()); //按键释放mute=0;break;}if(mute==0){Mute_Set(0);DisplayVol(Vol); //取消静音显示音量mute=1;}while(0!=ScanKey());break;}case 9:{ //电台减但是必须先按9进行电台搜索while(0!=ScanKey()); //按键释放Seek_direction(0); //向下搜索RXFreq = seek_channel(); //搜索下一个频道Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);break;}case 10:{ //电台加但是必须先按11进行电台搜索while(0!=ScanKey()); //按键释放Seek_direction(1); //向上搜索RXFreq = seek_channel(); //搜索下一个频道Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);break;}default:break;}}}// case 9:{ //电台减但是必须先按11进行电台搜索// if(station==0)break;// if(Num>0)Num-=1;// else Num=station-1;// Freq_Set(Diantai[Num]);// DisplayFrq(Diantai[Num]/100.0);// RXFreq=Diantai[Num];// Display_now(1) ; //显示当前电台号// while(0!=ScanKey()); //按键释放// break;// }// case 10:{ if(station==0)break; //电台加但是必须先按11进行电台搜索// if(Num<(station-1))Num+=1;// else Num=0;// Freq_Set(Diantai[Num]);// DisplayFrq(Diantai[Num]/100.0);// RXFreq=Diantai[Num];// Display_now(Num) ; //显示当前电台号// while(0!=ScanKey()); //按键释放// break;// }//// case 11:{ //自动搜台并且存储按9 或者10 可以上下变换电台。

BCM5709,BCM5716网卡驱动问题

BCM5709,BCM5716网卡驱动问题

CENTOS 5.5自带的DELL R710、DELL R410网卡(型号分别为BCM5709,BCM5716)驱动版本过旧,有严重BUG,传输数据时会导致网卡大量丢包。

以下是升级步骤:1.查看网卡型号,dell的服务器的BCM5709,BCM5716两款网卡都需要升级驱动。

[root@iSAoracle ~]# kudzu -p | grep -A 5 "class: NETWORK"class: NETWORKbus: PCIdetached: 0device: eth0driver: bnx2desc: "Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet"2.安装前查看当前网卡驱动版本号:modinfo bnx2[root@iSAoracle ~]# modinfo bnx2filename: /lib/modules/2.6.18-194.el5/updates/bnx2.koversion: 2.0.2 (此版本驱动有bug)license: GPLdescription: Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver author: Michael Chan <mchan@>srcversion: 074454FB1E7E207CC65247Ealias: pci:v000014E4d0000163Csv*sd*bc*sc*i*3.解压驱动:tar xzvf netxtreme2-6.0.53.tar.gz[root@fedora64test Driver]# tar zxvf netxtreme2-6.0.53.tar.gznetxtreme2-6.0.53/netxtreme2-6.0.53/bnx2inetxtreme2-6.0.53/bnx2-2.0.18c/netxtreme2-6.0.53/bnx2-2.0.18c/ChangeLog-cnic4.安装驱动[root@fedora64test Driver]# cd netxtreme2-6.0.53[root@fedora64test netxtreme2-6.0.53]# makemake -C bnx2/src KVER=2.6.29.4-167.fc11.x86_64 PREFIX=make[1]: Entering directory`/root/Server/Linux/Driver/netxtreme2-6.0.53/bnx2-2.0.18c/src'make -C /lib/modules/2.6.29.4-167.fc11.x86_64/buildSUBDIRS=/root/Server/Linux/Driver/netxtreme2-6.0.53/bnx2-2.0.18c/src modules [root@fedora64test netxtreme2-6.0.53]# make installmake -C bnx2/src KVER=2.6.29.4-167.fc11.x86_64 PREFIX=make[1]: Entering directory`/root/Server/Linux/Driver/netxtreme2-6.0.53/bnx2-2.0.18c/src'make -C /lib/modules/2.6.29.4-167.fc11.x86_64/buildSUBDIRS=/root/Server/Linux/Driver/netxtreme2-6.0.53/bnx2-2.0.18c/src modules make[2]: Entering directory `/usr/src/kernels/2.6.29.4-167.fc11.x86_64'5.查看升级是否成功:[root@fedora64test ~]# modinfo bnx2filename: /lib/modules/2.6.29.4-167.fc11.x86_64/updates/bnx2.ko version: 2.0.18c (升级成功)license: GPLdescription: Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver author: Michael Chan <mchan@>如何检测服务器的网卡相关信息:一、如何查看你的网卡型号及芯片信息1.使用kuduzu命令加上p参数[root@QMS64test ~]# kudzu -p | grep -A 5 "class: NETWORK"class: NETWORKbus: PCIdetached: 0device: eth0driver: e1000edesc: "Intel Corporation 82574L Gigabit Network Connection"--class: NETWORKbus: PCIdetached: 0device: eth1driver: e1000edesc: "Intel Corporation 82574L Gigabit Network Connection"2.直接查看/etc/sysconfig/hwconf[root@QMS64test ~]# cat /etc/sysconfig/hwconf | grep -A 5 "class: NETWORK" class: NETWORKbus: PCIdetached: 0device: eth0driver: e1000edesc: "Intel Corporation 82574L Gigabit Network Connection"网卡的型号--class: NETWORKbus: PCIdetached: 0device: eth1driver: e1000edesc: "Intel Corporation 82574L Gigabit Network Connection"以上两种方式完全等效。

西数硬盘使用手册

西数硬盘使用手册
1 关于 WD 驱动器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
特征 .......................................................................... 1 工具包内物品 .................................................................. 2 可选附件 ...................................................................... 2 操作系统兼容性 ................................................................ 3 磁盘驱动器格式化 .............................................................. 3 物理描述 ...................................................................... 3
电源 / 活动 LED............................................................................................................................4 USB 2.0 接口 ......................................................................4 注册您的驱动器 ................................................................ 4 搬运注意事项 .................................................................. 4

hpproliantdl580g7服务器-服务器开机报错代码详解

hpproliantdl580g7服务器-服务器开机报错代码详解

HP ProLiant DL580 G7 服务器- 服务器的开机报错代码详解背景介绍:经常在诊断服务器时候,由于没有任何外部警告灯的提示,所以无法锁定故障点,因此需要登录HP管理模块,进行日志信息的查看,里面会有一些错误代码。

问题本文主要为HP ProLiant DL580 G7服务器的开机报错代码详解。

解决方案100 系列1.101-I/O ROM Error蜂鸣声:无可能的原因:PCI、PCI-X 或PCI Express 设备上的选件ROM 已损坏。

措施:如果可以卸下设备,请将其卸下,然后检查消息是否消失。

更新发生故障的设备的选件ROM。

2.101-ROM Error蜂鸣声:一声长音,一声短音可能的原因:系统ROM 校验和。

措施:运行Insight Diagnostics,按照说明更换发生故障的组件。

3.101-Option ROM Checksum Error...蜂鸣声:一声长音,一声短音可能的原因:系统中的扩展卡无法正常工作。

措施:如果最近添加了新硬件,请将其卸下,然后检查问题是否仍然存在。

在卸下新硬件后,如果该消息消失,则说明扩展卡可能存在问题。

请查阅扩展卡文档,然后尝试重新安装该板卡。

4.102-System Board Failure蜂鸣声:无可能的原因:8237 DMA 控制器、8254 计时器和类似设备。

措施:更换主板。

运行服务器设置实用程序。

5.104-ASR Timer Failure蜂鸣声:无可能的原因:主板故障。

措施:运行Insight Diagnostics,按照说明更换发生故障的组件。

6.162-System Options Not Set蜂鸣声:两声长音可能的原因:配置不正确。

系统配置在上次引导后发生了变化(例如,添加了硬盘驱动器),或者发生了实时时钟断电情况。

如果板载电池无法正常工作,则会发生实时时钟断电情况。

措施:按F1 键以记录新配置。

运行服务器设置实用程序以更改配置。

PCF8576静态驱动程序

PCF8576静态驱动程序

//**************************************************** init8576(); all_on(); delay(2000); init8576(); all_off(); delay(2000); init8576(); icon1(); delay(2000); init8576(); icon2(); delay(2000); init8576(); icon3(); delay(2000); init8576(); icon4(); delay(2000); init8576(); all_on(); delay(2000); //************************************************ init8576a(); all_on(); delay(2000); init8576a(); all_off(); delay(2000); init8576a(); icon1(); delay(2000); initC icon2(); delay(2000); init8576a(); icon3(); delay(2000); init8576a(); icon4(); delay(2000); init8576a(); all_on(); delay(2000); //************************************************** init8576b(); all_on(); delay(2000); init8576b(); all_off(); delay(2000); init8576b(); icon1(); delay(2000); init8576b(); icon2(); delay(2000); init8576b(); icon3(); delay(2000); init8576b(); icon4(); delay(2000); init8576b(); all_on(); delay(2000); //************************************************** init8576c(); all_on(); delay(2000); init8576c(); all_off(); delay(2000); init8576c(); icon1(); delay(2000); init8576c(); icon2(); delay(2000); init8576c(); icon3(); delay(2000); init8576c(); icon4(); delay(2000); init8576c(); all_on(); delay(2000); //************************************************** 第 3 页

RDA5807M模块规格书

产品规格书SPECIFICATION FOR PRODUCT 客户CLIENT ————————————————品名RRD-102V2。

0(CPU为RDA5807M)PARTNAME ————————————————规格11.2X11.2X2。

0 SPECIFICATION ————————————————( Mode selectable)(IC RDA5807M)一、产品概述:“RRD-102V2.0”立体声收音模块(FM Stereo radio Module)高灵敏度、低功耗、超小体积的调频立体声收音模组。

采用RDA Microelectronics的RDA5807M(或RDA5802NM),此电路外围元件少、噪声系数极小。

具有体积小、低功耗、低成本、应用简单、使用范围广等优点。

是一款简单易用且具极高性价比的单芯片FM立体声收音模组。

二、应用范围:A: 移动DVD、TV、MP3、MP4等内置式FM全频段无线接收模组。

B:工矿、企业、校园、小区、旅游区等公共场所立体声调频广播系统。

C:无线音响及无线立体声耳机功能。

D:GPS导航、电视播音系统等无线调频收音。

E:高档游戏机及无线音频电子玩具。

F:移动电话、手机、对讲系统、移动收音装置等立体声收音。

G:PDAS及Notebook PC等周边应用。

三、功能特点:A、采用通用的102BC模块的封装,用户可直接替换使用,无需更改电路设计。

B、灵敏度高、噪声小、抗干扰能力强、外接元件极少、体积小(11*11.2MM Max)、使用极其简单。

C、76-108MHz全球FM频段兼容(包括日本76-91MHz和欧美87.5-108.5MHz)。

D、I2C串行数据总线接口通讯,支持外部基准时钟输入方式。

E、完全整合的COMS工艺单晶片集成电路,功耗极小。

F、内置高精度A/D(模数转换器)及数字频率合成器。

G、内置LDO调整、低功耗、超宽电压使用范围(2.7-3.6VDC)。

RDA5807模块与TEA5767模块不兼容的问题及解决方法V2

RDA5807模块与TEA5767模块不兼容的问题及解决方法V1.2(一),问题目录:1), 问题: 只能听到沙沙声, 收听不到电台;2), 问题: FM没有任何沙沙声;3), 问题: 手动调节能收听电台, 但自动搜台到了87.5M就频点不动;4), 问题: 搜台过程,FM没有反应.5), 问题: 调节FM音量时, 能听到杂音;6), 问题: 退出FM菜单后, 再进入FM菜单, 此时原来存好的电台, 听到的却是沙沙声, 需要重新TUNE(调台)一下, 才正常.7), 问题: 能收听到电台, 搜完一圈,但搜不到一个电台?此问题曾出现在自己用8bitMCU编写程序的设计公司.8), 问题: 瑞芯微27平台搜索到重复的电台;9), 问题: 搜台时在强台附近偶尔会重复停台;10),问题: 测试FM频率响应时, RDA5807模块的频响较差,100HZ时为+5dB?11),问题: 炬力平台中,当RDA5807工作在欧美频段时,通过菜单改变到日本频段,再恢复到欧美频段,出现FM工作频点跟屏上显示频点不对应;12),在对5807当成5767进行编程时,需要注意的几个问题:(二),问题的详细情况及解决方法:1), 问题: 只能听到沙沙声, 收听不到电台;可能原因: 供电电源的差别,5807工作电压: 2.7V-5.5V.5767工作电压: 2.5V-5.0V解决方法: 减少电源退藕电阻阻值等方法提高电源电压.2), 问题: FM没有任何沙沙声;可能原因1:TEA5767支持I2C/SPI两种通讯方式,RDA5807只支持I2C通讯方式,解决方法: 改用I2C通讯方式,或者建议采用RDA5800C模块可能原因2: FM采用的I2C时序非标准的I2C时序;5807采用的是标准的I2C接口时序,只要严格遵循I2C时序,5807能确保正常工作;但在I2C接口细节上跟5767有细微的差别, 在I2C时序工作在非标准状态时,有时会出现5767能工作,5807不能工作:解决方法:请按照下续I2C时序图核对,通过软件修改掉非标准的地方;例如出现下述非I2C标准情况下,5807将不能可靠工作:3),问题: 手动调节能收听电台, 但自动搜台到了87.5M就频点不动;可能原因:读回的寄存器值中RF标志位有差别.RDA5807的RF位在有台时为0,无台时或者频率超出范围时为1,而TEA5767的RF位跟datasheet说明不符,在TUNE时一直为1;解决方法:5767正常搜台是不需要判断RF标志位, 如果有出现搜台判断RF标志位的,请屏蔽掉该部分多余代码.例如:// while(!(temp&0x80))// {// DelayMs_nops(4);//10// if(++cnt>25)// return FM_SearchFail; //fail// Tuner_ReadData(&temp, 1);// }4), 问题:搜台过程,FM没有反应.可能原因:5767支持内部搜台模式(即硬搜台模式 SM = 1),5807不支持该模式,只支持软件搜台,即软件每个频点tune,然后读寄存器判断是否有台.解决方法: 修改软件把硬件搜台方式改为软件搜台方式, 或推荐采用5800c模块;备注: 区别硬搜台,软搜台的简便方法就是, 搜台时界面如果显示的是频点持续的递增或者递减直到一个找到一个台停下来, 一般为软搜台模式, 如果显示的是搜索中…或者不显示,直接变化到找到的频点,一般采用的为硬搜台模式.附:由于飞利浦该模式的搜台效果不好,大部分主芯片平台都不采用5767的硬搜台模式,我们对ali,瑞芯微以及炬力平台的mp3测试结果也显示该模式并未被使用;5),问题: 调节FM音量时, 能听到杂音;原因: 调节音量时主控通过I2C向FM发出了TUNE的命令,TEA5767对相同频点写操作,不会发生重新TUNE.RDA5807写相同频点,则会重新TUNE一次, TUNE过程中会有声音.解决方法:去掉调音量时这个多余的对FM进行TUNE的代码.6), 问题: 退出FM菜单后, 再进入FM菜单, 此时原来存好的电台, 听到的却是沙沙声, 需要重新TUNE(调台)一下, 才正常.原因: 5767 在退出FM菜单后, 使5767进入了standby状态,5767进入standby状态并不会关掉32.768k的时钟,而5807此时已经关闭了32.768k时钟, 因此此时再进入FM菜单转变为工作状态后, 立即写入频点,5767由于没有关掉32.768k的时钟, 因此可以TUNE成功,,而5807需要约500ms的晶体起振时间, 立即TUNE则不成功,解决办法: 进入FM菜单后, 延时500ms等晶体起振稳定后,再重新TUNE一次当前频点,7),问题: 能收听到电台, 搜完一圈,但搜不到一个电台?此问题曾出现在自己用8bitMCU编写程序的设计公司.可能原因1: 5767搜台时读回的值搜台成功时, IF在范围之间, LEV则根据信号强度在0-0xff之间; 而5807在搜台时读回的5807的IF和LEV并非实际值,因为这些值牵扯到5767内部的计算,RDA5807目的是骗过软件,在搜台成功时,IF 给出7'h38, LEV给出4'h8;搜台不成功时,IF给出7'h18,LEV给出4'h0解决办法: 编程时有台的判别范围请不要超过7’h38(IF), 4’h8(LEV)可能原因2: 5767搜台间隔(step delay)最小能到10ms,而5807的搜台稳定时间应在37ms以后;解决办法: 每次写频点后, 延时37ms(建议值>40)后再对FM进行读操作,寄存器值才会稳定;8), 问题: 瑞芯微27平台搜索到重复的电台;原因: 显示为100k步进搜台,而软件实际使用50K步进搜台,5767支持50k步进的搜台;5807不支持50k步进的搜台,导致存重复台;解决办法: 将搜台50k步进改为100k步进;例如:FmStepChangeFreq(direct,TUNERFREQSTEP)改为FmStepChangeFreq(direct,TUNERFREQSTEP*2)9), 问题: 搜台时在强台附近偶尔会重复停台;原因:排除掉50k步进的问题,另外由于5807的停台灵敏度比较低,并且是固定不可调节,在有些信号很强的电台+/100k附近信号也相当强, 导致停重复台;解决办法: 建议采用5800C模块,5800C能够调节停台灵敏度;10),问题: 测试FM频率响应时, RDA5807模块的频响较差,100HZ时为+5dB?原因: 为了更好的音质体验,RDA5807默认为重低音是打开的,测试的时候可以关掉,但是时序比较麻烦,要进我们的debug mode(5800的i2c通信方式),不建议使用;解决方法: 给客户解释该原因, 可以建议客户采用5800C模块;备注:默认的volume(DAC gain)是4'b1011,volume_dsp是4'b1111.11),问题: 炬力平台中,当RDA5807工作在欧美频段时,通过菜单改变到日本频段,再恢复到欧美频段,出现FM工作频点跟屏上显示频点不对应;原因: 切换到日本频段时, 写到第4个寄存器中的Band Limits位, 写频点时这个Band Limits位是不需要改变的, 5767,5807会根据你所写入的PLL值决定工作频点;解决方法:修改basal_fmradio.c文件的中下面两个语句,就能解决该问题;case MC_OPEN:BankSwitch((ulong)address_24_of(FM_Init) >> 16);//return FM_Init(m_FMPlaystatus.mode,(BYTE)param);return FM_Init(0,(BYTE)param);//把m_FMPlaystatus.mode改为0就OK了.12),在对5807当成5767进行编程时,需要注意的几个问题:写寄存器:a),SM (search mode)应提醒用户常置为0,芯片内部搜台模式5807不支持。

RDA5807p收音芯片完整驱动程序

FM单芯片收音IC(RDA5807SP)与LCD型MCU 相结合,集成度高,外围少,基于DSP数字RF架构,彻底免生产调试。

极大地减少了人力,物力,提高生产效率,整体方案比传统PLL方案便宜百分之20以上,性价比高,FM方案成熟,已大批量投产。

本程序RDA5807p驱动程序,是企业级代码,完整规范,可以移植到任何51单片机甚至stm32,毫无压力!注意:此方案在iic总线上挂在多个器件,参考价值很高。

/**********************************I2C.C************************************/#include<string.h>#include <reg51.h>#include <intrins.h>#include "type.h"#include "utility.h"#include "debug.h"#include "I2C.h"#include "gpio.h"//SCL: GPIO_D[1]#define PORT_OUT_SCL GPIO_D_OUT#define PORT_IN_SCL GPIO_D_IN#define PORT_OE_SCL GPIO_D_OE#define MASK_BIT_SCL 0x02//SDA: GPIO_D[0]#define PORT_OUT_SDA GPIO_D_OUT#define PORT_IN_SDA GPIO_D_IN#define PORT_OE_SDA GPIO_D_OE#define MASK_BIT_SDA 0x01//#define SetInputSCL() ClrGpioRegBit(PORT_OE_SCL, MASK_BIT_SCL)#define SetOutputSCL() ClrGpioRegBit(PORT_OE_SCL, MASK_BIT_SCL)#define SetSCL() SetGpioRegBit(PORT_OUT_SCL, MASK_BIT_SCL)#define ClrSCL() ClrGpioRegBit(PORT_OUT_SCL, MASK_BIT_SCL)//#define GetSCL() (GetGpioReg(PORT_IN_SCL) & MASK_BIT_SCL)#define SetInputSDA() SetGpioRegBit(PORT_OE_SDA, MASK_BIT_SDA)#define SetOutputSDA() ClrGpioRegBit(PORT_OE_SDA, MASK_BIT_SDA)#define SetSDA() SetGpioRegBit(PORT_OUT_SDA, MASK_BIT_SDA)#define ClrSDA() ClrGpioRegBit(PORT_OUT_SDA, MASK_BIT_SDA)#define GetSDA() (GetGpioReg(PORT_IN_SDA) & MASK_BIT_SDA)#define KtIICDelay() //WaitUs(2)// send START signal.VOID I2C_Start(){SetSDA();SetSCL();SetOutputSCL();SetOutputSDA();SetSDA();SetSCL();KtIICDelay();ClrSDA();ClrSCL();}// send STOP signal.VOID I2C_Stop(){// DBG(("I2C_Stop()\n"));SetOutputSCL();SetOutputSDA();ClrSDA();KtIICDelay();SetSCL();SetSDA();SetInputSDA();}// send Acknowledgement(ACK or NACK) signal. VOID I2C_SendAck(){// DBG(("I2C_SendAck()\n"));ClrSDA();SetSCL();KtIICDelay();ClrSCL();}// send Acknowledgement(ACK or NACK) signal. VOID I2C_SendNoAck()SetSDA();SetSCL();KtIICDelay();ClrSCL();}// Check Ackowledge signal(ACK/NACK).BOOL I2C_ChkAck(){BOOL Ack;ClrSCL();SetInputSDA();SetSCL();KtIICDelay();Ack = !GetSDA();ClrSCL();return Ack;}// Send one byte via I2C(check ACK).BOOL I2C_WriteByte(BYTE Dat){BYTE i = 8;// DBG(("I2C_WriteByte(%-.2BX)\n", Dat));SetOutputSDA();ClrSCL();while(i--){if(Dat & 0x80) //MSB output first{SetSDA();}else{ClrSDA();}Dat <<= 1;SetSCL();KtIICDelay();ClrSCL();}return I2C_ChkAck();}// Receive one byte via I2C.BYTE I2C_ReadByte(){BYTE i = 8;BYTE Dat = 0;SetInputSDA();while(i--){Dat <<= 1;if(GetSDA()){Dat |= 0x01;}SetSCL();KtIICDelay();ClrSCL();}SetOutputSDA();return Dat;}BOOL I2C_WriteBytes(BYTE* Buf, BYTE Len) {while(Len--){if (!I2C_WriteByte(*(Buf++))){DBG(("write data err\n"));return FALSE;}}return TRUE;}// Read data via I2C.BOOL I2C_ReadBytes(BYTE* Buf, BYTE Len) {while(Len--){*(Buf++) = I2C_ReadByte();if(Len == 0){I2C_SendNoAck();}else{I2C_SendAck();}}return TRUE;}// Write data to eeprom from bufferBOOL I2C_WriteNByte(BYTE devAddr,WORD Addr, BYTE* Buf, BYTE Len) {#ifdef IIC_SENDADDRMACRO_ENBOOL acktemp = FALSE;acktemp = I2C_SendAddr(devAddr, Addr, IIC_WRITE);acktemp &= I2C_WriteBytes(Buf, Len);I2C_Stop();// DBG_APP(("I2C_WriteNByte,ACK: %bu\n",(BYTE)acktemp));return acktemp;#elseBYTE PageAddr = (((BYTE*)&Addr)[0] & 0x07) << 1;I2C_Start();if(!I2C_WriteByte(devAddr | PageAddr)){WaitMs(EEPROM_WRITE_TIME);I2C_Start();if(!I2C_WriteByte(devAddr | PageAddr)){I2C_Stop();return FALSE;}}if(I2C_WriteByte(((BYTE*)&Addr)[1])){if(I2C_WriteBytes(Buf, Len)){I2C_Stop();return TRUE;}}I2C_Stop();return FALSE;#endif}// Read data from eeprom.BOOL I2C_ReadNByte(BYTE devAddr,WORD Addr, BYTE* Buf, BYTE Len) {#ifdef IIC_SENDADDRMACRO_ENBOOL acktemp = FALSE;acktemp = I2C_SendAddr(devAddr,Addr,IIC_READ);acktemp &= I2C_ReadBytes(Buf, Len);I2C_Stop();return acktemp;#elseBYTE PageAddr = (((BYTE*)&Addr)[0] & 0x07) << 1;I2C_Start();if(!I2C_WriteByte(devAddr | PageAddr)){WaitMs(EEPROM_WRITE_TIME);I2C_Start();if(!I2C_WriteByte(devAddr | PageAddr)){I2C_Stop();return FALSE;}}if(I2C_WriteByte(((BYTE*)&Addr)[1])){I2C_Start();if(I2C_WriteByte(devAddr | 0x01 | PageAddr))if(I2C_ReadBytes(Buf, Len)){I2C_Stop();return TRUE;}}}I2C_Stop();return FALSE;#endif}// send address via IIC.#ifdef IIC_SENDADDRMACRO_ENBOOL I2C_SendAddr(unsigned char icAddr,unsigned int wAddr,unsigned char ucRW){I2C_Start();if (!I2C_WriteByte(icAddr)){WaitMs(EEPROM_WRITE_TIME); // Wairt for Programming-time.I2C_Start();if(!I2C_WriteByte(icAddr))// | PageAddr)){I2C_Stop();return FALSE;}}if(!I2C_WriteByte((unsigned char)wAddr)){I2C_Stop();return FALSE;}if (ucRW == IIC_READ){I2C_Start();if(!I2C_WriteByte(icAddr| IIC_READ))I2C_Stop();return FALSE;}}return TRUE;}#endif //I2C_SendAddr/********************************RDA5807P.c************************************/ #include "syscfg.h"#include "RDA5807P.h"#include "i2c.h"#include "radio_ctrl.h"#include "utility.h"#include "debug.h"#ifdef FUNC_RADIO_ENWORD CODE RDA5807P_RegMap[32] ={// 0x02,0x0401, //MUTE on //high impendance 327680x03,0x0000, //freq 0//band 875--1080//space 100k//turn off//turn on 0x00100x04,0x0400,0x05,0x86AF, //0x8AAF//SEEK threshold //VOL0x06,0x8000,0x07,0x5F1A,0x12,0xF000,0x13,0x7F0B,0x14,0x0071,0x15,0x42C0,0x1A,0x10C0,0x1C,0x6015,0x21,0x4580,0x24,0x0601,0x26,0x0D04,0x2C,0x3C3B,0x35,0x3877};BOOL RDA5807WriteReg(WORD addr, WORD dat){return I2C_WriteNByte(RDA5807_CHIP_ADDR,addr,(BYTE*)&dat,2);}WORD RDA5807ReadReg(BYTE Register_Address){WORD TempData;I2C_ReadNByte(RDA5807_CHIP_ADDR, Register_Address,(BYTE*)(&TempData),2);return TempData;}VOID RDA5807P_Init(){BYTE i;WORD temp;RDA5807WriteReg(0x02,0x0002);WaitMs(50);#if MACRADIO_XTAL_12MRDA5807WriteReg(0x02,0x0411);#elseRDA5807WriteReg(0x02,0x0001);WaitMs(650);#endiffor(i = 0;i < RDA5807_REG_LEN;){RDA5807WriteReg(*(RDA5807P_RegMap + i),*(RDA5807P_RegMap+1 + i));i += 2;}temp = ((gRadioCtrl.Freq -870) << 6) | 0x0010;RDA5807WriteReg(0x03,temp); //FREQ //tune//band//spaceWaitMs(40);}BOOL RDA5807P_ReadID(){WORD READID;DBG(("RDA5807P_ReadID()\n"));if(!RDA5807WriteReg(0x02,0x0002))//reset{DBG(("RDA5807P_ReadID() FALSE!\n"));return FALSE;}WaitMs(300);READID = RDA5807ReadReg(0x0E);DBG(("readID:%X\n",READID));if(READID == 0x5804){DBG(("FM_ReadID,RDA5807P!\n"));return TRUE;}return FALSE;}VOID RDA5807P_Mute(BOOL MuteFg){WORD temp;temp = RDA5807ReadReg(0x02);if(MuteFg){temp &= 0xBFFF; //mute on}else{temp |= 0x4000; // mute oFF}RDA5807WriteReg(0x02,temp);}VOID RDA5807P_PowerDownDis(){RDA5807WriteReg(0x02, (RDA5807ReadReg(0x02) | 0xC000)); }VOID RDA5807P_PowerDownEn(){RDA5807WriteReg(0x02, (RDA5807ReadReg(0x02) & 0x3FFF));}VOID RDA5807P_FreqSet(){WORD Freq;WORD temp;Freq = gRadioCtrl.Freq;RDA5807P_Mute(TRUE); //if((Freq < 875) || (Freq > 1080)){Freq = 875;}temp = ((Freq -870) << 6) | 0x0010;RDA5807WriteReg(0x03,temp); //FREQ //tune//band//space }BYTE RDA5807P_SeekResultGet(){WORD readData0B;readData0B = RDA5807ReadReg(0x0B);if(readData0B & 0x0080) //ready{if(readData0B & 0x0100){return RADIO_SEEK_VALIDSTATION;}return RADIO_SEEK_STC;}return RADIO_SEEK_FALSE;}#endif数字存台,用at24c02芯片即可,驱动代码如下:#include<string.h>#include <reg51.h>#include <intrins.h>#include "type.h"#include "utility.h"#include "debug.h"#include "i2c.h"#include "24Cxx.h"#define EEPROM_WRITE_TIME 10 //10ms#define EEPROM_PAGE_SIZE 8 //8 bytes/page#if 1// Read data to buffer from eepromBOOL EEPROM_ReadBytes(BYTE Addr, BYTE* Buf, BYTE Len){#ifdef IIC_SENDADDRMACRO_ENreturn I2C_ReadNByte(EEPROM_WRITE_ADDR,((WORD)Addr),((BYTE*)Buf),(BYTE)Len); #else //!IIC_SENDADDRMACRO_ENI2C_Start();if(!I2C_WriteByte(EEPROM_WRITE_ADDR)){WaitMs(EEPROM_WRITE_TIME);I2C_Start();if(!I2C_WriteByte(EEPROM_WRITE_ADDR)){I2C_Stop();return FALSE;}}if(I2C_WriteByte(Addr)){I2C_Start();if(I2C_WriteByte(EEPROM_READ_ADDR)){if(I2C_ReadBytes(Buf, Len)){I2C_Stop();return TRUE;}}}I2C_Stop();return FALSE;#endif // !IIC_SENDADDRMACRO_EN}#endif // EEPROM_ReadBytes// Read one byte from eepromBYTE EEPROM_ReadByte(BYTE Addr){BYTE Temp = 0;EEPROM_ReadBytes(Addr, &Temp, 1);return Temp;}// Write data to eeprom from buffer#if 1BOOL EEPROM_WriteBytesInOnePage(BYTE Addr, BYTE* Buf, BYTE Len){#ifdef IIC_SENDADDRMACRO_ENreturn I2C_WriteNByte(EEPROM_WRITE_ADDR, ((WORD)Addr), ((BYTE*)Buf), ((BYTE)Len)); #elseI2C_Start();if(!I2C_WriteByte(EEPROM_WRITE_ADDR)){WaitMs(EEPROM_WRITE_TIME);I2C_Start();if(!I2C_WriteByte(EEPROM_WRITE_ADDR)){I2C_Stop();return FALSE;}}if(I2C_WriteByte(Addr)){if(I2C_WriteBytes(Buf, Len)){I2C_Stop();return TRUE;}}I2C_Stop();return FALSE;#endif}#endif // EEPROM_WriteBytesInOnePage// Write data to eeprom from bufferBOOL EEPROM_WriteBytes(BYTE Addr, BYTE* Buf, BYTE Len){while(Len){BYTE n = EEPROM_PAGE_SIZE - (Addr % EEPROM_PAGE_SIZE);if(n > Len){n = Len;}if(!EEPROM_WriteBytesInOnePage(Addr, Buf, n)){return FALSE;}Addr += n;Buf += n;Len -= n;}return TRUE;}// Write one byte to eepromBOOL EEPROM_WriteByte(BYTE Addr, BYTE Dat){return EEPROM_WriteBytes(Addr, &Dat, 1);}。

5802刷5800目前最详细教程

5802刷5800目前最详细教程我发这个帖子的目的是完善同学的这个帖子:没别的意思,只希望想刷的机油,上手更容易一点。

首先,我们要准备以下几个软件1、NOKIA PC套件(5802)下载地址:2、最新(改CODE用)下载地址:(感谢提供下载地址)3、V30 RM427 离线升级包下载地址:提取码:ef962c7d-afe6-11de-8a94-0014221b798a (感谢提供下载地址)由于QQ中转站只能保存7天,,,7天后会变更地址, 所以就不留下载的连接地址了.如果上面地址无法下载,又需要RM427的朋友,可以跟贴把邮箱留给我,我把RM427包发给你们.4、NSU软件(Nokia Software UpdaterSetup的缩写)下载地址:……………………………………………………分割线…………………………………………………………………………一、安装JAF 并修改CODE网址:作者:wenfh1. 安装 JAF 有机友反馈最好装在c盘).安装期间防火墙拦截请放行2. 点击里面解压出来的文件OGM_JAF_PKEY_Emulator_v4,在step 2 select exe and go里面点击选 "GO(launch selected)" 按钮. 会弹出 error: box driver not installed, 选 "OK", JAF 会自动开启.(vista用户注意:点开OGM_JAF_PKEY_Emulator_v4时一定要用管理员身份,切记切记!!!)要是有防火墙拦截请放行3. 选 BB5 页, 在 Prod. Manager 打勾, 右边选 "service" 按钮, 再选"Read Values" 按钮.此时,软件上将显示你手机原code信息.4. 将product code可选框内的code值(5802的CODE:0587111)修改为(5800国行黑色精英版的CODE:0559677)的code值, 然后选 "Write Values" 按钮, 完成!再点一下"Read Values" 按钮,看是否成功写入.(这时候code 值里应该是:0559677)二、安装PC套件,连接手机下面要的是,把PC套件安装(这个安装流程不需要写了吧?),然后在提示你接入手机的时候,把手机连上数据线,然后接到电脑的USB接口上(手机上要选择“PC套件”)等待电脑右下角一系列的驱动程序安装完毕后,在PC套件画面的左上角出现你手机型号的时候,表示你成功连接了手机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg52.h>#include <intrins.h>#include "lcd.h"#include "IIC.h"#include "delay.h"sbit K1 = P1^4;sbit K2 = P1^5;sbit K3 = P1^6;sbit K4 = P1^7;unsigned long frequency;// RDA5807 寄存器unsigned char RDA_reg_data[8] ={0xd0,0x00, // 02H0x00,0x00, // 03H0x00,0x40, // 04H0x90,0x88, // 05H};unsigned char code cdis1[ ] = {"FM STEREO RADIO "};unsigned char code cdis2[ ] = {"FM VOL "};char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节/********************************************************** 连续写寄存器子函数**********************************************************/ void RDA5807_write_reg(void){uchar i;I2C_start();// 收音模块写入操作I2C_write_byte(0x20);// 寄存器连续写操作for(i=0; i<8; i++){I2C_write_byte(RDA_reg_data[i]);}I2C_stop();/********************************************************** 连续读寄存器子函数**********************************************************/ void RDA5807_read_reg(uchar *reg_buf){I2C_start();// 收音模块读取操作I2C_write_byte(0x21);// 寄存器连续读操作reg_buf[0] = I2C_read_byte(I2C_ACK);reg_buf[1] = I2C_read_byte(I2C_ACK);reg_buf[2] = I2C_read_byte(I2C_ACK);reg_buf[3] = I2C_read_byte(I2C_NACK);I2C_stop();}/********************************************************** 模块上电初始化子函数**********************************************************/ void RDA5807_power(void){delayms(50);// 发送软件复位指令RDA_reg_data[0] = 0x00;RDA_reg_data[1] = 0x02;RDA5807_write_reg();delayms(10);// 收音模块默认参数RDA_reg_data[0] = 0xd0;RDA_reg_data[1] = 0x01;RDA5807_write_reg();}/**********************************************************功能描述:收音模块自动寻台模式**********************************************************/ void RDA5807_FM_seek(void){uint chan;uchar reg_data[4] = {0x00, 0x00, 0x00, 0x00};RDA_reg_data[3] &= ~(1 << 4); //调谐禁用// 内部自动寻台使能RDA_reg_data[0] |= (1 << 0); //SEEK位置1RDA5807_write_reg();// 等待STC 标志置位while(0 == (reg_data[0] & 0x40)){delayms(20);// 读取内部状态RDA5807_read_reg(reg_data);}// 获取当前工作频点chan = reg_data[0] & 0x03;chan = reg_data[1] | (chan << 8);chan = chan << 6;// 保存当前工作频点RDA_reg_data[2] = (chan >> 8) & 0xff;RDA_reg_data[3] = (chan & 0xff);}/********************************************************** 频率显示子函数**********************************************************/ void show_frequency(void){unsigned char i,display[5];unsigned int temp;temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0); //计算temp = temp>>6;frequency = (unsigned long)(100*temp+87000)/100;for(i=0; i<5; i++) // 清显存单元display[i] = 0x00;display[0] = (frequency)/1000 ; //数据转换display[1] = (frequency%1000)/100;display[2] = (frequency%100)/10;display[3] = 0x2e; //小数点display[4] = (frequency%10);if(display[0] == 0){display[0] = display[1]+0x30;display[1] = display[2]+0x30;display[2] = display[3];display[3] = display[4]+0x30;display[4] = 0x20;}else{display[0] += 0x30;display[1] += 0x30;display[2] += 0x30;display[4] += 0x30;}lcd_pos_xy(3,2); //频率显示lcd_wdat(display[0]);lcd_wdat(display[1]);lcd_wdat(display[2]);lcd_wdat(display[3]);lcd_wdat(display[4]);}/********************************************************** 音量显示子函数**********************************************************/ void show_volume(){unsigned char temp,display[2];temp = RDA_reg_data[7] & 0x0f; //取音量值display[0] = temp/10;display[1] = temp%10;if(display[0] == 0) //如果高位为0{display[0] = display[1]; //低位显存内容进入高位显存display[1] = 0x20; //低位不显示}else{display[1] += 0x30;}display[0] += 0x30;lcd_pos_xy(13,2); //音量值显示lcd_wdat(display[0]);lcd_wdat(display[1]);}/********************************************************** 主函数**********************************************************/ void main(void){P0 = 0xff;P1 = 0xff;P2 = 0xff;lcd_init();lcd_w_string(0,1,cdis1,0);lcd_w_string(0,2,cdis2,0);RDA5807_power();while(1){if(K1 == 0){delayms(20);if(K1 == 0){RDA_reg_data[0] |= (1 << 1); //SEEK UPRDA5807_FM_seek();while(K1 == 0);}}if(K2 == 0){delayms(20);if(K2 == 0){RDA_reg_data[0] &= ~(1 << 1); //SEEK DOWN RDA5807_FM_seek();while(K2 == 0);}}if(K3 == 0){delayms(20);if(K3 == 0){if((RDA_reg_data[7] & 0x0f) < 0x0f){RDA_reg_data[0] = 0xd0;RDA_reg_data[1] = 0x01;RDA_reg_data[3] &= ~(1 << 4);RDA_reg_data[7]++; // 音量递增RDA5807_write_reg();while(K3 == 0);}}}if(K4 == 0){delayms(20);if(K4 == 0){if((RDA_reg_data[7] & 0x0f) > 0x00){RDA_reg_data[0] = 0xd0;RDA_reg_data[1] = 0x01;RDA_reg_data[3] &= ~(1 << 4);RDA_reg_data[7]--; // 音量递减RDA5807_write_reg();while(K4 == 0);}}}show_volume();show_frequency();}}/*********************************************************/。

相关文档
最新文档