RDA5807 FM收音机模块

举报
tsinghuazhuoqing 发表于 2021/12/26 23:44:18 2021/12/26
【摘要】 一. 简介   这是一个购自于淘宝网店的RDA5807调频接收模块,价格只有3块钱人民币。’   RDA5807是一颗调频广播单芯片接收调谐芯片。只需要外部非常少的元器件,便可以组成一个完整的调...

一. 简介

  这是一个购自于淘宝网店的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单片机模块。将它们按照功能连接起来。

  1. 通过3.3V模块将面板板上的5V电源转换成3.3V,提供给3RDA5807;
  2. F030模块本身带有AS11173.3V模块,可以直接连接面包板上的5V电源;
  3. 将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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。