简介
杰理AW313A2是一个低功耗BLE芯片,有蓝牙功能,可以广播数据,也可以连接通信进行数据交互,单片机有的外设这颗BLE一般也有,像IIC、USART、ADC、定时器、外部中断等等都有,而且功耗比较低,最小系统板测试低功耗下4uA左右。
这里的应用场景主要是工作时通过蓝牙上报数据、采集其他模块的数据、控制个别模块的工作情况,不工作的时候进入休眠状态。
问题来了?
我们在产品测试的时候,设备休眠一段时间之后,就开不了机了,蓝牙芯片无法唤醒,奇怪的很。
那么,根据这个问题表象,我们逐步去排查一下,Let 's go!
一、复现问题,寻找规律
第一台出现这种问题的时候,是静置一晚上没用,第二天上班一开机就无法唤醒了;后面陆续出现第二台机器,再后来过了个五一假期批量出现。
根据这些现象看,有的是静置一晚上出现异常,有的是静置两天,但是静置5天之后批量出现,就说明静置时间越长,出现的概率越高。
二、排查硬件电路
遇到问题第一步,先排查电源。
检测LDO电源信号是OK,波形如下图:
IIC信号也是OK的,处于空闲状态,波形如下图:
外部中断唤醒信号也是OK的,用示波器也测了相对都很稳定,
基本上关联的信号都排查了一遍,没发现异常的地方,走到这一步没了思路。
于是,开始苦思冥想,从头开始捋捋思路,从软件维度看看。
三、排查软件
根据死机的设备,查看串口打印的数据,看不到,搜索蓝牙也搜不到,那基本证明BLE是完全没工作起来。
排查到这一步,看表象还不能断定是哪里的问题,但是有一个时间节点,就是之前的样机从来没出现,最近才开始出现,于是我根据软件版本修改履历确认下软件修改了哪里导致的异常。
这一查还真是之前一批样机没出问题的和这一批出问题一对比,就发现了问题点,差异点在RTC的一个定义的全局变量使能上,后来的样机都使能了,既然跟使能有关,那就是使能之后,再唤醒的时候就出问题了,导致唤醒失败,于是出现了开不了机的情况。
有了这个猜想,顺着这个思路,排查和RTC相关的。
这个时候我找了两台样机,打开了平台的log抓取,分析看看一台RTC使能的的和一台不使能做下对比,看看最后死机的时候打印的log有什么差异?
做了两天的测试,终于抓去了Log数据,如下图:
可以看到唤醒不了最后的打印PD I/O下拉的寄存器都是没有开的唤醒的寄存器也没有开,就是在RTC初始化里面自动进入poweroff了,还没跑到你的唤醒IO初始化那里,所以就无法唤醒了。
这个跟原厂沟通发现,需要做一个初始化的配置,唤醒口配置之后就不会有问题了,而且唤醒口的配置必须要增加到RTC配置之前。如下图:
好了,那我们就调一下程序,再验证一遍,通过寄存器数据来验证下。最后抓取的数据如下图:
这里就是自动唤醒进入poweroff,通过寄存器数据看设置唤醒口是对的,那基本就可以确定应该就是唤醒口设置的问题了。
走到这一步,问题终于搞清楚了,也基本就解决了。
四、总结
通过以上分析可以看出,这个应该不算一个很大的问题,当然,这是站在上帝视角来看待的,对于当时的问题现象排查起来也是很难下手的。
俗话说千里之堤毁于蚁穴,我们遇到的问题往往也没那么复杂,大多也都是一个容易疏忽的小问题造成的,问题不可怕,有问题就解决问题,解决了问题才能有所成长,如果始终遇不到问题,那基本就到了职业瓶颈的时候了。
最后,祝各位遇到的所有问题,都能解决并有所收获。