您好,恩智浦社区!: )
我有一块带有 MMA8652 加速器的定制板,连接到 RPi4。问题是,当我尝试读取任何寄存器时,其值总是最大的,即 0xFF。我的测试程序是将 CTRL_REG1 设置为 0b1 以启动设备,然后请求 WHO_AM_I(或者基本上是任何寄存器)。如果我在设置 CTRL_REG1 后留出一些时间,不管是 1us、1ms 还是......100ms,都没有关系。100毫秒
最让我困惑的是,这种情况只发生在 C++ 中!我在 Python 中尝试了同样的程序,得到的是正常值,即 WHO_AM_I 为 0b1001010。
我知道我的I2C包装器可能是造成这个问题的原因,但问题是它适用于同一总线上的其他I2C设备。
我也尝试过使用第二块板,但问题仍然存在,所以它可能不是 IC 的损坏或损坏的副本,而是他们的操作方式出了问题。
编辑:我还附上了范围图像,但只看到 2 个操作!难道不应该有第三个(国际会议的答复)吗?
接得好,@TomasVaverka! 谢谢!
实际上,问题在于我处理 I2C 总线的方式。我修复了封装程序,现在我可以顺利地与 MM8652 通信了!
你好,@SpyrosRallis、
首先,我为稍有延迟的回复表示歉意。
查看您的示波器图像,第二和第三字节之间的停止条件不正确。
您需要修改 C++ 源代码,使 SDA 在 SCL 变为高电平之前过渡到高电平,以消除此停止条件。
下图说明了 WHO_AM_I 寄存器(0x0D)的读取过程。正如你所注意到的,第二个 (0x0D) 和第三个 (0x3B) 字节之间没有停止条件。
顺祝商祺!
托马斯