RDA5820N是一款广播FM接受或发射模块,支持50M~115M频段FM和RDS/RBDS接收和发射,支持电源范围为1.8-5.5V。更多详细介绍请看数据手册。
RDA5820N模块是在做2018年电赛无线话筒扩音系统时使用的发射模块,接收模块用的使TEA5767,当然RDA5820N也是可以的,但是当时考虑到价格,所以用了TEA5767,本篇文章主要分享RDA5820N的.c和.h文件。
rda5820.h
#ifndef __RDA5820_H
#define __RDA5820_H
#include "sys.h"
#include "myiic.h"
#define RDA5820_R00 0X00 //读出16个位的ID =0X5820
#define RDA5820_R02 0X02 //寄存器地址的具体意义详见数据手册第13页
#define RDA5820_READ 0X23 //读RDA5820
#define RDA5820_WRITE 0X22 //写RDA5820
u8 RDA5820_Init(void); //初始化
void RDA5820_WR_Reg(u8 addr,u16 val); //写RDA5820寄存器
u16 RDA5820_RD_Reg(u8 addr); //读RDA5820寄存器
void RDA5820_RX_Mode(void); //设置RDA5820为RX模式
void RDA5820_TX_Mode(void); //设置RDA5820为TX模式
u8 RDA5820_Rssi_Get(void); //得到信号强度
void RDA5820_Mute_Set(u8 mute); //静音设置
void RDA5820_Rssi_Set(u8 rssi); //设置灵敏度
void RDA5820_Vol_Set(u8 vol); //设置音量
void RDA5820_TxPAG_Set(u8 gain); //设置TX发送功率
void RDA5820_TxPGA_Set(u8 gain); //设置TX 输入信号增益
void RDA5820_Band_Set(u8 band); //设置RDA5820的工作频段
void RDA5820_Space_Set(u8 spc); //设置RDA5820的步进频率
void RDA5820_Freq_Set(u16 freq); //设置RDA5820的频率
u16 RDA5820_Freq_Get(void); //得到当前频率
#endif
rda5820.c
下列函数我在使用rda5820N时,并未全部使用,函数前有注释的是我在主函数中直接调用过的。
#include "usart.h"
#include "rda5820.h"
#include "delay.h"
//初始化,引脚的初始化在IIC_Init()中,IIC文件即正点原子提供的myiic
u8 RDA5820_Init(void)
{
u16 id;
IIC_Init(); //初始化IIC口
id=RDA5820_RD_Reg(RDA5820_R00); //读取ID =0X5820
printf("ID=%x ",id); //通过串口查看读取的id是否正确
if(id==0X5820) //读取ID正确
{
RDA5820_WR_Reg(RDA5820_R02,0x0002); //软复位
delay_ms(50);
RDA5820_WR_Reg(RDA5820_R02,0xC001); //立体声,上电
delay_ms(600); //等待时钟稳定
}else return 1;//初始化失败
return 0;
}
void RDA5820_WR_Reg(u8 addr,u16 val)
{
IIC_Start();
IIC_Send_Byte(RDA5820_WRITE); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送地址
IIC_Wait_Ack();
IIC_Send_Byte(val>>8); //发送高字节
IIC_Wait_Ack();
IIC_Send_Byte(val&0XFF); //发送低字节
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
}
u16 RDA5820_RD_Reg(u8 addr)
{
u16 res;
IIC_Start();
IIC_Send_Byte(RDA5820_WRITE); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(addr); //发送地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(RDA5820_READ); //发送读命令
IIC_Wait_Ack();
res=IIC_Read_Byte(1); //读高字节,发送ACK
res<<=8;
res|=IIC_Read_Byte(0); //读低字节,发送NACK
IIC_Stop(); //产生一个停止条件
return res; //返回读到的数据
}
//设置RDA5820为RX模式(接收模式)
void RDA5820_RX_Mode(void)
{
u16 temp;
temp=RDA5820_RD_Reg(0X40); //读取0X40的内容
temp&=0xfff0; //RX 模式
RDA5820_WR_Reg(0X40,temp) ; //FM RX模式
}
//设置RDA5820为TX模式(发送模式)
void RDA5820_TX_Mode(void)
{
u16 temp;
temp=RDA5820_RD_Reg(0X40); //读取0X40的内容
temp&=0xfff0;
temp|=0x0001; //TX 模式
RDA5820_WR_Reg(0X40,temp) ; //FM TM 模式
}
u8 RDA5820_Rssi_Get(void)
{
u16 temp;
temp=RDA5820_RD_Reg(0X0B); //读取0X0B的内容
return temp>>9; //返回信号强度
}
//设置音量,vol:0~15;
void RDA5820_Vol_Set(u8 vol)
{
u16 temp;
temp=RDA5820_RD_Reg(0X05); //读取0X05的内容
temp&=0XFFF0;
temp|=vol&0X0F;
RDA5820_WR_Reg(0X05,temp) ; //设置音量
}
void RDA5820_Mute_Set(u8 mute)
{
u16 temp;
temp=RDA5820_RD_Reg(0X02); //读取0X02的内容
if(mute)temp|=1<<14;
else temp&=~(1<<14);
RDA5820_WR_Reg(0X02,temp) ; //设置MUTE
}
void RDA5820_Rssi_Set(u8 rssi)
{
u16 temp;
temp=RDA5820_RD_Reg(0X05); //读取0X05的内容
temp&=0X80FF;
temp|=(u16)rssi<<8;
RDA5820_WR_Reg(0X05,temp) ; //设置RSSI
}
//设置TX发送功率,gain:0~63
void RDA5820_TxPAG_Set(u8 gain)
{
u16 temp;
temp=RDA5820_RD_Reg(0X41); //读取0X42的内容
temp&=0XFFC0;
temp|=gain; //GAIN
RDA5820_WR_Reg(0X41,temp) ; //设置PA的功率
}
//设置TX 输入信号增益,gain:0~7
void RDA5820_TxPGA_Set(u8 gain)
{
u16 temp;
temp=RDA5820_RD_Reg(0X68); //读取0X42的内容
temp&=0XE3FF;
temp|=gain<<10; //GAIN
RDA5820_WR_Reg(0X68,temp) ; //设置PGA
}
//band:0,87~108Mhz;1,76~91Mhz;2,76~108Mhz;3,65-76MHz or 50-65MHz
void RDA5820_Band_Set(u8 band)
{
u16 temp;
temp=RDA5820_RD_Reg(0X03); //读取0X03的内容
temp&=0XFFF3;
temp|=band<<2;
RDA5820_WR_Reg(0X03,temp) ; //设置BAND
}
//设置RDA5820的步进频率,space:0,100Khz;1,200Khz;2,50Khz;3,25KHz
void RDA5820_Space_Set(u8 spc)
{
u16 temp;
temp=RDA5820_RD_Reg(0X03); //读取0X03的内容
temp&=0XFFFC;
temp|=spc;
RDA5820_WR_Reg(0X03,temp) ; //设置BAND
}
//设置RDA5820的频率,freq:频率值(单位为10Khz),比如10805,表示108.05Mhz
void RDA5820_Freq_Set(u16 freq)
{
u16 temp;
u8 spc=0,band=0;
u16 fbtm,chan;
temp=RDA5820_RD_Reg(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=RDA5820_RD_Reg(0X53);//得到bottom频率
fbtm*=10;
}
if(freq chan&=0X3FF; //取低10位 temp|=chan<<6; temp|=1<<4; //TONE ENABLE RDA5820_WR_Reg(0X03,temp) ; //设置频率 delay_ms(20); //等待20ms while((RDA5820_RD_Reg(0X0B)&(1<<7))==0);//等待FM_READY } u16 RDA5820_Freq_Get(void) { u16 temp; u8 spc=0,band=0; u16 fbtm,chan; temp=RDA5820_RD_Reg(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=RDA5820_RD_Reg(0X53);//得到bottom频率 fbtm*=10; } temp=fbtm+chan*spc; return temp;//返回频率值 } 主函数就只需初始化,然后设置RX或TX模式,在设置对应的频率等,应该就可以了。我当时的主程序用了2个rda5820N,所以就不放出来了,而且那个主函数太多冗余的东西了。
上一篇:stm32F407--AD7606模块串行使用
下一篇:STM32学习之CAN控制器简介
推荐阅读最新更新时间:2024-11-18 10:09
设计资源 培训 开发板 精华推荐
- LTC1433 负升压转换器的典型应用电路
- 使用 MaxLinear, Inc 的 SP6680EU 的参考设计
- VM800B50A-PL,基于支持3.3/5V MCU转接板的FT800基本开发模块,5.0英寸TFT LCD显示屏和珍珠边框外壳
- MIC2920A-5.0WT 400mA低压降稳压器典型应用
- 具有真正输出断开或输入/输出旁路选项的 MCP1640B 同步升压稳压器的典型应用
- Campbell (MAXREFDES4#): 16位、高精度4-20mA输入隔离模拟前端(AFE)
- 用于计算机/外围设备的 5V DC 至 DC 单路输出电源
- 使用两个 LTC3415 的双相单输出 3.3V 至 1.8V 15A 应用
- 06_降压恒流驱动LED_C336597
- 焊接照明灯
- 用“芯”做好表|英飞凌智能手表解决方案
- TE Connectivity利用传感和连接解决方案,赋能电动汽车发展 参与有好礼!
- 造个车,一起驶向诗和远方!学习 TI 汽车参考设计,参加技能小测试赢好礼!
- 『ADI实验室电路DIY大赛』正式启动!
- 激情竞赛日--看谁最给力!
- 直播【英飞凌应用于变频家电和中小功率工业变频控制领域的产品:iMOTION™】
- “慧眼”识PCIe——阅读《PCIe要了解的十件事》和泰克OPEN-DAY的培训资料 抽奖、分享赢好礼!
- TI 电机驱动应用闯关答题赛
- 免费测评|ESP32-S2-Kaluga-1新型多媒体开发板,灵活拆装,满足多种需求
- EEWORLD下载中心热力上线!