打印
[STM32F0]

【转】RDA5820收音机芯片驱动

[复制链接]
2562|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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拥有半自动搜台,全自动搜台两种模式


沙发
南国先生|  楼主 | 2016-12-4 00:33 | 只看该作者

具体设置参考代码

#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<<=8;
    res|=IIcReadByte(0);     //读低字节,发送NACK  
    IIcStop(); //产生一个停止条件
    return res; //返回读到的数据
}

//设置RDA5820为RX模式
void Rda5820RxMode(void)
{
    u16 temp;
    temp=Rda5820ReadReg(0X40); //读取0X40的内容
    temp&=0xfff0; //RX 模式   
    Rda5820WriteReg(0X40,temp) ; //FM RX模式
}

//设置RDA5820为TX模式
void Rda5820TxMode(void)
{
    u16 temp;
    temp=Rda5820ReadReg(0X40); //读取0X40的内容
    temp&=0xfff0;
    temp|=0x0001;    //TX 模式
    Rda5820WriteReg(0X40,temp) ; //FM TM 模式
}


使用特权

评论回复
板凳
南国先生|  楼主 | 2016-12-4 00:35 | 只看该作者
//得到信号强度
//返回值范围: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<<14;
    else temp&=~(1<<14);      
    Rda5820WriteReg(0X02,temp) ; //设置MUTE
}

//设置灵敏度
//rssi:0~127;
void Rda5820RssiSet(u8 rssi)
{
    u16 temp;
    temp=Rda5820ReadReg(0X05); //读取0X05的内容
    temp&=0X80FF;
    temp|=(u16)rssi<<8;   
    Rda5820WriteReg(0X05,temp) ; //设置RSSI
}

//设置TX发送功率
//gain:0~63
void Rda5820TxPagSet(u8 gain)
{
    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<<8;    //GAIN
    Rda5820WriteReg(0X42,temp) ; //设置PGA
}

//设置RDA5820的工作频段
//band:0,87~108Mhz;1,76~91Mhz;2,76~108Mhz;3,用户自定义(53H~54H)
void Rda5820BandSet(u8 band)
{
    u16 temp;
    temp=Rda5820ReadReg(0X03); //读取0X03的内容
    temp&=0XFFF3;
    temp|=band<<2;    
    Rda5820WriteReg(0X03,temp) ; //设置BAND
}

//设置RDA5820的步进频率
//band:0,100Khz;1,200Khz;3,50Khz;3,保留
void Rda5820SpaceSet(u8 spc)
{
    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)return;
    chan=(freq-fbtm)/spc; //得到CHAN应该写入的值
    chan&=0X3FF; //取低10位
    temp|=chan<<6;
    temp|=1<<4; //TONE ENABLE   
    Rda5820WriteReg(0X03,temp) ; //设置频率
    DelayMs(20); //等待20ms
    while((Rda5820ReadReg(0X0B)&(1<<7))==0);//等待FM_READY
   
}
//得到当前频率
//返回值:频率值(单位10Khz)
u16 Rda5820FreqGet(void)
{
    u16 temp;
    u8 spc=0,band=0;
    u16 fbtm,chan;
    temp=Rda5820ReadReg(0X03); //读取0X03的内容
    chan=temp>>6;   
    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;
    }
    temp=fbtm+chan*spc;
    return temp;//返回频率值
}


使用特权

评论回复
地板
mintspring| | 2016-12-4 12:25 | 只看该作者
不错,好东西,竟然还可以作为发射器用。

使用特权

评论回复
5
mintspring| | 2016-12-4 12:25 | 只看该作者
可以用于数字对讲机的方案。

使用特权

评论回复
6
mintspring| | 2016-12-4 12:27 | 只看该作者
近几天刚刚学了IIC总线控制,想亲自实践一下,就从众多IIC控制的芯片中找到了这个RDA5820模块,刚从网上淘回来就开始写控制它的C51程序,经过一周多努力终于调试成功。
应用材料:
万用板、89C52单片机、LCD1206、rda5820、小喇叭、拉杆天线、驻集体话筒、触动开关、自锁开关、LED、LM386、电阻(可调)、电容(可调)、三极管(9018、8050、8550、3355、2053)、耳机插孔等。
整体图片:

主控电路:

发射功放电路及图片:

RDA5820是FM收发一体芯片,由芯片引出IIC总线作为控制端与51单片机相接,通过IIC写RDA5820寄存器来控制:FM接收/发射切换、音量大小、重音提升、软静音、软静噪、频点设定、发射功率调节、灵敏度调节等功能。
利用5个按键对整个系统进行控制:上、下、左、右、发射键

制作了个小小的菜单:

1、FM收音功能:
RDA5820可在65-115Mhz的频段内进行立体声FM接收,通过IIC设置40H寄存器的CHIP_FUNC[3:0]=0即可定义当前工作模式为FM接收模式。笔者选用常用频段87-108Mhz(设置03H寄存器的BAND[3:2]=00)并打开重音提升(设置01H寄存器的BASS [12]=1)进行测试。
笔者利用5个独立按键进行频率(03H CHAN[15:6])和音量(05H VOLUME[3:0])的控制,并将频率(0AH READCHAN[9:0])、音量(05H VOLUME[3:0])、信号强度(0BH RSSI[6:0])、是否立体声(0AH ST[10])等信息通过IIC读取显示在LCD1602屏上,如图(邯郸地区 中国之声88.7Mhz)由于RDA5820可以直接驱动耳机,接上50cm的拉杆天线,接上耳机就可以享受立体声广播了。

2、FM发射功能:
同样,RDA5820也可在65-115Mhz进行立体声发射,设置40H寄存器的CHIP_FUNC[3:0]=1即可定义当前工作模式为FM发射模式。笔者通过5个按键进行频率、发射功率(42H TX_PA_GAIN[5:0])(-30-3dB)的控制,并将频率(03H CHAN[15:6])、发射功率(42H TX_PA_GAIN[5:0])等信息显示在LCD屏上,如(图)。接上50cm的拉杆进行测试,在宿舍楼中实测距离在40米左右,有点近,要想达到更远的距离就要再加上功放了,笔者采用了以前制作好的调频发射器功放,如图(2sc9018+2sc3355+2sc2053功率在0.6W左右)发射距离能达到200m以上,把立体声插头接好插到MP3上就可以进行立体声转发了。


3、对讲机功能
很简单啦,将上述两种功能结合在一起就能实现对讲机功能,笔者采用
130-135MHz作为对讲频段,进入对讲机模式模块自动切到软静音状态,通过读取0BH寄存器来判断是否去噪,当模块接收到发射信号时0BH寄存器FM_TRUE[8]=1(有台),此时关掉软静音进入接收状态,否则继续软静音。当按键5按下时,模块切换到FM发射模式,并可通过上下按键调整功率大小。在天线端接上功放,一台数字对讲机就做成啦!

装机图片:



使用特权

评论回复
7
mintspring| | 2016-12-4 12:27 | 只看该作者
近几天刚刚学了IIC总线控制,想亲自实践一下,就从众多IIC控制的芯片中找到了这个RDA5820模块,刚从网上淘回来就开始写控制它的C51程序,经过一周多努力终于调试成功。
应用材料:
万用板、89C52单片机、LCD1206、rda5820、小喇叭、拉杆天线、驻集体话筒、触动开关、自锁开关、LED、LM386、电阻(可调)、电容(可调)、三极管(9018、8050、8550、3355、2053)、耳机插孔等。
整体图片:

主控电路:

发射功放电路及图片:

RDA5820是FM收发一体芯片,由芯片引出IIC总线作为控制端与51单片机相接,通过IIC写RDA5820寄存器来控制:FM接收/发射切换、音量大小、重音提升、软静音、软静噪、频点设定、发射功率调节、灵敏度调节等功能。
利用5个按键对整个系统进行控制:上、下、左、右、发射键

制作了个小小的菜单:

1、FM收音功能:
RDA5820可在65-115Mhz的频段内进行立体声FM接收,通过IIC设置40H寄存器的CHIP_FUNC[3:0]=0即可定义当前工作模式为FM接收模式。笔者选用常用频段87-108Mhz(设置03H寄存器的BAND[3:2]=00)并打开重音提升(设置01H寄存器的BASS [12]=1)进行测试。
笔者利用5个独立按键进行频率(03H CHAN[15:6])和音量(05H VOLUME[3:0])的控制,并将频率(0AH READCHAN[9:0])、音量(05H VOLUME[3:0])、信号强度(0BH RSSI[6:0])、是否立体声(0AH ST[10])等信息通过IIC读取显示在LCD1602屏上,如图(邯郸地区 中国之声88.7Mhz)由于RDA5820可以直接驱动耳机,接上50cm的拉杆天线,接上耳机就可以享受立体声广播了。

2、FM发射功能:
同样,RDA5820也可在65-115Mhz进行立体声发射,设置40H寄存器的CHIP_FUNC[3:0]=1即可定义当前工作模式为FM发射模式。笔者通过5个按键进行频率、发射功率(42H TX_PA_GAIN[5:0])(-30-3dB)的控制,并将频率(03H CHAN[15:6])、发射功率(42H TX_PA_GAIN[5:0])等信息显示在LCD屏上,如(图)。接上50cm的拉杆进行测试,在宿舍楼中实测距离在40米左右,有点近,要想达到更远的距离就要再加上功放了,笔者采用了以前制作好的调频发射器功放,如图(2sc9018+2sc3355+2sc2053功率在0.6W左右)发射距离能达到200m以上,把立体声插头接好插到MP3上就可以进行立体声转发了。


3、对讲机功能
很简单啦,将上述两种功能结合在一起就能实现对讲机功能,笔者采用
130-135MHz作为对讲频段,进入对讲机模式模块自动切到软静音状态,通过读取0BH寄存器来判断是否去噪,当模块接收到发射信号时0BH寄存器FM_TRUE[8]=1(有台),此时关掉软静音进入接收状态,否则继续软静音。当按键5按下时,模块切换到FM发射模式,并可通过上下按键调整功率大小。在天线端接上功放,一台数字对讲机就做成啦!

装机图片:



使用特权

评论回复
8
简单happy| | 2016-12-4 20:51 | 只看该作者
我做过RDA5820的FM发射机,STM32F103C8T6的MCU。不知道是不是电源的问题,首次上电一段时间后,出现类似于自激的杂音,重新上电连续工作10个小时都没有问题

使用特权

评论回复
9
stcsanqi| | 2019-3-9 14:33 | 只看该作者
mintspring 发表于 2016-12-4 12:27

请问可以发一下作为发射机的程序吗?谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

160

帖子

3

粉丝