【模块系列】STM32&RDA5807M模块

前言

  好久前做的RDA5807M模块验证板了,最近也是翻出来写下代码,听个响了。还是老样子,基于STM32的HAL库,为了方便,就直接使用硬件I2C,进行调试。

材料

模块:自制的RDA5807M验证板

开发板:自制STM32RET6开发板

案例的代码环境:Keil5+STM32CubeMX生成的HAL库,硬件I2C

其它事项:RDA5807M模板上是带I2C的上拉电阻的,所以外部不用在添加了。

模块

下述参考RDA5807M模块的规格书列出概述资料:

“RRD-102V2.0”立体声收音模块( FM Stereo radio Module) 高灵敏度、低功耗、超小体积的调频立体声收音模组。采用RRDA5807M(或RDA5802NM),此电路外围元件少、噪声系数极小。具有体积小、低功耗、低成本、应用简单、使用范围广等优点。是一款简单易用且具极高性价比的单芯片FM立体声收音模组。

  • 采用通用的102BC模块的封装,用户可直接替换使用,无需更改电路设计。

  • 灵敏度高、噪声小、抗干扰能力强、外接元件极少、体积小(11*11.2MM Max)、使用极其简单。

  • 76-108MHz全球FM频段兼容(包括日本76-91MHz和欧美87.5-108.5MHz)。

  • I2C串行数据总线接口通讯,支持外部基准时钟输入方式。

  • 完全整合的COMS工艺单晶片集成电路,功耗极小。

  • 内置高精度A/D(模数转换器)及数字频率合成器。

  • 内置LDO调整、低功耗、超宽电压使用范围(2.7-3.6VDC)。

  • 内置噪声消除、软静音、低音增强电路设计。

  • 高功率32Ω负载音频输出,直接耳机驳接,无需外接音频驱动放大。

  • 应用简便、成本低,性价比高。

  • 手册

    RDA5807M手册,下述仅对寄存器进行展示翻译。还有就是寄存器都是16位的,读取的时候是高8位在前,低8位在后。

    寄存器 名称 功能 默认值
    00H 15:8 CHIPID[7:0] 芯片ID 0x58
    02H 15 DHIZ 音频输出高阻态禁用。
    0 = 高阻抗;1 = 正常工作
    0
    14 DMUTE 静音禁用。
    0 = 静音;1 = 正常运行
    0
    13 MONO 单声道选择。
    0 = 立体声;1 = 强制单声道
    0
    12 BASS 低音增强。
    0 = 禁用;1 = 低音增强使能
    0
    11 RCLK NON-CALIBRATE MODE 0 = 始终提供RCLK时钟
    1 = 工作时RCLK时钟不总是供电(1时,RDA5807M不能直接支持-20 ℃ ~70 ℃温度。仅支持从调谐点开始20℃的温度摆动)
    0
    10 RCLK DIRECT INPUT MODE 1= RCLK时钟使用直接输入模式 0
    9 SEEKUP 向上搜索。
    0 = 向下查找;1 = 向上查找
    0
    8 SEEK 搜索
    0 = 禁用停止搜索;1 = 使能搜索从SEEKUP指定的方向开始,在找到一个通道或搜索完整个频带时结束。当搜索操作完成时,SEEK位设为低电平,STC位设为高电平。
    0
    7 SKMODE 搜索模式
    0 = 在上限或下限处换行并继续搜索
    1 =在上限或下限处停止搜索
    0
    6:4 CLK_MODE[2:0] 000=32.768kHz
    001=12Mhz
    101=24Mhz
    010=13Mhz
    110=26Mhz
    011=19.2Mhz
    111=38.4Mhz
    000
    3 RDS_EN RDS/RBDS启用
    如果为1,rds/rbds启用
    0
    2 NEW_METHOD 新的解调方法使能,可以提高大约1dB的接收灵敏度。 0
    1 SOFT_RESET 软复位。
    如果为0,不复位;如果为1,则复位。
    0
    0 ENABLE 上电使能。
    0 = 禁用;1 = 使能
    0
    03H 15:6 CHAN[9:0] 频道选择。
    BAND = 0
    频率 = 信道间距(kHz) x CHAN+ 87.0 MHz
    BAND = 1or 2
    频率 = 信道间距(kHz) x CHAN + 76.0 MHz
    BAND = 3
    频率 = 信道间距(kHz) x CHAN + 65.0 MHz
    CHAN在寻道操作后更新。
    0x00
    5 DIRECT MODE 直接控制模式,仅在测试时使用。 0
    4 TUNE Tune
    0 = Disable
    1 = Enable
    当Tune位设为高电平时,调谐操作开始。当调谐操作完成时,STC位设为高电平。
    当调谐操作完成时,调谐位自动复位为低电平
    0
    3:2 BAND[1:0] 波段选择。
    00 = 87–108 MHz(美国/欧洲)
    01 = 76–91 MHz(日本)
    10 = 76–108 MHz(全球)
    11 = 65–76 MHz(东欧) 或 50-65MHz
    00
    1:0 SPACE[1:0] 通道间距。
    00 = 100 kHz
    01 = 200 kHz
    10 = 50kHz
    11 = 25KHz
    00
    04H 15 RSVD 保留 0
    13:12 RSVD 保留 00
    11 DE 去加重。
    0 = 75 µs; 1 = 50 µs
    0
    10 RSVD 保留
    9 SOFTMUTE_EN 如果为1,则启用软静音 1
    8 AFCD AFC禁用。
    如果为0,afc工作;如果为1,afc禁用。
    0
    05H 15 INT _MODE 如果为0,产生5ms中断;如果为1,则中断持续到读取 Reg0CH 动作发生。 1
    14:12 RSVD 保留 000
    11:8 SEEKTH[3:0] 寻找信噪比阈值 1000
    5:4 RSVD 保留 00
    3:0 VOLUME[3:0] DAC增益控制位(音量)。
    0000 = 最小值;1111 =最大值
    音量刻度为对数0000时,输出静音且输出阻抗很大
    1111
    06H 15 RSVD 保留 0
    14:13 OPEN_MODE[1:0] 开放保留寄存器模式。
    11 = 在寄存器写入功能后打开其他:仅在寄存器读取功能后打开
    00
    07H 15 RSVD 保留 0
    14:10 TH_SOFRBLEND[5:0] 噪声软混合设置的阈值,单位2dB 10000
    9 65M_50M MODE 当band[1:0] = 2’b11 (0x03H_bit<3:2 >)时有效
    1 = 65~76 MHz; 0 = 50~76 MHz
    1
    8 RSVD 保留 0
    7:2 SEEK_TH_OLD 旧寻道模式的寻道阈值,当Seek_Mode=001时有效 000000
    1 SOFTBLEND_EN 如果为1,则启用软混合 1
    0 FREQ_MODE 如果为1,则频率设置已更改。
    Freq = 76000(或87000) kHz + freq_direct (08H) kHz。
    0
    0AH 15 RDSR RDS就绪
    0 = 没有RDS/RBDS组就绪(默认)
    1 = 新的RDS/RBDS组就绪
    0
    14 STC 搜索/调谐完成。
    0 = 未完成
    1 = 完成当搜索或调节操作完成时,搜索/调节完成标志被置位。
    0
    13 SF 搜索失败。
    0 = 搜索成功;1 = 搜索失败当搜索操作未能找到RSSI电平大于SEEKTH[5:0]的通道时,搜索失败标志置1。
    0
    12 RDSS RDS同步
    0 = RDS解码器不同步(默认)
    1 = RDS解码器同步仅在RDS详细模式下可用
    0
    11 BLK_E RDS启用时:
    1 = 已找到块
    0 = 未找到块E
    0
    10 ST 立体声指示器。
    0 = 单声道;1 = 立体声
    1
    9:0 READCHAN[9:0] 读取频道。
    BAND = 0
    频率 = 通道间距(kHz)x read chan[9:0]+87.0 MHz
    BAND = 1或2
    频率 = 通道间距(kHz)x read chan[9:0]+76.0 MHz
    BAND = 3
    频率 =通道间距(kHz)x read chan[9:0]+65.0 MHz read chan[9:0]在调谐或寻道操作后更新。
    8’h00
    0BH 15:9 RSSI[6:0] RSSI。
    000000 = 最小值
    111111 = 最大值
    RSSI标度为对数。
    0
    8 FM TRUE 1 = 当前频道是电台
    0 = 当前频道不是电台
    0
    7 FM_READY 1 = 就绪
    0 = 未就绪
    0
    6:5 reserved 0
    4 ABCD_E 1= 寄存器0cH,0dH,0eH,0fH的块id是E
    0 = 寄存器0cH,0dH,0eH,0fH的块id是A,B,C,D
    3:2 BLERA[1:0] RDS_DATA_0的块错误级别,并且始终被读取为RDS块A(在RDS模式下)或块E(在RBDS模式下,当ABCD_E标志为1时)的错误级别
    00 = 0 需要纠正的错误
    01= 1~2 需要纠正的错误
    10 = 3~5 需要纠正的错误
    11 = 6+检查字中的错误,无法纠正。
    仅在RDS详细模式下可用
    1:0 BLERB[1:0] RDS_DATA_1的块错误级别,始终读取为RDS块B(在RDS模式下)或E(在RBDS模式下,当ABCD_E标志为1时)的错误级别。
    00 = 0个需要纠正的错误
    01 = 1~2个需要纠正的错误
    10 = 3~5个需要纠正的错误
    11 = 6+错误或校验字错误,无法纠正。
    仅在RDS详细模式下可用
    0CH 15:0 RDSA[15:0] 块A(在RDS模式下)或块E(当ABCD_E标志为1时,在RBDS模式下) 16’h5803
    0DH 15:0 RDSB[15:0] 块B(在RDS模式下)或块E(当ABCD_E标志为1时,在RBDS模式下) 16’h5804
    0EH 15:0 RDSC[15:0] 块C(在RDS模式下)或块E(当ABCD_E标志为1时,在RBDS模式下) 16’h5808
    0FH 15:0 RDSD[15:0] 块D(在RDS模式下)或块E(当ABCD_E标志为1时,在RBDS模式下) 16’h5804

    代码

      代码部分也是,只展示RDA5807M驱动库部分,其它的更详细的可以参考给出的工程文件。

    RDA5807M.H

    #ifndef __RDA5807M_H__
    #define __RDA5807M_H__
    
    #define RDA5807M_7BitAddress 0x10					// 7位I2C地址
    #define RDA5807M_8BitAddress_Read 	0x21	// 8位I2C读地址(RDA5807M_7BitAddress << 1 & 0x01)
    #define RDA5807M_8BitAddress_Write 	0x20	// 8位I2C写地址(RDA5807M_7BitAddress << 1)
    
    #define RDA5807M_8BitAddress_ReadReg 		0x23	// 8位I2C读地址带寄存器
    #define RDA5807M_8BitAddress_WriteReg 	0x22	// 8位I2C写地址带寄存器
    
    // 除了第1个寄存器功能唯1外,其它寄存器功能都多样,几乎1个位1个功能
    // 主功能寄存器
    #define RDA5807M_Register_ChipID	0x00					// 芯片ID
    #define RDA5807M_Register_Multifunction2	0x02	// 多功能寄存器2
    #define RDA5807M_Register_Multifunction3	0x03	// 多功能寄存器3
    #define RDA5807M_Register_Multifunction4	0x04	// 多功能寄存器4
    #define RDA5807M_Register_Multifunction5	0x05	// 多功能寄存器5
    #define RDA5807M_Register_Multifunction6	0x06	// 多功能寄存器6
    #define RDA5807M_Register_Multifunction7	0x07	// 多功能寄存器7
    #define RDA5807M_Register_Multifunction8	0x08	// 多功能寄存器8
    #define RDA5807M_Register_MultifunctionA	0x0A	// 多功能寄存器A
    #define RDA5807M_Register_MultifunctionB	0x0B	// 多功能寄存器B
    // 其余寄存器
    #define RDA5807M_Register_MultifunctionC	0x0C	// 多功能寄存器C
    #define RDA5807M_Register_MultifunctionD	0x0D	// 多功能寄存器D
    #define RDA5807M_Register_MultifunctionE	0x0E	// 多功能寄存器E
    #define RDA5807M_Register_MultifunctionF	0x0F	// 多功能寄存器F
    
    
    /***** 基础读写操作 *****/
    uint16_t RDA5807M_Read_Reg(uint8_t Address);		// 读寄存器	
    
    /***** 功能接口 *****/
    uint16_t RDA5807M_ChanToFreq(uint16_t chan);	// 将信道值转为频率
    uint16_t RDA5807M_FreqToChan(uint16_t freq);	// 将频率转为信道值
    
    /***** 寄存器功能 *****/
    // 0x00寄存器
    uint16_t RDA5807M_GetChipID(void);				// 获取RDA5807M地址
    // 0x02寄存器
    void RDA5807M_OpenSearch(void);						// 开启搜索(向上搜索、开启搜索、到达最高频率截止)
    // 0x03寄存器
    uint8_t RDA5807M_GetBand(void);					// 获取RDA5807M波段
    uint8_t RDA5807M_GetFreqSpace(void);			// 获取RDA5807M频率间隔
    void RDA5807M_DisableTune(void);					// 禁用调谐
    // 0x05寄存器
    void RDA5807M_SetVolume(uint8_t val);		// 设置音量级别
    uint8_t RDA5807M_GetVolume(void);				// 获取音量级别
    // 0x0A寄存器
    uint16_t RDA5807M_GetFreq(void);					// 获取RDA5807M当前频率
    void RDA5807P_SetFreq(uint16_t setFreq);	// 设置频率值
    // 0x0B寄存器
    uint8_t RDA5807M_IsRadio(void);					// 判断是否为电台
    uint8_t RDA5807M_GetRSSI(void);					// 获取电台信号强度
    
    /***** 功能整合 *****/
    void RDA5807M_Init(void);									// RDA5807M初始化
    void RDA5807M_Search_Freq_TurnUp(void);		// 搜索下一个电台 
    void RDA5807M_AddOneLevelVolume(void);		// 加一级音量
    void RDA5807M_ReduceOneLevelVolume(void);	// 减一级音量
    void RDA5807M_SetMute(uint8_t bit);			// 设置禁音模式
    void RDA5807P_PowerControl(uint8_t bit);	// 电源控制
    
    
    #endif
    
    

    RDA5807M.C

    #include "main.h"
    #include "i2c.h"
    #include "RDA5807M.h"
    
    
    /***********************/
    /***** 基础读写操作 *****/
    
    // 读寄存器
    uint16_t RDA5807M_Read_Reg(uint8_t Address)
    {
    	uint8_t reData[2] = {0};	// 接收数据
    	HAL_I2C_Mem_Read(&hi2c1, RDA5807M_8BitAddress_ReadReg, Address, 1, reData, 2, 1000);
    	return (reData[0] << 8) | reData[1];
    }
    
    // 写寄存器(记得每次修改时,先读取与上在写修改)
    void RDA5807M_Write_Reg(uint8_t Address, uint16_t Data)
    {
    	uint8_t CMD[2] = {0};					// 命令数据
    	CMD[0] = (Data & 0xff00) >> 8; 	// 高位
    	CMD[1] = Data & 0x00ff;        	// 低位
    	HAL_I2C_Mem_Write(&hi2c1, RDA5807M_8BitAddress_WriteReg, Address, 1, CMD, 2, 1000);
    }
    
    /**********************/
    /****** 功能接口 *******/
    
    // 将信道值转为频率
    // 频率(以MHz为单位*100)(如108MHz=>10800)
    uint16_t RDA5807M_ChanToFreq(uint16_t chan)
    {
    	uint16_t freqStart = 0;	// 频率起始
    	uint16_t freqEnd = 0;		// 频率结束
    	float freqSpace = 0;			// 频率间隔
    	uint16_t readReg = 0;		// 获取寄存器值
    	
    	readReg = (RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3) & 0x000C) >> 2;	
    	// 波段功能值位转实际起始频率
    	switch(readReg)
    	{
    		case 0x00:
    			freqStart = 8700;	// 87MHz = 87.00MHz
    			freqEnd = 10800;
    			break;
    		case 0x01:
    			freqStart = 7600;
    			freqEnd = 9100;
    			break;
    		case 0x02:
    			freqStart = 7600;
    			freqEnd = 10800;
    			break;
    		case 0x03:
    			if((RDA5807M_Read_Reg(RDA5807M_Register_Multifunction7) >> 9) & 0x01)
    			{
    				freqStart = 6500;
    				freqEnd = 7600;
    			}
    			else
    			{
    				freqStart = 5000;
    				freqEnd = 7600;
    			}
    			break;
    	}
    	
    	readReg = (RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3) & 0x0003);
    	switch(readReg)
    	{
    		case 0x00:
    			freqSpace = 10;	// 100K = 0.1M
    		break;
    		case 0x01:
    			freqSpace = 20;
    		break;
    		case 0x02:
    			freqSpace = 5;
    		break;
    		case 0x03:
    			freqSpace = 2.5;
    		break;
    	}
    	
    	readReg = freqStart + chan * freqSpace;
    	// 范围约束
    	readReg = readReg >= freqEnd ? freqEnd : 0;
    	readReg = readReg <= freqStart ? freqStart : 0;
    	
    	return readReg;
    }
    
    // 将频率转为信道值
    uint16_t RDA5807M_FreqToChan(uint16_t freq)
    {
    	uint16_t freqStart = 0;	// 频率起始
    	uint16_t freqEnd = 0;		// 频率结束
    	float freqSpace = 0;			// 频率间隔
    	uint16_t readReg = 0;		// 获取寄存器值
    	
    	readReg = (RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3) & 0x000C) >> 2;	
    	
    	// 波段功能值位转实际起始频率
    	switch(readReg)
    	{
    		case 0x00:
    			freqStart = 8700;	// 87MHz = 87.00MHz
    			freqEnd = 10800;
    			break;
    		case 0x01:
    			freqStart = 7600;
    			freqEnd = 9100;
    			break;
    		case 0x02:
    			freqStart = 7600;
    			freqEnd = 10800;
    			break;
    		case 0x03:
    			if((RDA5807M_Read_Reg(RDA5807M_Register_Multifunction7) >> 9) & 0x01)
    			{
    				freqStart = 6500;
    				freqEnd = 7600;
    			}
    			else
    			{
    				freqStart = 5000;
    				freqEnd = 7600;
    			}
    			break;
    	}
    	
    	readReg = (RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3) & 0x0003);
    	switch(readReg)
    	{
    		case 0x00:
    			freqSpace = 10;	// 100K = 0.1M
    		break;
    		case 0x01:
    			freqSpace = 20;
    		break;
    		case 0x02:
    			freqSpace = 5;
    		break;
    		case 0x03:
    			freqSpace = 2.5;
    		break;
    	}
    	
    	// 范围约束
    	if (freq < freqStart)
    			return 0;
    	if (freq > freqEnd)
    			return 0;
    	
    	return ((freq - freqStart) / freqSpace);
    }
    
    /**********************/
    /***** 0x00寄存器 *****/
    
    // 获取RDA5807M地址
    uint16_t RDA5807M_GetChipID()
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_ChipID);
    	return readReg;
    }
    
    /**********************/
    /***** 0x02寄存器 *****/
    
    // 开启搜索(向上搜索、开启搜索、到达最高频率截止)
    void RDA5807M_OpenSearch(void)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction2);
    	readReg |= 1 << 9;	// 向上搜索
    	readReg |= 1 << 8;	// 开启搜索
    	readReg |= 1 << 7;	// 到达最高频率截止
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction2,readReg);
    }
    
    // 设置静音模式
    // 0:静音  1:正常
    void RDA5807M_SetMute(uint8_t bit)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction2);
    	// 开启静音模式
    	if(bit)
    	{
    		readReg |= (0x0001 << 14);
    	}
    	else
    	{
    		readReg &= (~(0x0001 << 14));
    	}
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction2, readReg);
    }
    
    // 电源控制
    // 0:禁用  1:使能
    void RDA5807P_PowerControl(uint8_t bit)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction2);
    	// 上电使能
    	if(bit)
    	{
    		readReg |= 0x0001;
    	}
    	else
    	{
    		readReg &= (~0x0001);
    	}
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction2, readReg);
    }
    
    /**********************/
    /***** 0x03寄存器 *****/
    
    // 获取RDA5807M波段
    uint8_t RDA5807M_GetBand(void)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3);
    	return (readReg >> 2) & 0x03;
    }
    
    // 获取RDA5807M频率间隔
    uint8_t RDA5807M_GetFreqSpace(void)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3);
    	return readReg & 0x03;
    }
    
    // 禁用调谐
    void RDA5807M_DisableTune(void)
    {
    	uint16_t readReg = RDA5807M_Read_Reg(RDA5807M_Register_Multifunction3);
    	readReg &= ~(1 << 4);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction3,readReg);
    }
    
    /**********************/
    /***** 0x05寄存器 *****/
    
    // 设置音量
    // 音量等级(0~15)
    void RDA5807M_SetVolume(uint8_t val)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(0x05);
    	readReg &= 0xFFF0;
    	readReg |= (val & 0x0F);
    	RDA5807M_Write_Reg(0x05, readReg);
    }
    
    // 获取当前音量
    // 音量等级(0~15)
    uint8_t RDA5807M_GetVolume(void)
    {
    	uint16_t readReg;
    	readReg = RDA5807M_Read_Reg(0x05);
    	return readReg & 0x000F;
    }	
    
    /**********************/
    /***** 0x0A寄存器 *****/
    
    // 获取RDA5807M当前频率
    uint16_t RDA5807M_GetFreq()
    {
    	uint16_t chan = 0;
    	chan = RDA5807M_Read_Reg(RDA5807M_Register_MultifunctionA) & 0x03FF;
    	return RDA5807M_ChanToFreq(chan);
    }
    
    // 设置频率值
    // 例如:设置频率107.3MHz,curFreq = 10730
    void RDA5807P_SetFreq(uint16_t setFreq)
    {
    	uint8_t bandBit = 0;				// 波段功能值位
    	uint8_t freqBit = 0;				// 频率间隔功能值位
    	uint16_t bandValStart = 0;	// 波段值(MHz)-起始值
    	uint16_t bandValEnd = 0;		// 波段值(MHz)-结束值
    	float freqSpaceVal = 0;			// 频率间隔值(K)
    	uint16_t readReg = 0x0000;	// 读取16位寄存器数据
    	
    	bandBit = RDA5807M_GetBand();							// 获取波段功能值
    	freqSpaceVal = RDA5807M_GetFreqSpace();		// 获取频率间隔功能值
    	
    	// 波段功能值位转实际起始频率
    	switch(bandBit)
    	{
    		case 0x00:
    			bandValStart = 8700;	// 87MHz = 87.00MHz
    			bandValEnd = 10800;
    			break;
    		case 0x01:
    			bandValStart = 7600;
    			bandValEnd = 9100;
    			break;
    		case 0x02:
    			bandValStart = 7600;
    			bandValEnd = 10800;
    			break;
    		case 0x03:
    			bandValStart = 6500;
    			bandValEnd = 7600;
    			break;
    	}
    	// 频率间隔功能值位转实际起始频率
    	switch(freqBit)
    	{
    		case 0x00:
    			freqSpaceVal = 10;	// 100K = 0.1M
    		break;
    		case 0x01:
    			freqSpaceVal = 20;
    		break;
    		case 0x02:
    			freqSpaceVal = 5;
    		break;
    		case 0x03:
    			freqSpaceVal = 2.5;
    		break;
    	}
    	
    	// 范围约束
    	setFreq = setFreq >= bandValEnd ? bandValEnd : setFreq;
    	setFreq = setFreq <= bandValStart ? bandValStart : setFreq;
    	
    	// 转化为信道值    信道值 = ( 频率值 - 频率段的起始值 ) / 频率间隔
    	setFreq = ( setFreq - bandValStart ) / freqSpaceVal;
    	
    	// 写入信道值
    	readReg = RDA5807M_Read_Reg(RDA5807M_Register_MultifunctionA);
    	readReg &= 0xFC00;	// 清空低10位
    	setFreq |= readReg;	// 放入频率数据
    	RDA5807M_Write_Reg(RDA5807M_Register_MultifunctionA, setFreq);
    }
    
    /**********************/
    /***** 0x0B寄存器 *****/
    
    // 判断是否为电台
    // 返回: 0,不是电台  1,是电台
    uint8_t RDA5807M_IsRadio(void)
    {
    	return (RDA5807M_Read_Reg(RDA5807M_Register_MultifunctionB) >> 8) & 0x0001;
    }
    
    // 获取电台信号强度
    uint8_t RDA5807M_GetRSSI(void)
    {
    	return (RDA5807M_Read_Reg(RDA5807M_Register_MultifunctionB) >> 9) & 0x007F;
    }
    
    /**********************/
    /****** 综合功能 *******/
    
    // RDA5807M初始化
    void RDA5807M_Init()
    {
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction2, 0x0002);
    	HAL_Delay(50);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction2, 0xc001);
    	HAL_Delay(600);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction3, 0x0018);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction4, 0x0400);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction5, 0x86ad);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction6, 0x8000);
    	RDA5807M_Write_Reg(RDA5807M_Register_Multifunction7, 0x5F1A);
    }
    
    // 搜索下一个电台 
    void RDA5807M_Search_Freq_TurnUp(void)
    {
    	RDA5807M_DisableTune();	// 禁用调谐
    	RDA5807M_OpenSearch();	// 开启搜索(向上搜索、开启搜索、到达最高频率截止)
    	while((RDA5807M_Read_Reg(RDA5807M_Register_MultifunctionA) & 0x4000) == 0)		// 等待搜索完成
    	{
    		HAL_Delay(1);	// 等待间隔
    	}
    	RDA5807P_SetFreq(RDA5807M_GetFreq());	// 将搜索到频率设置为播放频率
    }
    
    // 加一级音量
    void RDA5807M_AddOneLevelVolume(void)
    {
    	uint16_t readReg = 0;	// 读取16位寄存器数据
    	readReg = RDA5807M_GetVolume() + 1;
    	readReg = readReg >= 0x000F ? 0x000F : readReg;
    	RDA5807M_SetVolume(readReg);
    }
    
    // 减一级音量
    void RDA5807M_ReduceOneLevelVolume(void)
    {
    	uint16_t readReg = 0;	// 读取16位寄存器数据
    	readReg = RDA5807M_GetVolume();
    	readReg = readReg <= 0x0000 ? 0x0000 : readReg - 1;
    	RDA5807M_SetVolume(readReg);
    }
    
    

    main.c核心部分

    采用了PA5、PA6、PA7做按钮,来做交互触发。硬件I2C的引脚SDA-PB7,SCL-PB6。

    int main(void)
    {
    	uint8_t keyVal = 0;
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_I2C1_Init();
      	MX_USART1_UART_Init();
        RDA5807M_Init();
        printf("RDA5807M_Init()\r\n");
        HAL_Delay(50);
        printf("RDA5807M_ID:%x\r\n",RDA5807M_GetChipID());
        HAL_Delay(50);
    	
      while (1)
      {
    		keyVal = Key_getValue();
    		if( keyVal == 1) 
    		{
    			// 电台切换
    			RDA5807M_Search_Freq_TurnUp();
    			// 信息打印
    			printf("RDA5807M_Band_Space:%x,%x\r\n",RDA5807M_GetBand(),RDA5807M_GetFreqSpace());
    			printf("RDA5807M_NewFreq_IsRadio_RSSI:%d,%d,%d\r\n",RDA5807M_GetFreq(),RDA5807M_IsRadio(),RDA5807M_GetRSSI());
    			printf("\r\n");
    		} 
    		else if(keyVal == 2)
    		{
    			// 降低1级音量
    			// RDA5807M_ReduceOneLevelVolume();
    			// printf("RDA5807M_LevelVolume:%x\r\n",RDA5807M_GetVolume());
    			// printf("\r\n");
    			// 静音模式测试
    			RDA5807M_SetMute(0);
    			printf("key2()\r\n");
    		}
    		else if(keyVal == 3)
    		{
    			// 增加1级音量
    			// RDA5807M_AddOneLevelVolume();
    			// printf("RDA5807M_LevelVolume:%x\r\n",RDA5807M_GetVolume());
    			// 静音模式测试
    			RDA5807M_SetMute(1);
    			printf("key3()\r\n");
    		}
    		HAL_Delay(10);
      }
    }
    

    图片

      下述展示RDA5807M模块图片、测试图片以及测试板的原理图。验证板测试时是要插入耳机的,才能当天线接收。还有原理图也是参考手册画的。

    工程

    RDA5807M手册*1 + RDA5807M的Keil5工程文件 *1 + RDA5807M模块手册*1
    链接: https://pan.baidu.com/s/1LsGYYjEPzqWmopgdr0LnPw  提取码: femf

    作者:紫阡星影

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【模块系列】STM32&RDA5807M模块

    发表回复