蓝牙耳机开发--TWS蓝牙耳机双向通信充电盒设计
TWS蓝牙耳机智能充电盒设计
- 充电盒硬件整体设计
- 主控芯片(MCU)
- 电源管理芯片(PMIC, POWER MANAGER IC)
- 智能充电仓硬件设计框图
- 充电盒软件整体设计
- 充电盒软件代码片段
- 用户定义
- 初始化完成
- 各模块定时处理
近年来以苹果公司发布的AirPods真无线耳机为开端,TWS/OWS耳机市场销量迎来了飞速的增长,与TWS耳机配套的充电仓也随着耳机的发展而快速发展。本文介绍一种单线双向串口通信的充电盒设计,只需要使用两个pogo pin顶针便可以与耳机接触进行串口通信,从而进行与耳机数据交换等复杂操作,使蓝牙耳机充电仓朝着更人性化、智能化方向发展,更加方便用户使用。
充电盒硬件整体设计
主控芯片(MCU)
- 充电盒主控使用昇生微电子 SS86F8 51内核架构通用微控制器MCU
- 8位增强型MCU,12KB Code Flash,128B EEPROM,192B Data RAM
- 3个16位定时器,可同时产生7路PWM
- 集成1个支持半双工通信的UART接口
电源管理芯片(PMIC, POWER MANAGER IC)
- 电源管理芯片使用昇生微SSP707。带IIC通信,多功能PMIC(电源管理IC)。
- 内置载波通信模块,支持数能同传的应用场景。
- 支持5/0V通信、PLC通信、ELP/ERP电压检测、轻载检测、通信电平转换等TWS相关特色功能。
智能充电仓硬件设计框图
充电盒软件整体设计
-
环境搭建:
Keil C51, 昇生微SSW Flash Tool烧录工具 -
固件烧录
使用4线烧录DCN, DAT, CLK, GND。可以分为在线烧录和离线烧录
在线烧录使用昇生微在线烧录工具,接线连接到充电盒
点击连接,连接成功后电脑端显示芯片状态为连接后点击烧录
离线烧录:
离线烧录是指直接将固件部署到烧录器中,烧录器插入电脑后会识别成一个盘符。将编译好的固件bin文件放到烧录器盘符中。
烧录器使用4线接法连上底座。点击单击烧录器上的Update按键开始烧录。
绿色指示灯闪烁即为开始烧录; 烧录成功会亮pass灯光, 并显示屏上显示。如下图蓝色灯光显示为烧录成功。
-
TWS智能充电盒DEMO代码目录结构
app – 存放应用层代码 (通信逻辑 ui逻辑等)
device – 驱动层代码 (按键驱动 霍尔传感器驱动 NTC驱动等)
hal – 硬件抽象层代码 (GPIO TIMER UART IIC等)
工程文件在app/prj/keil目录下打开keil工程
使用keil C51进行代码编译 build或者rebuild
充电盒软件代码片段
用户定义
device-config-default.h文件包含了用户常用的宏定义
-
按键定义:
#define CONFIG_USING_KEY 1
#define CONFIG_KEY_USING_SSP707X 1
按键挂在SSP707X芯片引脚上; GET_KEY_STATUS() 发送IIC命令获取SSP707X是否按下 -
霍尔定义
定义开关盖时是否使用霍尔,和定义霍尔使用的IO口。P0_7
#define CONFIG_USING_HALL (1)
#define CONFIG_HALL_IO (0x07) -
LED控制定义
#define CONFIG_USING_SBLED 1
#define USING_PWM5
使用的是PWM2 PWM3 PWM4 PWM5 这4颗LED灯
-
电量显示
#define CONFIG_USING_BATTERY 1 -
IIC控制器
#define CONFIG_USING_SI2C 1
用来控制SSP707X
初始化完成
初始化完成之后,初始化时定时器开起来之后,各模块会开始循环处理。在定时器会做10ms、100ms、1s的定时标志,在main中while(1)里面处理各个定时标志的处理。
各模块定时处理
以10ms标志处理为例子,各模块10ms调用一下模块内部处理,使用event_set_ui_state 设置ui_state标志位,给到其他模块根据ui_state标志位做相对应的处理。
- 10ms key 按键处理
void key_handle_10ms(void)
判断按下则key_0_pressed_cnt++; 松手key_0_pressed_cnt=0
按键情况:
- 短按
key_0_pressed_cnt>5&& key_0_pressed_cnt< CONFIG_KEY_SHORT_PRESS_CNT
event_set_ui_state(EVENT_STATE_UI_KEY_CLICK) - 长按
key_0_pressed_cnt== CONFIG_KEY_LONG_PRESS_CNT
event_set_ui_state(EVENT_STATE_UI_EAR_PAIRING) - 加长按
key_0_pressed_cnt== CONFIG_KEY_LLONG_PRESS_CNT
event_set_ui_state(EVENT_STATE_UI_EAR_RESTORE)
-
10ms hall处理
void hall_handle_10ms(void)
IS_HALL_ON() 获取霍尔传感器IO口状态, 带debounce
event_set_ui_state(EVENT_STATE_UI_HALL_OFF)
event_set_ui_state(EVENT_STATE_UI_HALL_ON) -
10ms USB插入(DC IN处理)
void pm_dcin_handle_10ms(void)
判断是否有USB插入
event_set_ui_state(EVENT_STATE_UI_DCIN_IN))
event_set_ui_state(EVENT_STATE_UI_DCIN_OUT) -
10ms dfu处理
-
10ms 通信模块处理
void comm_handle_10ms(void)
通信时会判断前面hall状态改变事件, 按键事件, 轻载过载事件
根据comm_tmr_cnt处理不同的事情 comm_tmr_cnt每隔10ms 会做自增++动作
10ms通信模块处理:
-
10ms ui模块处理
void displays_handle_10ms(void)
UI模块拿到其他模块设置的ui_state LED灯光显示处理:设置led闪灯的pattern
-
10ms sbled模块处理
根据UI模块设置的LED的pattern进行灯光闪烁。