1、事情的起因
这段时间一直在忙活自己的毕设,由于毕设里面要用到MPU6050当作姿态传感器,因此在淘宝上买了一批MPU6050自己来焊接。
但是当我写代码的时候,使用的时候出现了一个很大的问题。
设备的ID读取并没有问题,由于使用的是硬件I2C,这里发现读到的设备ID是0x98,然后因此并没有进入初始化阶段。
说实话这就遇到了非常头疼的问题就是能通讯,但是读出来的东西不对。如果通讯出了问题,那么功夫就要可以花在检查电路等硬件问题上。但是如果是读出来的内容有问题,那么就很头疼了。
后来查询资料过程中发现,这个问题在国内外技术论坛中出现过很多次,并且MPU6050的模块层次不齐,甚至有20个模块中将近一般出现设备ID是0x98的情况。
而大部分人认为,这是假的MPU6050(Fake chip)几乎所有的解决方法都是:换一个模块。
但是由于博主回家没带热风枪,并且说实话QFN的封装确实恶心,还是想着能不能找到解决办法。
2、转机
把这件事情定义为黑心商家用其他芯片来替代MPU6050的话,那么解决办法就是搞清楚这块芯片到底是哪块芯片。
要确定具体是哪块芯片的话,其实范围还比较小,首先是和MPU6050 是 pin to pin兼容的,并且连设备地址就是一样的,且设备ID是0x98的芯片。
然后看到了一块这个芯片,ICM-20689,它的器件地址和寄存器地址几乎和MPU6050一模一样,封装也完全相同,而且居然是MPU6050原厂设计的芯片。
并且原本MPU6050的设备识别码寄存器的地址是0x75,存放的值是0x68。
而ICM-20689的0x75寄存器也是设备识别码,但是存放的值是0x98.
这段话的描述和MPU6050几乎是一样的,甚至仔细查看芯片手册,ICM-20689的性能不输MPU6050甚至超过MPU6050,并且支持SPI传输,而不像MPU6050仅支持I2C, 像是MPU6000+MPU6050的融合版。
3、解决方案
由于寄存器地址和内容完全相同,因此实际上ICM-20689和MPU6050的用法完全相同。
这件事情可能就是一个较大的乌龙,甚至芯片商家可能都没有搞清楚ICM-20689和MPU6050的区别,将MPU6050和ICM-20689混为一谈(其实我认为也可以)。
而在我们使用的过程中也是因为代码中有检查设备识别码这个步骤,而如果去掉这个步骤,那么也不会发生这个问题。
互联网中搜到的关于这个问题,很多的解决办法都是换一个模块。
在ID检查中添加ICM20689的设备ID即可正常使用。因此,这是块假的MPU6050嘛?或许是,但是我认为更像是一场乌龙~