RDA5807 FM收音机模块
一. 简介
这是一个购自于淘宝网店的RDA5807调频接收模块,价格只有3块钱人民币。’
RDA5807是一颗调频广播单芯片接收调谐芯片。只需要外部非常少的元器件,便可以组成一个完整的调频广播接收机。这款芯片工作电压范围2.7~3.3V。
这个模块最早是在2018年3月份购买,一直没有能够进行实验。最早是为了能够用于智能车竞赛现场无线信标检测使用的模块。
RDA5807收音芯片:
在百度文库中的说明连接PDF地址:
https://wenku.baidu.com/view/8913ec07a31614791711cc7931b765ce05087a12.html
RDA5807 参考设计电路图如下。这是在RDA5807数据手册中给出的参考设计原理图。
二. 制作转接模块
为了便于制作测试转接口,能够在面包板上进行实验。测试该模块的基本尺寸参数。
如下是制作接口转接板,这样可以通过间距100mil(2.54mm)的排针放置在面包实验板上,方便使用单片机接口模块完成接口控制。
针对芯片模块,转接板从左到右的定义分别是:
管脚 | 符号 | 定义 |
---|---|---|
1 | VDD | 3.3V |
2 | NULL | |
3 | NULL | |
4 | SCLK | I2C SCLK |
5 | SDIO | I2C SDIO |
6 | GND | GND |
7 | LOUT | 左声道音频输出 |
8 | ROUT | 右声道音频输出 |
9 | NULL | |
10 | FMIN | FMRF输入 |
上述表格定义也是购置的RDA5807模块小板外部引脚的定义。
3.3V稳压芯片电路模块……
三、建立实验平台
1.搭建系统
在面包板上,分别加上3.3V电源模块;RDA5807模块,STM32F030单片机模块。将它们按照功能连接起来。
- 通过3.3V模块将面板板上的5V电源转换成3.3V,提供给3RDA5807;
- F030模块本身带有AS11173.3V模块,可以直接连接面包板上的5V电源;
- 将F030的I2C总线的SCL, SDA 分别连接到RDA5807MdeSCLK,SDIO;
2. 实验软件
1. STM32F030实验电路板硬件
AltiumDesign\Test\2020\GenretCntF103\SPIF030K8
2. STM32F030软件
软件所在的目录:
D:\zhuoqing\window\ARM\IAR\STM32\Application\Test\2020\GeneralFSPIF030
该软件是一个通用软件测试平台。其中包括有多个项目所遗留下来的代码片段。
3. RDA5807 I2C总线
总线协议:
RDA5807 I2C总线地址: 001000b + R/W bit。
在RDA5807读写过程中,只需要使用I2C起始位,然后跟着读和写,然后在通过结束位停止即可。不需要输入读和写的寄存器的地址。因为在RDA5807芯片在读写过程中有着固定的起始地址:
写寄存器起始地址:开始于0x2
读寄存器起始地址:开始于0xA.
RDA5807 各个寄存器定义
下面是网络CircuitDigest上别人给出的使用Arduino搭建的基于RDA5807的调频收音机。
使用Arduino搭建的FM收音机实验模型
4. 软件编程
由于在网络上给出的RDA5807 的数据手册实在太多的信息,但并没有给出具体的读写过程。下面的参考代码是从CircuitDigest网站中看到的相关的参考代码:
(1) RDA5807寄存器初始化参数
uint8_t boot_config[] = {
/* register 0x02 */
0b11000001,
0b00000011,
/* register 0x03 */
0b00000000,
0b00000000,
/* register 0x04 */
0b00001010,
0b00000000,
/* register 0x05 */
0b10001000,
0b00001111,
/* register 0x06 */
0b00000000,
0b00000000,
/* register 0x07 */
0b01000010,
0b00000010,
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
(2) 设置接收频道
通过修改寄存器前四个数值便可以修改接收的频道。
通过下面代码来修改接收频道。接收频道使用一个uint16来表示。
uint8_t tune_config[] = {
/* register 0x02 */
0b11000000,
0b00000001,
/* register 0x03 */
(channel >> 2),
((channel & 0b11) << 6 ) | 0b00010000
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(3) 芯片上电后的初始化过程
参见下面的Arduino代码。
void setup()
{
Serial.begin(9600);
pinMode(A0,INPUT);
/* Conect to RDA5807M FM Tuner: */
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(boot_config, BOOT_CONFIG_LEN);
Wire.endTransmission();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
相应的接收频道修改Arduino参考代码如下:
void myChangeChannel(int channel){ /* void if nothing is returned else int */
tune_config[2] = (channel >> 2);
tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(4) STM32F030 工作代码
下面的代码经过测试,可以工作。
直接调用RDA5807SetChannel(float freq)设置相应的FM频率。
下面是通过示波器看到的RDA5807接收到的北京地区97.4Mhz背景音乐台的音乐信号。
RDA5807.H
/*
**==============================================================================
** RDA5807.H: -- by Dr. ZhuoQing, 2020-01-30
**
** Description:
**
**==============================================================================
*/
#ifndef __RDA5807__
#define __RDA5807__
//------------------------------------------------------------------------------
#ifdef RDA5807_GLOBALS
#define RDA5807_EXT
#else
#define RDA5807_EXT extern
#endif // RDA5807_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
void RDA5807Init(void);
//------------------------------------------------------------------------------
RDA5807_EXT uint16_t g_nRDA5807Channel;
//------------------------------------------------------------------------------
void RDA5807Setup(void);
void RDA5807I2CWrite(uint8_t * pucData, int nLength);
void RDA5807SetChannel(float freq);
//==============================================================================
// END OF THE FILE : RDA5807.H
//------------------------------------------------------------------------------
#endif // __RDA5807__
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
RDA5807.C:C 文件。
/*
**==============================================================================
** RDA5807.C: -- by Dr. ZhuoQing, 2020-01-30
**
**==============================================================================
*/
//------------------------------------------------------------------------------
#include "stm32f0xx_hal.h"
#include "stm32f0xxa.h"
#define RDA5807_GLOBALS 1 // Define the global variables
#include "RDA5807.H"
//------------------------------------------------------------------------------
#define RDA5807_BOOT_LENGTH 12
uint8_t RDA5807_boot_config[] = {
0xc1, 0x03, // Register 0x2
0x00, 0x00, // Register 0x3
0x0a, 0x00, // Register 0x4
0x88, 0x0f, // Register 0x5
0x00, 0x00, // Register 0x6
0x42, 0x02, // Register 0x7
};
//------------------------------------------------------------------------------
#define RDA5807_TUNE_CONFIG_LENGTH 4
uint8_t RDA5807_tune_config[] = {
0xc0, 0x01, // Register 2
0x00, 0x00, // Reigster 3
};
void RDA5807SetTuneConfig(uint16_t channel) {
RDA5807_tune_config[2] = (uint8_t)(channel >> 2);
RDA5807_tune_config[3] = (uint8_t)(((channel & 0x3) << 6) | 0x10);
}
//------------------------------------------------------------------------------
void RDA5807Init(void) {
/* Assumin band starts at 87.0MHz(per setting below)
* and channel spaceing of 100kHz(0.1Mhz)(per settings below)
* then channel can be derive as floowins:
* channel = (<desired freq in MHz> - 87.0) / 0.1
*
* which is ave as:
* <10x desired ferq in MHz> - 870
*/
g_nRDA5807Channel = 6;
RDA5807Setup();
}
//------------------------------------------------------------------------------
extern I2C_HandleTypeDef hi2c1;
void RDA5807I2CWrite(uint8_t * pucData, int nLength) {
HAL_I2C_Master_Transmit(&hi2c1, 0x20, pucData, nLength, 10);
}
//------------------------------------------------------------------------------
void RDA5807Setup(void) {
RDA5807I2CWrite(RDA5807_boot_config, RDA5807_BOOT_LENGTH);
RDA5807SetTuneConfig(g_nRDA5807Channel);
RDA5807I2CWrite(RDA5807_tune_config, RDA5807_TUNE_CONFIG_LENGTH);
}
void RDA5807SetChannel(float freq) {
g_nRDA5807Channel = (int)((freq - 87.0) * 10.0 + 0.5);
RDA5807SetTuneConfig(g_nRDA5807Channel);
RDA5807I2CWrite(RDA5807_tune_config, RDA5807_TUNE_CONFIG_LENGTH);
}
//==============================================================================
// END OF THE FILE : RDA5807.C
//------------------------------------------------------------------------------
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/104116006
- 点赞
- 收藏
- 关注作者
评论(0)