本人大二,这两年才刚接触单片机,这个暑假用MPU6050练习一下I2C通讯,结果I2C还好说,但在使用MPU6050时遇到很多问题,上网查有些问题也没有具体的原因和解决方案。于是有了一个在这里汇总记录一下我遇到的问题和解决办法的主意。要是能顺便帮到也被这些问题所困惑的各位就更好了。由于本文性质更偏向于总结、日记,文中含有一些个人吐槽。
那么接下来就直接进入主题。
I2C
在这里我不多提关于I2C的部分,只说一点。I2C的通讯以我目前了解有两种。一种是全程利用延迟,对SDA和SCL的输出和接收高低电平的时间进行控制以起到通讯作用。二是利用中断接收ACK信号以起到通讯作用。在实际操作中,发现第二种通讯会对DMP的初始化产生影响。
(2021.1.18补充)对于STM32F103单片机,有两个需要注意的地方。
一:延迟要准确。对于我自己的i2c驱动,2微妙和4微妙的延迟必须相对比较准确才行。那么对于其他所有软件i2c,延迟需要准确这条应该都是适用的。
二:想对于F4,F103的IO口配置稍微多一点(这个问题一开始没注意到,卡了我一天。。)。
实际设置发现F4只需要设置GPIO_MODER寄存器即可。具体设置为将scl和sda对应的IO口初始化为输出NOPULL,之后需要SDA为输出状态时把GPIO_MODER所对应的配置位改为01,需要输入的时候改为00即可。
而F103在设置时,需要同时修改GPIO_CRL中的端口模式位(MODEy)和端口配置位(CNFy)才行。具体设置为SCL和SDA初始化都为输入且NOPULL。SDA为输出模式时需要修改MODE为10,CNF为00;输入模式时MODE为00,CNF为01。
若各位在确认I2C时序无错且延迟准确后,还发现无法与6050正常通讯,不妨查查是否在IO设置里有问题。
如上,祝诸君顺利使用。
(2021.3.12补充)
对于i2c的数据发送之间的延迟,理论上来说只要大于i2c协议规定的最低时间,且小于最长时间即可。但实际使用时又发现,有时候延迟太久反而会导致无法通讯。这一点希望大家注意。可能有时候时序之类的都没有问题了,但还是无法通讯,这时候可以建议去修改一下i