文档标识符:RDA5807M_T-D-P16

作者:DLHC

最后修改日期:2022.1.14

最后修改内容:修改、添加内容

发布状态:已发布

本文链接:https://www.cnblogs.com/DLHC-TECH/p/RDA5807M_T-D-P16.html

前言

RDA5807M是一款基于CMOS(互补金属氧化物半导体)工艺、单芯片、低功耗的FM广播立体声调谐芯片,支持50MHz--115MHz的频率范围,音频输出最大负载为32Ω,支持标准的 I^2C 总线协议。关于RDA5807M的更多特性见图0.0,RDA5807M内部各模块框图见图0.1。基于RDA5807M的收音机模块售价在1元左右,实物见图0.2和图0.3。

以开发者的角度,RDA5807M可实现以下基本功能:

1.基本控制(电源、时钟等)

2.调谐控制(调谐到指定频率)

3.自动搜台(可设置SNR(信噪比)阈值)

4.获取RSSI(当前频率的无线电信号强度)

5.获取当前电台的频率、RDS/RBDS等信息(RDS/RBDS需要软件解码,RDA5807M只获取原始数据)

6.音频控制(音量调节、BASS(低音增强)、噪声抑制、立体声等)

从模块框图中可以看出:天线来的信号通过LNA(低噪声放大器)(具有限幅功能)放大,由6个混频器组成的网络将放大后的RF信号下变频到IF上并将其分为I(同相,Inphase,I)和Q(正交,Quadrature,Q)两个部分,这两个信号分量分别通过PGA(可编程增益放大器)放大后送至ADC(模数转换器),ADC对这两个模拟的IF信号进行采样并将其转换为数字信号,以产生相应的数字I/Q样本,上述数字信号经DSP(数字信号处理器)通过相应的算法(抽取、数字滤波、解调等)处理后,得到无线电载波上的有效数据。该有效数据包括音频流、RDS/RDBS原始数据以及其他的数据,音频流通过DAC(数模转换器)转换为模拟信号并驱动扬声器发声,RDS/RBDS原始数据与其他数据存储在芯片中,用户可以通过I^2C通信协议获取它们并进行相应的解码。同时,外部的时钟信号通过同步器后驱动VCO(压控振荡器)产生一个时钟信号提供给混频器网络和DSP,以实现下变频并提供同步信号。此外,芯片上还集成了LDO(低压差线性稳压器),用于为片上相关的模块提供电源。

总的来说,RDA5807M具有功能完善、价格便宜、功耗低、开发简单等优点,是一款不错的FM广播立体声调谐芯片(如果它内部的DSP功能再多一点,就差不多是一个SDR(软件定义无线电)了。但是,由于数据手册提供的信息有限,部分描述需要揣测作者意图,并且RDS/RBDS技术在国内普及度不高,部分部分功能暂无法测试和实现。

图0.0-RDA5807M的特性

图0.1-RDA5807M内部各模块框图

图0.2-RDA5807M收音机模块实物(正)

图0.3-RDA5807M收音机模块实物(反)

图0.4-RDA5807M芯片封装(正)

图0.5-RDA5807M芯片封装(反)

图0.6-RDA5807M(dieshot) DLHC

测试电路

测试电路主要为RDA5807M收音机模块提供电源、I^2C接口、音频接口、射频接口、以及其他的外部元件,测试电路图见图1.0。

I^2C 接口电路是单片机与RDA5807M通讯的“桥梁”,设计电路时需要注意电压最大最小值、逻辑电平兼容性、扇入扇出数、寄生电容、时钟速度以及传输线长度等基本因素(详细请参考 I^2C 标准),并且可以不用接外部上拉电阻(RDA5807M内部 I^2C 端口的OD门集成了上拉电阻与驱动反相器)。

RDA5807M的电气特性见图1.1、图1.2和图1.3。

电源电压范围:1.8v-3.3v。IO端口输入电压范围:-0.5v-+3.3v。输入逻辑高电平最小值:0.7VIO,输入逻辑低电平最大值:0.3VIO。

其中此芯片正常工作时功耗为60mW,最低为15uW,适用于对功耗控制严格的场所。

图1.0-测试电路图

图1.1-推荐操作条件

图1.2-各项最大指标

图1.3-功耗指标

图1.4-测试电路BOM

图1.5-测试电路(正)

图1.6-测试电路(反)

 I^2C 驱动层

RDA5807M支持两种 I^2C 通信模式:1.连续读写方式。2.标准 I^2C 读写方式。由于连续读写方式比较难以理解和实现,故本文只介绍标准读写方式。

标准 I^2C 读写方式:该模式与标准 I^2C 读写方式一致,即带寄存器地址的方式。RDA5807M的 I^2C 器件地址为 0010,0010B,加上读写标志位,即为 0x22(写操作)和 0x23(读操作),具体的通信格式见图2.0。

写时序:主机发送起始信号,发送从机(RDA5807M)地址加上W位,等待从机响应。从机响应成功后,发送待写入的寄存器地址,等待从机响应。从机响应成功后,发送待写入数据的高八位,等待从机响应。从机响应成功后,发送待写入的数据的低八位,此时从机会响应或不响应。最后,主机发送停止信号。

读时序:主机发送起始信号,发送从机(RDA5807M)地址加上W位,等待从机响应。从机响应成功后,发送待读取的寄存器地址,等待从机响应或不响应。主机发送起始信号,发送从机(RDA5807M)地址加上R位,等待从机响应。从机响应成功后,接收寄存器高八位,主机向从机响应,接收寄存器低八位,主机不响应。最后,主机发送停止信号。

本非官方标准库在 I^2C 底层驱动实现了:

1. I^2C 初始化。

2.向指定寄存器地址写入一个半字(16位)。

3.从指定寄存器地址读取一个半字。

有关 I^2C 的通信协议的源码在 I^2C.c 和 I^2C.h 两个文件中,基于STM32标准库开发。I^2C 的通讯速率尽量不要太高,否则会导致时序紧张(最终陷入死循环)。

图2.0-标准 I^2C 读写方式时序图

初级驱动层

初级驱动层建立在 I^2C 驱动层之上,主要是对RDA5807M内部寄存器进行位写入、位读取(精细操作),方便后面应用驱动层的开发。初级驱动层实现了以下功能(以下列举的均为函数名称 + 简要注释,源码见 RDA5807M.c 与 RDA5807M.h,更多信息请参考RDA5807M数据手册):

//其他

Direct_Mode  //直接控制模式

De_Emphasis//信号还原

Open_Mode  //保留寄存器写权限

//音频

Soft_MUTE_EN    //软件静音控制使能

Th_SoftBlend_Set//噪声抑制阈值

SoftBlend_EN      //噪声抑制控制

ST_Status            //立体/单声道标志

//控制

RCLK_Mode      //RCLK模式

RCLK_Direct_In//RCLK直接输入

//自动搜台

Seek_Dir              //自动搜台方向

Seek                     //自动搜台控制

Seek_Mode         //自动搜台模式

SeekTh_Set         //自动搜台信噪比阈值

SeekTh_Old_Set //自动搜台信噪比阈值(旧搜台模式)

STC_Status         //自动搜台/调谐完毕标志

SF_Status           //自动搜台失败标志

//RDS/RBDS

Interrupt_Mode  //中断模式

RDS_Status        //RDS/RBDS支持状态

RDSS_Status     //RDS解码器同步标志

Block_E_Status //BLOCK_E发现标志

ABCD_E_Ststus//寄存器0x0C,0x0D,0x0E,0x0F是数据块ABCD或E标志

BLERA_Status  //RDS_DATA0块错误率

BLERB_Status  //RDS_DATA1块错误率

RDSA_Status   //BLOCK_A(RDS模式)或BLOCK_E(RBDS模式)

RDSB_Status   //BLOCK_B(RDS模式)或BLOCK_E(RBDS模式)

RDSC_Status   //BLOCK_C(RDS模式)或BLOCK_E(RBDS模式)

RDSD_Status   //BLOCK_D(RDS模式)或BLOCK_E(RBDS模式)

//无线电

New_Demodulate_Method//新解调模式

TUNE                                     //调谐

FM_Ture_Status                  //当前频道是否为station

FM_Ready_Status               //FM准备状态

//频率

CHAN_Set               //调谐频率设定

Freq_Mode             //频率模式(另外一种改变频率的方式)

ReadChan_Status //当前频率

应用驱动层

应用驱动层建立在初级驱动层之上,用户可以"直接"调用本层的函数以实现对RDA5807M的控制。

本层主要实现了以下功能:

1.基本控制(电源、时钟等)

2.自动搜台(可设置SNR(信噪比)阈值)

3.获取RSSI(当前频率的无线电信号强度)

4.获取当前电台的频率

5.音频控制(音量调节、低音增强、噪声抑制、立体声等)

以下列举的均为函数名称 + 简要注释,详细源码见RDA5807M.c 与 RDA5807M.h,更多信息请参考RDA5807M数据手册:

//其他

Get_Chip_ID        //读器件ID

//音频

SoftBlend_Control //噪声抑制

Audio_Init               //音频初始化

Volume_Set           //DAC增益控制/输出音量控制

BASS                      //低音增强

Stereo_Mono_Sel//立体声/单声道选择

Audio_Out_HZ      //音频输出高阻态

MUTE                    //静音控制

//控制

CLK_Mode //输入时钟频率选择

Soft_RST   //软件复位

PWR_UP   //上电

Sys_Init     //系统初始化

//自动搜台

Seek_Control    //自动搜台

//RDS/RBDS

RDS_RBDS_Ctl //RDS/RBDS使能

RDS_Decode    //RDS解码

//无线电

BAND_Set     //频带选择

SPACE_Set   //频道跳跃间隔设置

RSSI_Status //无线电信号强度

Freq_Set       //调谐到指定频率

Tune_Status//检查调谐状态

//频率

AFC                                   //自动频率控制

F_65_76M_50_76M_Sel//65_76M/50_76M频带选择

Get_Freq                          //获取当前频率(MHz)

后续开发

由于部分内容在数据手册中的描述过于简略,以及RDS/RBDS在国内不普及,部分功能的测试无法进行。以下是后续开发的方向:

1.调谐控制(调谐到指定的频率)

2.RDS/RBDS等信息的获取与解码(RDS/RBDS需要软件解码,RDA5807M只是获取原始数据)

代码托管地址 

github: https://github.com/HaochuanDeng/RDA5807M

声明

本文未经DLHC允许,禁止转载。DLHC保留所有权利。

    由于本人学识有限,加上整理较为仓促,如有错误,恳请指正,谢谢!

RDA5807M开发指南 & 开源库函数的更多相关文章

  1. ASP.NET Aries 开源开发框架:开发指南(一)

    前言: 上周开源了Aries开发框架后,好多朋友都Download了源码,在运行过程里,有一些共性的问题会问到. 所以本篇打算写一下简单的开发指南,照顾一下不是太看的懂源码的同学,同时也会讲解一下框架 ...

  2. 基于第三方开源库的OPC服务器开发指南(3)——OPC客户端

    本篇将讲解如何编写一个OPC客户端程序测试我们在前文<基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署>一篇建立的服务器.本指南的目的是熟悉OPC服务器的开发流 ...

  3. 基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署

    前文已经说过,OPC基于微软的DCOM技术,所以开发OPC服务器我们要做的事情就是开发一个基于DCOM的EXE文件.一个代理/存根文件,然后就是写一个OPC客户端测试一下我们的服务器了.对于第一项工作 ...

  4. 开源项目SMSS开发指南(二)——基于libevent的线程池

    libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...

  5. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  6. Quartz.net官方开发指南系列篇

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  7. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  8. HelloX项目github协同开发指南

    概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...

  9. Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架

    Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...

随机推荐

  1. CF908A New Year and Counting Cards 题解

    Content 有 \(n\) 张卡牌,每张卡牌上只会有大小写字母和 \(0\sim 9\) 的阿拉伯数字.有这样一个描述:"如果卡牌正面写有元音字母(\(\texttt{A,E,I,O,U ...

  2. LuoguP7911 [CSP-J 2021] 网络连接 题解

    Content 题目过于难解释,请前往题面查看.以下直接给出本题做法. Solution 入门组 T3 在我印象中向来都不是很容易能做出来的题目,但是今年这个 T3 不得不说还是挺好做的. 我们先不妨 ...

  3. 启动jetty命令

    mvn jetty:run在某个maven web工程目录下启动此命令,将把此web工程部署到jetty应用服务器下,默认端口是8080

  4. libevent源码学习(5):TAILQ_QUEUE解析

    目录 前言 结点定义 链表初始化 链表查询及遍历 链表查询 链表遍历 插入结点 头插法 尾插法 前插法 后插法 删除结点 替换结点 总结 前言 在libevent中使用到了TAILQ数据结构,看了一下 ...

  5. 分布式:分布式事务(CAP、两阶段提交、三阶段提交)

    1 关于分布式系统 1.1 介绍 我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起.明显的弊端就是不易扩展.发布冗重.服务治理不好做. 所以我们把整个系统拆分成若 ...

  6. Sentry 开发者贡献指南 - SDK 开发(性能监控)

    内容整理于官方开发文档 系列 Docker Compose 部署与故障排除详解 K8S + Helm 一键微服务部署 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者 ...

  7. windows平台使用 pthreads库

    note 近日封装一些跨平台库时, 发现线程的创建需要做平台的区分, windows的线程创建和Linux下的线程操作不一样.很麻烦,还要做平台区分. 能否在windows上使用pthread的线程库 ...

  8. 【LeetCode】1065. Index Pairs of a String 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...

  9. 【LeetCode】645. Set Mismatch 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Hash方法 直接计算 日期 题目地址: https ...

  10. 【LeetCode】19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:链表, 删除节点,双指针,题解,leetcode, 力扣 ...