当前位置:首页 > 单片机 > 单片机
[导读]RDA5820是北京锐迪科推出的一款集成度非常高的立体声FM收发芯片。该芯片具有以下特点:? FM发射和接收一体?支持65Mhz~115Mhz的全球FM接收频段,收发天线共用。?支持IIC/SPI接口?支持32.768K晶振?数字音量及自动AGC控

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<<=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 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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭