【模块系列】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
作者:紫阡星影