9.11. FM电台

概述

本说明介绍了fm功能(需外挂fm功能模块):包括开关fm、暂停/播放、音量调节、频率调节、上下电台和扫描频率调节。

9.11.1. 使用配置说明

//app_config.h:
#define CONFIG_FM_DEV_ENABLE                1        //打开外挂FM模块功能
#define CONFIG_FM_LINEIN_ADC_GAIN           100
#define CONFIG_FM_LINEIN_ADC_CHANNEL        3        //FM音频流回采AD通道
#define TCFG_FM_QN8035_ENABLE               1
#define TCFG_FM_BK1080_ENABLE               0
#define TCFG_FM_RDA5807_ENABLE              0

//board.c 板级iic配置,使用硬件iic0
{ "iic1",  &iic_dev_ops, (void *)&sw_iic0_data },
{ "iic0",  &iic_dev_ops, (void *)&hw_iic1_data },
//fm消息处理
static void fm_msg_deal(struct fm_info *fm, int msg)
{
    switch (msg) {
    case FM_DEC_ON:            //开启fm播放
        fm_dec_onoff(fm, 1);
        break;
    case FM_DEC_OFF:           //关闭fm播放
        fm_dec_onoff(fm, 0);
        break;
    case FM_MUSIC_PP:          //静音
        fm_volume_pp(fm);
        break;
    case FM_PREV_FREQ:         //上一个频率
        fm_prev_freq(fm);
        break;
    case FM_NEXT_FREQ:         //下一个频率
        fm_next_freq(fm);
        break;
    case FM_VOLUME_UP:        //调节音量
    case FM_VOLUME_DOWN:
        fm_volume_set(fm);
        break;
    case FM_PREV_STATION:     //上一个电台
        fm_prev_station(fm);
        break;
    case FM_NEXT_STATION:     //下一个电台
        fm_next_station(fm);
        break;
    case FM_SCAN_ALL_DOWN:    //扫描搜寻所有以下频率电台
        fm_scan_all_down(fm);
        break;
    case FM_SCAN_ALL_UP:     //扫描搜寻所有以下频率电台
        fm_scan_all_up(fm);
        break;
    default:
        break;
    }
}

9.11.2. 代码流程

  • 1.fm_manage.c:创建和杀死fm线程

  • 2.fm_manage.c:fm处理消息任务

int fm_server_msg_post(int msg)//post消息到fm_task线程
{
    return os_taskq_post("fm_task", 1, msg);
}

static void fm_task(void *priv)//fm任务
{
    struct fm_info *fm = (struct fm_info *)priv;
    int err;
    int msg[32];

    if (0 != fm_manage_init(fm)) {
        return;
    }
    fm_app_mute(fm, 1);
    fm_read_info_init(fm);
    os_time_dly(1);
    fm_app_mute(fm, 0);
    fm_dec_onoff(fm, 1);//开启fm

    while (1) {
        err = os_taskq_pend("taskq", msg, ARRAY_SIZE(msg));
        if (err != OS_TASKQ || msg[0] != Q_USER) {
            continue;
        }

        switch (msg[1]) {
        case FM_MSG_EXIT:
            fm_manage_close(fm);//关闭fm
            return;
        default:
            fm_msg_deal(fm, msg[1]);//fm消息处理
            break;
        }
    }
}

9.11.3. fm模式按键说明

  • 长按KEY_DOWN进行下一个电台播放 fm_next_station(fm); //下一个电台

  • 长按KEY_UP进行上一个电台播放 fm_prev_station(fm); //上一个电台

  • 长按KEY_CANCELL进行扫描搜寻会自动进行搜台播放(如下图) fm_scan_all_down(fm); //扫描搜寻所有以上频率电台

9.11.4. 常见问题

  • 1.切换到fm模式无响应

答:查看外挂fm功能宏是否打开,查看iic是否对应配置,打开初始时会有底噪声则已打开fm功能

  • 2.fm搜寻到电台但是只播放噪声,未能成功收听到电台声

答:查看外挂fm模块天线是否接收信号良好