RDA5820收音机芯片驱动 |
您所在的位置:网站首页 › s1a0426c02收音机芯片 › RDA5820收音机芯片驱动 |
RDA5820 是北京锐迪科推出的一款集成度非常高的立体声 FM收发芯片。该芯片具有以下 特点: FM 发射和接收一体 支持 65Mhz~115Mhz的全球 FM接收频段,收发天线共用。 支持 IIC/SPI接口 支持 32.768K晶振 数字音量及自动 AGC控制 支持立体声/单声道切换,带软件静音功能 支持 I2S接口(输入/输出) 内置 LDO,使用电压范围宽(2.7~5.5V) 高功率 32欧负载音频输出、可直接驱动耳机 集成度高、功耗低、尺寸小(4mm*4mm QFN封装)、应用简单 RDA5820引脚图如图所示
RDA5820 支持 2种通信模式, SPI和 IIC,MODE脚接 GND,RDA5820即进入 IIC模式,此时 SCLK充当 IIC的 SCL,SDIO充当 IIC的 SDA。RDA5820的 IIC地址为 0X11(不包含最低位),对应读为 0X23,写为 0X20 实际电路连接如下
RDA5820拥有半自动搜台,全自动搜台两种模式 具体设置参考代码 #include "rda5820.h" //初始化 //0,初始化成功; //其他,初始化失败. u8 Rda5820Init(void) { u16 id; IIcInit(); //初始化IIC口 id=Rda5820ReadReg(RDA5820_R00); //读取ID =0X5805 if(id==0X5805) //读取ID正确 { Rda5820WriteReg(RDA5820_R02,0x0002); //芯片软复位 DelayMs(400);//等待复位结束 Rda5820WriteReg(RDA5820_R02,0x0001); //芯片上电 DelayMs(600); Rda5820WriteReg(RDA5820_R02,0xD201); //芯片上电,不复位 正常天线 32.768时钟 循环搜索 不开始搜索 想上搜索 低音增强 立体声 非静音 非高阻抗 Rda5820WriteReg(RDA5820_R03,0x0000); //100k apace 87-108baud 不开启调谐 Rda5820WriteReg(RDA5820_R04,0x0000); //关闭中断 0.75us去加重 不使能iis io口全部浮空 Rda5820WriteReg(RDA5820_R05,0X8548); //搜索强度8,LNAN,1.8mA,VOL最大 无输入低噪声 // Rda5820WriteReg(RDA5820_R0A,0X7800); //0A不用设置 // Rda5820WriteReg(RDA5820_R0B,0X7800); //0b不用设置 Rda5820WriteReg(RDA5820_R40,0X0000); //半自动搜台 RX工作模式 Rda5820WriteReg(RDA5820_R41,0X0000); //RDS应答为0 不复位fifo fifo深度为0 // Rda5820WriteReg(RDA5820_R42,0X0000); //42不用设置 Rda5820WriteReg(RDA5820_R4A,0X0010); //fifo满中断 Rda5820FreqSet(8700);//设置初始化频率81.00M }else return 1;//初始化失败 return 0; } //写RDA5820寄存器 void Rda5820WriteReg(u8 addr,u16 val) { IIcStart(); IIcSendByte(RDA5820_WRITE); //发送写命令 IIcWaitAck(); IIcSendByte(addr); //发送地址 IIcWaitAck(); IIcSendByte(val>>8); //发送高字节 IIcWaitAck(); IIcSendByte(val&0XFF); //发送低字节 IIcWaitAck(); IIcStop(); //产生一个停止条件 } //读RDA5820寄存器 u16 Rda5820ReadReg(u8 addr) { u16 res; IIcStart(); IIcSendByte(RDA5820_WRITE); //发送写命令 IIcWaitAck(); IIcSendByte(addr); //发送地址 IIcWaitAck(); IIcStart(); IIcSendByte(RDA5820_READ); //发送读命令 IIcWaitAck(); res=IIcReadByte(1); //读高字节,发送ACK res u16 temp; temp=Rda5820ReadReg(0X40); //读取0X40的内容 temp&=0xfff0; temp|=0x0001; //TX 模式 Rda5820WriteReg(0X40,temp) ; //FM TM 模式 } //得到信号强度 //返回值范围:0~127 u8 Rda5820RssiGet(void) { u16 temp; temp=Rda5820ReadReg(0X0B); //读取0X0B的内容 return temp>>9; //返回信号强度 } //设置音量ok //vol:0~15; void Rda5820VolSet(u8 vol) { u16 temp; temp=Rda5820ReadReg(0X05); //读取0X05的内容 temp&=0XFFF0; temp|=vol&0X0F; Rda5820WriteReg(0X05,temp) ; //设置音量 } //静音设置 //mute:0,不静音;1,静音 void Rda5820MuteSet(u8 mute) { u16 temp; temp=Rda5820ReadReg(0X02); //读取0X02的内容 if(mute)temp|=1 u16 temp; temp=Rda5820ReadReg(0X42); //读取0X42的内容 temp&=0XFFC0; temp|=gain; //GAIN Rda5820WriteReg(0X42,temp) ; //设置PA的功率 } //设置TX 输入信号增益 //gain:0~7 void Rda5820TxPgaSet(u8 gain) { u16 temp; temp=Rda5820ReadReg(0X42); //读取0X42的内容 temp&=0XF8FF; temp|=gain u16 temp; temp=Rda5820ReadReg(0X03); //读取0X03的内容 temp&=0XFFFC; temp|=spc; Rda5820WriteReg(0X03,temp) ; //设置BAND } //设置RDA5820的频率 //freq:频率值(单位为10Khz),比如10805,表示108.05Mhz void Rda5820FreqSet(u16 freq) { u16 temp; u8 spc=0,band=0; u16 fbtm,chan; temp=Rda5820ReadReg(0X03); //读取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=Rda5820ReadReg(0X53);//得到bottom频率 fbtm*=10; } if(freq fbtm=Rda5820ReadReg(0X53);//得到bottom频率 fbtm*=10; } temp=fbtm+chan*spc; return temp;//返回频率值 } void RdaSeek(void) { u16 temp; u16 count = 0; temp=Rda5820ReadReg(RDA5820_R02); //读取0X03的内容 temp|=0X0100; Rda5820WriteReg(RDA5820_R02,temp) ; //开始搜台 do { DelayMs(20); temp = Rda5820ReadReg(RDA5820_R02);//读取搜台结果 temp&= 0x0100; count++; if(count > 5000)return; }while(temp == 0x0100); } #ifndef __RDA5820_H #define __RDA5820_H #include "ioremap.h" #include "delay.h" #include "iic.h" #define RDA5820_R00 0X00 //读出16个位的ID =0X5820 //16位的辨识ID 0x5820 #define RDA5820_R02 0X02 //DHIZ[15],DMUTE[14],MONO[13],BASS[12],SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:4],ANTENNA[2],SOFTRESET[1],ENABLE[0] //bit0 ENABLE 芯片上电1 芯片不上电0 //bit1 SOFTRESET 芯片软复位1 不复位0 //bit2 ANTENNA 1使用内部小天线 0使用正常的外部天线(内部小天线速度慢很多) //bit6-bit4 时钟频率选择,根据实际频率选择 000 32.768khz //bit7 SKMODE 0循环搜索 1到达上线或者下限时停止搜索 //bit8 SEEK 0搜索已经停止 1搜索开始 //bit9 搜索方向 0向下 1向上 //bit12 BASS 0不使能低音增强 1使能低音增强 //bit13 MONO 声道选择 0立体声 1非立体声 //bit14 DMUTE 静音选择 0静音 1非静音 //bit15 DHIZ 音频输出高阻抗选择 0选择高阻抗 1不选择高阻抗 #define RDA5820_R03 0X03 //CHAN[15:6],TUNE[4],BAND[3:2],SPACE[1:0] //bit15-6 当前频道,通过baud可以计算当前频率 //bit4 调谐 0关闭调谐 1启动调谐 //bit3-2 baud 频段选择 四种选择 //bit1-0 步进选择 00为100K #define RDA5820_R04 0X04 //STCIEN[14](搜索完成中断),DE[11],I2S_ENABLE[6],GPIO3~1[5:0] //bit14 1开启调谐调频中断 0关闭中断 中断引脚显示在GPIO2上 //bit11 去加重时间选择 0 75us 1 50us //bit6 i2s使能 0不使能 1使能 //bit5-bit0 三个GPIO的功能选择 建议都是00 #define RDA5820_R05 0X05 //INT_MODE[15],SEEKTH[14:8](设定信号强度),LNA_PORT_SEL[7:6],LNA_ICSEL_BIT[5:4],VOLUME[3:0]; //bit15 中断模式 0短时间中断 1直到清除0c才取消中断 //bit14-8 搜索阈值 高于这个值认为是有效台 //bit7-6 输入低噪声放大模式 00无输入 //bit5-4 输入低噪声电流 00 1.8ma //bit3-0 音量 0000最低1111最高 #define RDA5820_R0A 0X0A //STC[14](搜索完成标志),SF[13](搜索失败标志),ST[10](立体声标志),READCHAN[9:0](频率). //bit14 搜台完成标志 0未完成 1完成 //bit13 搜台失败标志 0成功 1失败 //bit10 立体声指示 0单声道 1立体声 //bit9-bit0 当前频率指示,可以计算出当前频率 #define RDA5820_R0B 0X0B //RSSI[15:9](信号强度),FM_TRUE[8](站点标志),FM_READY[7](fm就绪标志) //bit15-9 当前信号强度 //bit8 1当前频率是一个有效台 0不是 //bit7 1 已经准备好软件搜台 0没准备好 #define RDA5820_R40 0X40 //AUTO_SEEK[15](全/半自动搜台),CHAN_SCAN[14](搜空/忙台),CHIP_FUN[3:0](工作模式) //bit15 1全自动搜台 0手动搜台 //bit14 为FM发射搜索一个空闲频率 //bit3-0 选择工作模式 0000 rx模式 #define RDA5820_R41 0X41 //MEM_CLR[15](内存清除),RPT_TIME[14:9](RDS应答次数),MEM_DEPTH[8:0](FIFO大小,最大256) //bit15 1复位fifo 0不复位 //bit14-9 传输数据是RDS应答次数 //bit8-0 fifo的深度 0-256 #define RDA5820_R42 0X42 //TX_SIG_GAIN[10:8],TX_PA_GAIN[5:0](发射功率). //bit10-8 发射增益 000最小 111最大 //bit5-0 发射功率 #define RDA5820_R4A 0X4A //MEM_INTMOD[4:0] //bit4-bit0 内存数据的中断模式 空中断 重复空中断 满中断 #define RDA5820_R4B 0X4B //CHAN_NUM[7:0](仅在全自动搜台有效,代表电台数量). //bit7-bit0 电台的数量 #define RDA5820_R4C 0X4C //TX_AUDIO_DEV[15:0] //发送音频设置 #define RDA5820_R4D 0X4D //TX_PILOT_DEV[15:0] //发送频点设置 #define RDA5820_R4E 0X4E //TX_RDS_DEV[15:0] //发送RDS设置 #define RDA5820_R53 0X53 //CHAN_BOTTON[10:0](通道最低频率,100kHZ为单位) //通道最低频率 #define RDA5820_R54 0X54 //CHAN_TOP[10:0](通道最高频率,100kHZ为单位) //通道最高频率 #define RDA5820_R64 0X64 //RDS_RXMOD[4:3](FIFO模式[10]或者寄存器模式[11]) //rds接收模式 有fifo模式和寄存器模式 #define RDA5820_READ 0X23 //读RDA5820 #define RDA5820_WRITE 0X22 //写RDA5820 u8 Rda5820Init(void); //初始化 void Rda5820WriteReg(u8 addr,u16 val); //写RDA5820寄存器 u16 Rda5820ReadReg(u8 addr); //读RDA5820寄存器 void Rda5820RxMode(void); //设置RDA5820为RX模式 void Rda5820TxMode(void); //设置RDA5820为TX模式 u8 Rda5820RssiGet(void); void Rda5820MuteSet(u8 mute); void Rda5820RssiSet(u8 rssi); void Rda5820VolSet(u8 vol); void Rda5820TxPagSet(u8 gain); void Rda5820TxPgaSet(u8 gain); void Rda5820BandSet(u8 band); void Rda5820SpaceSet(u8 spc); void Rda5820FreqSet(u16 freq); u16 Rda5820FreqGet(void); void RdaSeek(void); #endif |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |