RDA5820 是北京锐迪科推出的一款集成度非常高的立体声 FM收发芯片。该芯片具有以下

特点:

  FM 发射和接收一体

  支持 65Mhz~115Mhz的全球 FM接收频段,收发天线共用。

  支持 IIC/SPI接口

  支持 32.768K晶振

  数字音量及自动 AGC控制

  支持立体声/单声道切换,带软件静音功能

  支持 I2S接口(输入/输出)

  内置 LDO,使用电压范围宽(2.7~5.5V)

欧负载音频输出、可直接驱动耳机

  集成度高、功耗低、尺寸小(4mm*4mm QFN封装)、应用简单

RDA5820引脚图如图所示

种通信模式, 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<<=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 模式 

}









//得到信号强度

//返回值范围: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;//返回频率值

}





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

RDA5820收音机芯片驱动的更多相关文章

  1. 基于335X平台的UBOOT中交换芯片驱动移植

    基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...

  2. 绿联Type-C千兆网卡AX88179芯片驱动(苹果Mac OSX系统)CM141丨CM179

    绿联Type-C千兆网卡AX88179芯片驱动(苹果Mac OSX系统)CM141丨CM179 下载地址:https://www.lulian.cn/download/6-cn.html AX8817 ...

  3. 基于335X平台Linux交换芯片驱动开发

    基于335X平台Linux交换芯片驱动开发   一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...

  4. Linux编译安装RTL8192CU芯片驱动,使用TP_LINK wn823n无线网卡

    前几天给自己的台式电脑安装了Window 7+CentOS 6.4 Linux双系统,发现在Windows 7下面可以正常使用TP_LINK wn823n无线网卡来连接无线网络,但是在Linux下面, ...

  5. mcp2515 芯片驱动总线错误BUG的解决方法

    http://blog.renren.com/share/221002615/11483613167 来自张涛的日志 现象:CAN总线在线上设备热插拔或长时间运行后出现总线异常情况,有时不能发送和接收 ...

  6. Linux芯片驱动之SPI Controller

    针对一款新的芯片,芯片厂商如何基于Linux编写对应的 SPI controller 驱动? 我们先看看 Linux SPI 的整体框架: 可以看到,最底层是硬件层,对应芯片内部 SPI contro ...

  7. Ubuntu下成功安装台式机网卡realtek的rtl8188eu芯片驱动并实现AP功能

    1,下载驱动 https://github.com/lwfinger/rtl8188eu 使用注意: https://github.com/lwfinger/rtl8188eu/issues/3 2. ...

  8. STM32驱动TEA5767收音机模块

    Tea5767是飞利浦公司出的一款集成化的收音机芯片,大四的时候机缘巧合遇到了这个芯片,用了一下,写点资料 主要特性 TEA5767HN是一款低功耗立体声收音IC,广泛应用于手机MP3 .MP 4 播 ...

  9. 基于iTop4412的FM收音机系统设计(一)

    说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计 现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:AP ...

随机推荐

  1. android 代码动态创建视图

    LinearLayout 如何动态设置 margin? LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayou ...

  2. AI 人工智能 探索 (六)

    这次我为 角色 attribute 添加了 多个属性 其中 att 是 好人 坏人 等属性, 显然 数字不同 就要打起来. grade 是智商属性 ,今天先做了 3的智商.也就是小兵智商.碰到就打 逃 ...

  3. 深入Java单例模式

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.  所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在. ...

  4. HBase性能优化方法总结(一):表的设计

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第一部分内容:表的设计相关的优化方法 ...

  5. 转:浏览器与WEB服务器工作过程举例

    用户通过“浏览器”访问因特网上的WEB服务器,浏览器和服务器之间的信息交换使用超文本传输协议(HTTP--HyperText Transfer Protocol). 例:用户访问东南大学主页 Http ...

  6. 转:webdriver驱动未在默认目录安装的firefox

    刚开始用webdriver的朋友一定会苦恼它时常不能启动firefox,很多时候是因为firefox安装在默认路径下.此时,我们有些常用方法,可以解决此问题. [1] System.setProper ...

  7. zendstudio的安装与配置

    <微信公众平台应用开发实战>第1章搭建开发环境和相关技术介绍,本章会先介绍微信公众平台的一些基本概念和公众平台的开发模式:然后讲解如何搭建开发环境—AppServ和zendstudio:然 ...

  8. Android应用程序基础

    Android程序使用Java语言编写.Android开发套件把数据.资源文件和Java代码编译到一个.以.apk为后缀名的Android压缩包中.一个单独的apk文件中的所有代码被认为是一个andr ...

  9. STL笔记之set

    //---------------------------------------------------------// set综述//------------------------------- ...

  10. MySQL解决"is marked as crashed and should be repaired"故障

    具体报错如下: Table '.\Tablename\posts' is marked as crashed and should be repaired 提示说论坛的帖子表posts被标记有问题,需 ...