BNO085异常,无Reset返回,无数据返回

BNO080

Views:  times Updated on February 22, 2022 Posted by elmagnifico on January 3, 2022

Foreword

这个是年前遇到的问题,一直没处理,现在记录一下。

之前BNO是别人负责的,一直好像都有点小问题,但是不影响使用,我也没注意。现在转到我手上以后,一看满是问题啊。

情况

之前的问题是,这个传感器是不是就没数据返回了,然后通过重启传感器以后,又恢复了。由于不是大问题,就一直这么凑活用着。

现在遇到的新问题是,这个传感器彻底没数据返回了,reset也没用。

内存溢出

一上来就看到了接收buff不够,有一个276字节的包,每次上电的时候都会收到,而接收buff才128,铁溢出了。但是改了这个还是没解决问题。

极简驱动

整个驱动就重启、检测了一下传感器信号、然后发了一条配置命令,就开始工作了。特别的简单。但是问题是开始前的这一部分流程中,收到了好多个不能解析的包,不知道是什么内容,然后解析也会没有对应的分支,但是最后总能收到正确数据,这也太神奇(不干人事)了吧。

重新读驱动手册,发现第一个包276应该是传感器上电以后发送的广播包,用来告知当前传感器状态、版本等等信息的,而这个包没有解析,行吧,反正也不重要,不解就不解吧。

但是收包的时候又发现,这里面收到了非常多的NACK,这就很奇怪了,后面反复测试几次以后,直接芯片就彻底没反应了,通信完全失败了。只好等其他出问题的芯片拿回来继续了。

Debug

中断处理

平常芯片可能会给你一个中断引脚,告诉你这个是data ready或者类似的作用,可用可不用,但是BNO这里非常诡异,他必须要用,必须在中断的时间内把数据读走,否则就会出现数据出错或者其他的问题。而显然我们的驱动里读数据根本没考虑这个问题,根本不管是否可读,无脑读。所以有时候没数据需要重启,大概就是因为这个中断和读的时间错位了,导致一直读不到数据,报错了。

额外回包

第一个广播以后,我请求了一次F9-产品信息的报告,这个数据长度也完整发完了,最后一次长度是0c,我每次读32字节(payload 28字节)

接着我就发了配置cmd,发了以后,他就回了我一个

06 00 00 0C 01 0B 

我查了一下是说我在广播之前就发送了写,导致失败了,可是我明明是广播之后发送的。

然后在这个错误以后,继续读,还会发送BNO还在回信息给我,而且是F9的信息,非常奇怪。之后开始读数据,就一直返回00。

包序配置错误

以为BNO是包序有问题,得多读一些,于是将整个配置信息再往后放,先读他个十七八遍,然后就发现,这个异常回包依然有,而只要我写了配置信息,就必然会报错。

后来发现其实是BNO的F9的产品信息包,实际是2个包,他是分别发送的,第一次是20个字节的包

第二次则是这个52字节的包,可是原厂的说明文档里没有说这是2个,只是说了可能会发送不完全包

这个包里是上次芯片重启的原因,是Not Applicable的,而每次重启都会报告这个包。

所以在收包的时候,每次收2个,然后再进行写配置,就不会产生这个错误了。

参考官方驱动

BNO技术支持建议我参考官方驱动,我先看了一下流程,官方重启芯片以后需要等Reset ACK。而我这里明显毛都没有。

于是重新写重启流程,硬等Reset的返回命令。

等到Reset返回以后,再进行读和设置。这里还有一个很奇怪的现象,传感器以及重启了,但是依然会发送广播包,等广播发完了,才能回Reset的信息,就很奇怪。

而出问题的芯片直接在等待Reset这一步就出错了,根本没有Reset Completed 回传,一直等不到,那就Reset失败了,而这个问题只能原厂解决了,我没办法了。

解决

等原厂回复….

原厂第一次回复

台湾原厂,拿着逻辑分析仪的数据,挨个数据分析,指出来各种问题(完全不考虑INT引脚的情况就操作,时不时NACK、没考虑回包和写包的间隔)。还好都是小问题,现场挨个解,最后数据里老是出现NACK,反复采集了好几次,总算得到了一次NACK没有出现在关键位置的,然后BNO依然是没有回复。原厂技术也无可奈何,只好说向美国的原厂再问一下看看什么情况。

我已经明确指出来问题所在了,不过原厂技术依然要挨个数据看过来,本质上还是非常严谨的,对应数据手册上的说明也挨个解释一遍,虽然我已经有点不耐烦了。整了一早上,总算到了关键地方,然后发现BNO就是不回复数据,INT线一直拉不下去。

只好继续等待美国原厂回复了….

原厂第二次回复

美国原厂解决不了,需要实际出问题芯片去检测,所以估计光是运过去就得两周以上了,等他们回复也是年后上班了。

原厂第三次回复

美国原厂发现是芯片的Security Reg被修改了,导致芯片可以通信,但是无法返回数据。而修改这个东西需要的命令是不对外开发的,如果说误打误撞修改了,基本不可能,本身有严格的协议,想要碰到一样的数据,也太难了。且不说我们不是一块芯片出问题,是有近10块芯片出现问题的,概率不算低。通过恢复这个寄存器,芯片又能正常工作了。暂时的解决方案是补偿新的给我们,但是问题还得查。

基本上这个问题是无解了,只是说等我们新的芯片再用上的时候看看是否还出现问题了。

后续BNO涨价到了用不起的程度,这个问题大概率是无解了。