杰理可视化SDK--耳机与智能充电盒通信
耳机与底座通信使用通用异步收发传输(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信和并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,我们在做TWS耳机开发时现在常见的作法一般做的都是单线串口,TX和RX共用一根线,通信由充电仓发起,耳机接收回复。本篇文章介绍使用杰理可视化SDK,实现TWS耳机和智能仓进行单线串口通信以及耳机单线通信软件代码简单解析。
单线串口通信基本设置
使用可视化工具,打开电源配置选项中的智能仓开关,使能耳机与智能底座的通信功能。
配置单线串口所使用的IO口,硬件连接上需要将耳机POGO PIN接入到这个引脚。默认使用的LDOIN引脚,也就是VPWR引脚(Charge Power Input引脚)
通信串口波特率可以在chargestore_config.c文件中的chargestore_data成员baudrate设置。
单线串口通信的流程
耳机与智能充电仓使用单线串口通信的流程如下图,单线通信指的是TX和RX共用一根线,通信由充电仓发起,耳机接收到消息做出相对应的处理并回复。
Chargebox_send:智能充电仓通过串口发送数据。
Uart_isr:耳机串口接收到数据,进入串口中断服务程序(自定义的数据处理切记不要在中断里做读写VM或者其他耗时较多的操作,这些应放在下面event_handle处理)
Data_deal:数据分析接口。(注意如果不是走杰理标准协议,是不会进这里的)
Event_to_user:事件发送接口,由于中断里不能占用太长时间,耗时多的操作发事件去handle处理,应该发送事件到app线程进行处理。
Event_handle:消息处理函数,收到的指令实现、组包和回复等,具体在这里处理。
Earphone_reply:耳机端消息回复。
自定义串口通信代码浅析
以下对杰理ldoin自定义串口通信demo代码做简单分析。
-
串口接收中断
在开机chargestore_open()函数中,设定了串口接收中断callback
当智能充电仓对串口有发送数据时,耳机串口接收中断cb处理,进入串口中断服务函数。
-
Data_deal处理
自定义的数据处理推荐在uart_isr中断服务函数中做数据拦截,判断数据是否是用户自定义的数据,若不是自定义数据则返回0,执行SDK原流程(避免影响测试盒等默认通信流程)。如果判断数据是自定义的,就进入自己的处理流程,如进入了自定义的数据处理函数user_chargestore_data_deal(),对自定义数据进行数据解析。也可以在自定义的data_deal或SDK默认的data_deal函数打印数据put_buf,以便分析排查充电仓发送来的数据是否正确。
-
Event_to_user
当data_deal数据处理判断是自定义的数据之后,由于在中断里不宜占用太长时间做数据处理,应该发送到app线程去处理。如下图,官方简单demo是借助了SDK默认的handle发送到app_chargestore模块进行处理。
-
Event_handle
进入自定义的user_chargestore_event_handle()函数处理自定义的事件。比如TEST_CMD_1、TEST_CMD_2等自定义的事件。耳机端自定义的数据发送使用chargestore_write()函数进行数据发送。
单线串口通信问题调试步骤
- 先确认uart_isr有没有收到数据,如果没有收到数据,需要确认下有没有充电仓发或者接触好不好(有条件用逻辑分析仪看看数据)
- 如果有收到数据,可以在代码中添加数据打印,确认下数据跟发送的对不对的上,对不上检查一下接触和设置的波特率。
- 如果走默认充电仓指令,需要满足杰理通信协议,才会进入杰理默认的data_deal,否则需要走自定义。
- 确认data_deal里面数据接收对不对,一般参数传递没问题不会有错。
- 在data_deal里面发送事件给event_handle处理,数据的回复和发送默认协议用chargestore_api_write()发,自定义的数据应使用chargestore_write()接口来发送。
- 如果event_handle收不到数据,可能是接口使用错误,或者程序其他地方有东西把线程占满了(可以先用公版对比看看改了哪里导致)