最新萌生想听收音机的想法,早上跑步的时候想听一下广播,就想着自己做一个,上班路上也比较近,基本都是电动车上下班,在路上也可以听一下。交通广播有很多实时信息,不一样的体验。
制作数字收音机,支持全球频段。自动搜台功能,耳机收听效果更好。
方案:主控+收音机芯片+功放芯片实现外放功能+电池+充放电管理。
于是先网上找了一遍,有没有适合我的模块,方便开发集成。
这货要77块钱,显示有库存是假的,至少要一个月的订货周期,要一个?我都不好意思给卖家说,算了吧。
某宝找了一下,有分散的模块,能凑合用;这几根线折腾了一两个小时,RDA5807绿色的模块边上的焊盘容易扯掉,用的时候要很小心。
RDA5807M是一款IIC通讯的芯片,实现的功能有自动搜台、音量加减、切台、屏保、时钟、电量显示、及低功耗管理等。
验证完之后自己做了一个小模块
RDA5807M+PAM8403+耳机+喇叭接口
参考:
https://oshwhub.com/yiplay/mu-kuai-rda5807-pam8403-1-01
下图为设计好的原型:
左侧为输入接口:
3.3V供电,GND,SCL,SDA,SHND(功放静音低电平有效)
右侧为输出接口:
左声道,右声道,和耳机接口,当耳机插入后外音自动停止,FM的天线并在耳机的MIC上面,所以插入耳机的音效质量会更好。
/**
* @brief Initialize RDA5807P
* @author
* @date
* @param void
* @return bool:if true,the operation is successful;otherwise is failed
* @retval
*/
bool RDA5807P_Intialization(void)
{
uint8 error_ind = 0;
uint8 RDA5807P_REGR[10]={0x0};
uint8 i = 0;
RDA5807P_REGW[0] = 0x00;
RDA5807P_REGW[1] = 0x02;
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807P_REGW[0], 2);
delayms(50);
error_ind = OperationRDAFM_2w(READ, (uint8 *)&RDA5807P_REGR[0], 10);
delayms(50);
gChipID = RDA5807P_REGR[8];
gChipID = ((gChipID<<8) | RDA5807P_REGR[9]);
if (gChipID == 0x5808) //RDA5807N
{
for (i=0;i<8;i++)
RDA5807P_REGW[i] = RDA5807N_initialization_reg[i];
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807N_initialization_reg[0], 2);
delayms(600);
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807N_initialization_reg[0], sizeof(RDA5807N_initialization_reg));
}
else if (gChipID == 0x5804) //RDA5807PE,RDA5807SP
{
for (i=0;i<8;i++)
RDA5807P_REGW[i] = RDA5807PE_initialization_reg[i];
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807PE_initialization_reg[0], 2);
delayms(600);
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807PE_initialization_reg[0], sizeof(RDA5807PE_initialization_reg));
}
else if (gChipID == 0x5801) //RDA5807H,RDA5807HP
{
for (i=0;i<8;i++)
RDA5807P_REGW[i] = RDA5807PH_initialization_reg[i];
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807PH_initialization_reg[0], 2);
delayms(600);
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807PH_initialization_reg[0], sizeof(RDA5807PH_initialization_reg));
delayms(100);
do
{
i++;
if(i>10)
return 0;
RDA5807P_SetFreq(8750);
delayms(10);
//read REG0A&0B
OperationRDAFM_2w(READ,&(RDA5807P_REGR[0]), 4);
if((RDA5807P_REGR[3]&0x80)==0)
{
RDA5807_REGW[1] &= 0xFE;
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807_REGW[0], 2);
delayms(50);
RDA5807_REGW[1] |= 0x01;
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807_REGW[0], 2);
delayms(50);
}
}while((RDA5807P_REGR[3]&0x80)==0);
}
else
{
gChipID = RDA5807P_REGR[4];
gChipID = ((gChipID<<8) | RDA5807P_REGR[5]);
}
if ((gChipID == 0x5802) || (gChipID == 0x5803))
{
gChipID = 0x5802;
for (i=0;i<8;i++)
RDA5807P_REGW[i] = RDA5807P_initialization_reg[i];
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807P_initialization_reg[0], 2);
delayms(600);
error_ind = OperationRDAFM_2w(WRITE, (uint8 *)&RDA5807P_initialization_reg[0], sizeof(RDA5807P_initialization_reg));
}
delayms(50); //Dealy 50 ms
if (error_ind )
return 0;
else
return 1;
}
/**
* @brief Set FM volume
* @It has better use the system volume operation to replace this function
* @author
* @date
* @param uint8 level: volume value
* @return void
* @retval
*/
void RDA5807P_SetVolumeLevel(uint8 level)
{
uint8 RDA5807P_reg_data[8];
uint8 i = 0;
for (i=0;i<8;i++)
RDA5807P_reg_data[i] = RDA5807P_REGW[i];
RDA5807P_reg_data[7]=(( RDA5807P_REG[7] & 0xf0 ) | (level & 0x0f));
RDA5807P_reg_data[3] &= (~(0x10));
OperationRDAFM_2w(WRITE, &(RDA5807P_reg_data[0]), 8);
delayms(50); //Dealy 50 ms
}
/**
* @brief Set frequency function
* @author
* @date
* @param int16 curFreq:frequency value
* @return void
* @retval
*/
void RDA5807P_SetFreq( int16 curFreq )
{
uint16 curChan;
curChan=RDA5807P_FreqToChan(curFreq);
//SetNoMute
RDA5807P_REGW[0] |= 1<<7;
RDA5807P_REGW[2]=curChan>>2;
RDA5807P_REGW[3]=(((curChan&0x0003)<<6)|0x10) | (RDA5807P_REGW[3]&0x0f); //set tune bit
OperationRDAFM_2w(WRITE, &(RDA5807P_REGW[0]), 4);
delayms(50); //Delay five ms
}
更多linux知识点推荐:
【Linux文件系统】NFS文件系统如何生效
[Linux文件系统]文件系统的反解压操作镜像生产原始目录
[Linux字符驱动] DIDO 74HC595实现遥控遥信功能
[linux字符驱动]Watchdog如何躲过linux的启动时间
[Linux字符驱动] LED点灯试验
[Linux 驱动]模块加载RTX8025驱动
[linux kernel] 内核下RX8025对接系统时钟
[linux kernel]内核启动阶段控制IO口时序输出
[职场吐槽]如何缓解焦虑
[linux kernel] 内核下ksz8081驱动调试
[linux kernel] 内核下ksz9031驱动调试
[linux kernel]内核图形化裁剪配置
[linux kernel]内核移植过程记录
[linux kernel] 内核启动流程梳理
[linux 底层]u-boot EMMC驱动
[linux 底层]u-boot图形化裁剪配置
[Linux 底层]U-boot ksz9031网络驱动调试
[Linux 底层]U-boot调试命令使用技巧
[Linux 底层]U-boot编译移植
[Linux 底层]U-boot烧录脚本介绍SecureCRT
[Linux 底层]bootstrap移植裁剪及编译
[Linux 底层] 平台软件分层介绍
[Linux 驱动] RS485测试程序编写
[Linux 驱动] CAN测试程序编写
推荐阅读:
芯片手册解读 | Linux底层 | 职场吐槽 | C语言视频
关注微信公众号,回复“收音机模块”,下载数据手册及参考程序。