为了方便大家学习,现与我爱蓝牙网联合推出【QCC300x/CSR867x/QCC30xx/QCC51xx开发板】。
技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠独家学习资料)
——————————正文分割线———————————–
苹果airpods在蓝牙耳机市场横扫千军,安卓阵营急需一员大将正面迎敌,高通的qcc302x/512x方案横空出世,成为下一代蓝牙SOC霸主的有力竞争者。
qcc30xx/51xx在硬软件架构上较上一代CSR867x有了明显的提升,主要体现在如下几点:
软件上增加earbuds例程,可以快速开发出充电盒+耳机的产品形态。
在开发之前,先对earbuds和sink例程的区别有一个宏观的了解:
功能 | sink例程 | earbuds例程 |
---|---|---|
ADK版本 | 4.X/6.X | 6.X |
配置方式 | config tool+pstool | 修改代码 |
产品形态 | tws耳机、音箱、soundbar | 真无线蓝牙豆 |
开发环境 | xIDE | MDE |
调音工具 | UFE | QACT |
看得出earbuds例程的开发工具链与sink例程相差很大,配置方式也不够完善,给我们开发带来了一定的挑战。
在安装完工具链,并根据指导手册创建了第一个qcc3020的earbuds工程后,开始了常规的踩坑填坑过程。好在有QQ群里的朋友的帮助,快速完成了earbuds例程的测试,相关源码和固件都会上传到共享组,有需要的朋友可以下载测试。
earbuds例程第一次deploy到硬件平台后,TRB调试器突然找不到设备。原因是硬件平台用USB供电,而非电池供电,也没有接热敏电阻。
修改方法是,将earbuds工程属性的DEFS选项中的HAVE_THERMISTOR和INCLUDE_TEMPERATURE这两个宏disable掉,再重新编译。之后TRB工具的link灯会点亮,可以进入调试模式查看运行log。
earbuds例程用蓝牙地址区分左右耳,需要修改dev_cfg_filesystem工程下的subsys1_config2.htf,然后rebuild此工程,再re-deploy earbud工程。
我的左耳地址是0x00ff01 0x5b 0x0002,右耳是0x00ff02 0x5b 0x0002。对于TWS来说,左耳是主,右耳是从。
修改完蓝牙地址后,将两个硬件平台同时复位,可以从log窗口中看到两个设备会自行建立TWS连接。
earbuds例程的状态机的示意图如下:
当左右耳完成TWS配对后,其仍处在IN_CASE状态,即在盒中。此时我们需要通过pydbg调试工具发送状态转移命令,将左右耳都切换到OUT_OF_EAR状态,在这种状态下,左右耳的按键可以工作了,且手机能够搜索到左耳的蓝牙名称;连接手机后,再用pydbg调试工具切换到IN_EAR状态,即进入正常听音状态。
通过pydbg调试工具发送命令的方式有一个局限,即在我们只有一个TRB调试器时,需要反复插拔TRB工具,使用较繁琐。在真实的产品中,状态切换是由传感器(入耳检测和重力加速度)触发的,这里建议可以自定义一个按键来触发,方法很简单。
首先在1_button.buttonxml文件中加入PIO20作为用户自定义按键,并定义按键触发事件:
USR_BUTTON_1
20
APP_USR_BUTTON_1_PRESS
RELEASE
USR_BUTTON_1
然后rebuild,MDE会自动将xml转成代码。此时我们打开av_headset_ui.c,在appUiHandleMessage函数中将按键事件关联到状态机:
case APP_USR_BUTTON_1_PRESS:
{
DEBUG_LOG("APP_USR_BUTTON_1_PRESS");
if (appSmIsInCase())
{
appTestPhyStateOutOfCaseEvent();
}
else if (appSmIsOutOfCase())
{
appTestPhyStateIsInEar();
}
}
break;
这样在我们按下此键后,状态机会发生转变,方便测试验证。
由于我们的平台使用了外接功放,需要将PIO3映射到功放的使能脚才能听到音乐。修改av_headset_config.h文件,使能外放控制脚:
#define appConfigExternalAmpControlRequired() (TRUE)
#define appConfigExternalAmpControlPio() (3)
#define appConfigExternalAmpControlEnableMask() (1 << appConfigExternalAmpControlPio())
#define appConfigExternalAmpControlDisableMask() (0 << 0)
有以下几点直观的感觉:
总体的感觉,earbuds不是很成熟,还需要时间打磨,期待下一个ADK大版本能有惊喜给到开发者们。