• 【杰理AC696X】外挂收音IC RDA5807的频段设置


    外挂收音IC RDA5807的频段设置

    测试SDK版本:《ac608n_soundbox_sdk_v1.2.2》



    前言

    世界各国收音频段:

    接收地区OIRT: AM:531-1602(9kHz步进)、FM 64.5-73MHz(50kHz步进)俄罗斯、蒙古、北朝鲜
    接收地区EU :AM:531-1602(9kHz步进)、FM 87.5-108 MHz(50kHz步进)欧洲、中国、韩国、菲律宾
    接收地区JP :AM:531-1629(9kHz步进)、FM 76-90MHz(100kHz步进)日本
    接收地区US : AM:530-1710kHz(10kHz步进)、FM 87.5-108.1MHz(200kHz步进)美国


    一、RDA5807M 基本特征

    在这里插入图片描述
    完整的手册可到立创商城下载查阅

    可以看到,这颗收音IC的几个特征:
    1、支持全球频段 50~115MHz
    2、支持 100KHz、200KHz、50KHz、25KHz 的步进
    3、支持外挂32.768KHz晶振
    4、支持32.768 KHz 12M,24M,13M,26M,19.2M,38.4MHz的参考时钟
    5、支持 单声道和立体声的切换
    6、软件可控制音量和静音
    7、工作电压:2.7~3.3V
    8、只支持I2C通讯

    我案子用的电路:
    在这里插入图片描述

    二、频段设置

    1、杰理、蓝讯等蓝牙方案的SDK基本都自带了RDA5807的驱动,因为RDA5807M在消费电子中应用广泛,网上的驱动等资料也比较全,这里就不贴完整驱动了。

    2、寄存器说明也在数据手册中,完整的手册可到立创商城下载查阅

    杰理SDK中RDA5807的寄存器初始化表,使用默认频段 87~108MHz:

    /*--------------RDA5807MP Initial Table----------------*/
    static const u8 rda5807mp[] = {
    //#if defined(_SHARE_CRYSTAL_24MHz_)
    //    0xC4,0x51, //02H:
    //#elif defined(_SHARE_CRYSTAL_12MHz_)
    //    0xC4,0x11, //02H:
    //#elif defined(_SHARE_CRYSTAL_32KHz_)
    //    0xC4,0x01, //02H:
    //#else
        0xC0,
        0x05,//02H:
    //#endif
        0x00,
        0x10,//03H:
        
        0x04,
        0x00,//04H:
        RDA5807_RSSI | 0xC0,
        0xBF, //05h
        0x60,
        0x00,
        0x42,
        0x1A,//11
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,  //0x0ah
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,
        0x00,  //0x10h
        0x00,
        0x19,
        0x2a,
        0x11,
        0xB0,//0x80; 20110804
        0x42,//0x53;
        0x2a,//0x22; 20110804
        0x11,//加大音量0x31		wengyidong
        0xb8,//0xf8;		 20110804
        0x31,//0x30;  //0x15h
        0xc0,
        0x00,
        0x2a,
        0x91,
        0x94,
        0x00,
        0x00,
        0xa8,
        0xc4,
        0x00,  //0x1ah
        0xf7,//0xe0; 20110804
        0x0f,//0x00;
        0x2a,//0x3a;20110804
        0xdc,//0x14;  //0x1ch
        0x80,//0x81;20110804
        0x6f,//0x6a;
        0x46,
        0x08,
        0x00,
        0x86,
        0x06,
        0x61,  //0x20h
        0x00,
        0x00,
        0x10,
        0x9e,
        0x23,//0x22;	20110804
        0xc8,//0x44;
        0x04,
    	0x06,//0x08;  //0x24h 20110804
    	0x0e,//0x0d;
    	0x1c,//0x18;  //0x25h
    };
    
    • 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
    • 83
    • 84

    频段设置的寄存器:
    在这里插入图片描述
    可以看到,要改变频段,需要设置寄存器地址0x03h的bit<3>和bit<2>

    1.设置频段 76–108 MHz

    将5807初始表中的:

    0x00,
    0x10,//03H:
    
    • 1
    • 2

    改为:

    0x00,
    0x18,//03H:
    
    • 1
    • 2

    搜台设置频点时,会重新写0x03h寄存器,所以,下面函数也要同步修改:

    /*----------------------------------------------------------------------------*/
    /**@brief    设置一个频点RDA5807
       @param    fre 频点  875~1080
       @return   1:当前频点有台,0:当前频点无台
       @note     bool set_fre_RDA5807(u16 fre)
    */
    /*----------------------------------------------------------------------------*/
    u8 rda5807_set_fre(void *priv, u16 fre)
    {
        u16 pll;
        u8 i;
    
        i = 0;
        fre /= 10;
    
        printf("set_5807_frq %d ", fre);
    
        pll = (fre - 870);
        rda5807_dat[2] = pll >> 2;
        rda5807_dat[3] = ((pll & 0x0003) << 6) | 0x10;
    
        rda5807_write(4);
        delay_n10ms(5);
        /* os_time_dly(5); */
    
        do {
            rda5807_read(4);
            i++;
            //delay_n10ms(1);
            if (rda5807_true()) {
                puts(" 1 \n");
                return 1;
            }
        } while (i < 2);
    
        puts(" 0 \n");
        return 0;
    }
    
    • 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

    修改后:

    /*----------------------------------------------------------------------------*/
    /**@brief    设置一个频点RDA5807
       @param    fre 频点  875~1080
       @return   1:当前频点有台,0:当前频点无台
       @note     bool set_fre_RDA5807(u16 fre)
    */
    /*----------------------------------------------------------------------------*/
    u8 rda5807_set_fre(void *priv, u16 fre)
    {
        u16 pll;
        u8 i;
    
        i = 0;
        fre /= 10;
    
        printf("set_5807_frq %d ", fre);
    
        pll = (fre - 760);
        rda5807_dat[2] = pll >> 2;
        rda5807_dat[3] = ((pll & 0x0003) << 6) | 0x18;
    
        rda5807_write(4);
        delay_n10ms(5);
        /* os_time_dly(5); */
    
        do {
            rda5807_read(4);
            i++;
            //delay_n10ms(1);
            if (rda5807_true()) {
                puts(" 1 \n");
                return 1;
            }
        } while (i < 2);
    
        puts(" 0 \n");
        return 0;
    }
    
    • 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

    杰理的驱动,要将下图的REAL_FREQ_MIN 改为 7600:
    在这里插入图片描述

    2.设置频段65 –76 MHz

    将5807初始表中的0x03h寄存器改为:

        0x00,//03h
        0x1c,
    
    • 1
    • 2

    要注意:
    在这里插入图片描述

    0x07h寄存器:

    	0x1A,//07h
    	0x00,
    
    • 1
    • 2

    频点设置函数改为:

    u8 rda5807_set_fre(void *priv, u16 fre)
    {
        u16 pll;
        u8 i;
    
        i = 0;
    	fre/=10;
    
        printf("set_5807_frq %d ", fre);
    
        pll = (fre - 650);
        rda5807_dat[2] = pll >> 2;
        rda5807_dat[3] = ((pll & 0x0003) << 6) | 0x1c;
    
        printf("pll: %d   0x%x   0x%x \n", pll,rda5807_dat[2],rda5807_dat[3]);
        rda5807_write(4);
        delay_n10ms(5);
        /* os_time_dly(5); */
    
        do {
            rda5807_read(4);
            i++;
            //delay_n10ms(1);
            if (rda5807_true()) {
                puts(" 1 \n");
                return 1;
            }
        } while (i < 2);
    
        puts(" 0 \n");
        return 0;
    }
    
    • 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

    频段范围改为:

    #define REAL_FREQ_MIN  		(6500)
    #define REAL_FREQ_MAX  		(7600)
    
    • 1
    • 2

    总结

    1、设置的两个频段都用 惠普HP8657A信号发生器 测试过的,能正常接收频段范围内的频点。
    2、如果设置后,出现搜不到对应频点的情况,可以查看驱动,除了初始化写了初始数据,在其它地方有无改动到相应寄存器,可以全局搜索或者读寄存器值来排查问题。

  • 相关阅读:
    详解卡尔曼滤波原理
    [车联网安全自学篇] 五十五. Android安全之APK应用程序第三方服务/通知功能的敏感信息挖掘
    【愚公系列】2022年09月 微信小程序-微信小程序实现网页一键登录功能
    【Axure教程】雷达扫描动态效果(航空信息可视化案例)
    BI国产化,必须要弄懂的2个关键
    GoLong的学习之路(十一)语法之标准库 fmt.Printf的使用
    云原生之Linux命名空间和docker容器隔离
    【Linux】详解线程第一篇——由单线程到多线程的转变
    多微服务合并为一个服务
    PAT甲级 1066 Root of AVL Tree
  • 原文地址:https://blog.csdn.net/xx842678/article/details/126008322