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<fbtm)return;
chan=(freq-fbtm)/spc; //得到CHAN应该写入的值
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,所以就不放出来了,而且那个主函数太多冗余的东西了。
本人刚学习stm32不到半年,如果有错误请多多指教。