本帖最后由 Argent 于 2020-2-8 12:09 编辑



      今年的春节已经接近尾声了,由于新型冠状病毒肺炎疫情还在影响着我们的出行,中国人拜年不再串门聚会,电话视频拜年匆匆而过,周围的环境显得格外安静、异常。近几日死亡人数不断攀升,疫情不容乐观,不管怎么样,大家众志成城,齐心协力,相信黎明就在不远的前方。祝愿在前线支援的白衣天使们,身体健康,阖家欢乐;元宵佳节,称心如意。




     今天我给大家分享一下SDK中的从机工程中的音频检测体验。该工程的所在SDK中的目录是“FR801xH-SDK-master\examples\dev1.0\ble_simple_peripheral”,在该工程中,可以测试FR8016HA对音频文件的解码能力。使用Keil将工程打开,我们可以清晰的看到工程归纳整洁,platform平台机制管理,各应用层文件,驱动层文件,协议栈库文件分类明确,让开发人员更好更快得读懂该实例工程。在蓝牙初始化之前执行的是user_entry_before_ble_init()函数,该函数实现了设置电源供电模式为BUCK,使能串口设置。用户入口函数是user_entry_after_ble_init(),顺藤摸瓜,我们可以跟踪得知创建了speaker任务,周期性定时器,初始化了气压计,温湿度传感器,加速度传感器模块。




     全编译后,将生成的“ble_simple_peripheral.bin”文件烧写进开发板中,至于如何烧写,可以回看本人发的初次体验贴
。烧写完该从机工程后,将安卓手机安装“Fr8010loadsbc_v16.apk”应用软件,然后使用手机搜索蓝牙设备,截图如下:




蓝牙搜寻.jpg


     然后点击Simple Peripheral,能够顺利地进入连接状态。如果手机界面一直显示在“正在连接”而未连接成功,可以尝试将手机的蓝牙重启后再搜索,再连接开发板就能顺利连接了。连接之后手机app显示如下




连接成功.jpg


     由此可以得知,该主机端可以将一个指定的文件发送给从机开发板。开发板自启动开始,建立连接串口打印信息如下




串口打印信息.png


      然后根据工程源码中的代码指示,可以得知按键K1与PC5关联,K2与PD6关联,喇叭功放与PA1关联,因此增加三个跳线帽,将PC5与K1短接,PD6与K2短接,PA1与PASD短接,并将喇叭接口处连接一个小喇叭。



  1. <div>void simple_peripheral_init(void)
{
        // set local device name
        uint8_t local_name[] = "Simple Peripheral";
        gap_set_dev_name(local_name, sizeof(local_name));
        // Initialize security related settings.
        gap_security_param_t param =
        {
            .mitm = false,
            .ble_secure_conn = false,
            .io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT,
            .pair_init_mode = GAP_PAIRING_MODE_WAIT_FOR_REQ,
            .bond_auth = true,
            .password = 0,
        };
        gap_security_param_init(¶m);
        gap_set_cb_func(app_gap_evt_cb);
        gap_bond_manager_init(0x7e000,0x7f000,8,true);
        gap_bond_manager_delete_all();
        mac_addr_t addr;
        gap_address_get(&addr);
        co_printf("Local BDADDR: 0x%2X%2X%2X%2X%2X%2X\r\n", addr.addr[0], addr.addr[1], addr.addr[2], addr.addr[3], addr.addr[4], addr.addr[5]);
        // Adding services to database
        sp_gatt_add_service();
        speaker_gatt_add_service();
        pmu_set_pin_pull(GPIO_PORT_D, (1<<GPIO_BIT_6), true);
        pmu_set_pin_pull(GPIO_PORT_C, (1<<GPIO_BIT_5), true);
        pmu_port_wakeup_func_set(GPIO_PD6|GPIO_PC5);
        button_init(GPIO_PD6|GPIO_PC5);
        demo_LCD_APP();                                                                    
        demo_CAPB18_APP();                                                         
        demo_SHT3x_APP();                                                     
        gyro_dev_init();                                                      
        //OS Timer
        os_timer_init(&timer_refresh,timer_refresh_fun,NULL);
        os_timer_start(&timer_refresh,1000,1);
}


  1. <div>void speaker_init(void)
{
        pmu_codec_power_enable();
        audio_speaker_codec_init();        
        i2s_init(I2S_DIR_TX,8000,1);        
        NVIC_SetPriority(I2S_IRQn, 2);        //Setting the I2S interrupt priority
        co_printf("speaker_init\r\n");
        PA_init_pins();                                        //Initialize PA enable pin
}

void PA_init_pins(void)
{
        system_set_port_mux(GPIO_PORT_A, GPIO_BIT_1, PORTA1_FUNC_A1);
        system_set_port_pull(GPIO_PA1, true);
        gpio_set_dir(GPIO_PORT_A, GPIO_BIT_1, GPIO_DIR_OUT);
}



        然后我们可以通过按键来切换检测项目,K1可实现三种状态的切换,按下第一次,如下图所示,这里未对气压计,温湿度传感器进行驱动配置,因此显示error,串口打印与液晶屏显示同步。




key1第一次按下.png


       当第二次按下K1时,液晶屏显示请按K2进行音频测试的对话提示语,同时串口输出信息如下




key1第二次按下.png


       当第三次按下K1时,液晶屏上显示图片更新的模式,同时串口输出信息如下




key1第三次按下.png


       当K1第二次按下时,再按K2进行音频功能的检测,短按一下K2,就能播放出高亢激昂的音乐了,当然这是对“FR801xH-SDK-master\examples\dev1.0\ble_simple_peripheral\files”下的“music_8k_new.wav”文件进行解码,如果更改替换成相似大小的wav音频文件,重新编译烧写进flash中,就能对该音频文件进行解码了,解码成功将顺利地播放出美妙乐谱。执行播放音乐时串口打印信息如下:




key1第二次按下后再短按key2音频检测.png


     此次分享就到这里,蓝牙主从连接还是挺快的,音频文件解码顺畅,无卡顿现象。机操作演示
请移步观看,今天是元宵佳节了,真心地祝愿大家身心健康,重返岗位,疫情早日结束,开创2020新篇章!