我们在进行TWS耳机开发时,耳机与充电盒之间往往需要有通信交互,耳机与充电盒之间的通信方式一般可以使用单线串口通信的方式,TX和RX共用一根线,通信由充电仓发起,耳机接收回复。耳机与充电盒之间通信的用途很多,常见的用途有:配合充电盒上的霍尔传感器将开关盖状态同步给耳机做相应的动作、可以使耳机进入配对状态、使用充电盒TWS左右互配等用途。本篇文章主要围绕恒玄BES2700蓝牙耳机SDK,介绍了TWS耳机与充电盒的单线串口通信实现及相关代码解析。

充电盒与耳机的通信方式

耳机与智能底座充电仓使用单线串口通信的流程如下图,耳机单线串口通信指的是TX和RX共用一根线,单线串口通信为半双工的通信方式,一般通信是由充电仓发起,耳机接收到消息做出相对应的处理并回复。本篇文章介绍的是恒玄BES2700耳机端的单线串口通信部分,充电盒端的通信部分可以参考另一篇文章:《TWS蓝牙耳机双向通信充电盒设计》。
充电盒与耳机通信方式

单线串口通信硬件设计

单线串口通信需选择芯片单线串口通信引脚。一般为UART_COM管脚、GPIO_CHARGE或LED2脚。
硬件设计-通信脚
恒玄BES不同系列的芯片单线串口所使用引脚可能会有些区别,具体查询各芯片规格书或参照BES官方硬件方案设计参考原理图。
硬件设计-通信脚2

单线串口通信软件设计

以下以BES2700SDK为例,SDK中的单线串口通信软件底层API一般位于SDK\services\communication路径communication_srv.cpp文件中,如下图常用单线串口通信底层API
单线通信API
communication_init():该函数用于初始化单线串口通信模块。
communication_receive_register_callback():该函数用于注册单线串口接收回调函数。
communication_send_buf():该函数用于单线串口数据发送。

单线串口通信SDK代码浅析

以下以BES2700蓝牙TWS耳机SDK为例,解析单线串口通信模块的使用过程,BES其他SDK单线串口通信部分代码也可以参考。

  1. 单线串口初始化
    单线串口通信初始化可以放在app_init初始化时进行,调用communication_init()函数初始化单线串口通信模块。
    单线串口初始化
    communication_init()函数中会对单线串口通信模块邮箱发送COMMUNICATION_MSG_INIT的消息,接收到MSG_INIT的消息后,模块内部会对串口IO、串口通信、DMA接收等设置进行配置,如下图。
    单线串口初始化2
    在uart_init()函数中可以看到串口通信数据位以及波特率的配置可以在comm_uart_cfg结构体成员配置中设置。
    单线串口初始化3
  2. 单线串口数据接收
    单线串口数据的接收推荐是自行定义一个communication_receive_func_typedef类型的函数,接着把自定义的串口接收函数以参数的方式传给communication_receive_register_callback()函数用于注册回调函数,这样接收到串口数据时就会进入到注册的串口接收函数中。
    单线串口数据接收
    这样便可以在自定义的串口数据接收函数中做自定义的数据解析了,比如解析串口数据包的数据头、根据串口接收到的数据区分左右耳命令进行处理等。
    在单线串口数据接收2
  3. 单线串口数据发送
    上层需要发送数据时调用communication_send_buf()函数填入需要发送的数据buf和数据长度len就可以了。如下图可以看到APP上层通过调用communication_send_buf函数,将需要发送的数据buff装进malloc的cmd_blk->cmd_buf中, 生成串口数据后通信模块内发送COMMUNICATION_MSG_TX_REQ的邮箱消息。
    单线串口数据发送
    单线串口通信模块内部收到COMMUNICATION_MSG_TX_REQ的消息之后,将单线IO口切换成TX模式,并通过调用底层的串口DMA的发送接口将数据发送出去。发送完成之后再将单线IO口切换回RX模式,等待充电盒发来的下一条命令。
    单线串口数据发送2
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐