stm32F407-RDA5820N模块的使用

本文详细介绍了RDA5820N FM模块在2018年电子竞赛无线话筒扩音系统中的使用,以及如何在STM32平台上进行初始化和配置。提供了RDA5820N的.c和.h文件,包括读写寄存器、切换模式、设置音量和频率等功能的实现。此外,还讨论了与TEA5767接收模块的选择考虑。
摘要由CSDN通过智能技术生成

         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不到半年,如果有错误请多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值