自制数字收音机RDA5807+STM32F405

最新萌生想听收音机的想法,早上跑步的时候想听一下广播,就想着自己做一个,上班路上也比较近,基本都是电动车上下班,在路上也可以听一下。交通广播有很多实时信息,不一样的体验。

制作数字收音机,支持全球频段。自动搜台功能,耳机收听效果更好。

方案:主控+收音机芯片+功放芯片实现外放功能+电池+充放电管理。

于是先网上找了一遍,有没有适合我的模块,方便开发集成。

图片

这货要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语言视频

关注微信公众号,回复“收音机模块”,下载数据手册及参考程序。

在这里插入图片描述

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值