pic32 和 MPL3115A2 Altitude/Pressure 传感器之间的 I2C 通信

I2C communication between pic32 and MPL3115A2 Altitude/Pressure Sensor

我正在尝试做一些非常简单的事情,但我在让它工作时遇到了一些麻烦。我正在使用 MPL3115A2 Altitude/Pressure 传感器和 pic32 uC32 板,我正在尝试使用 I2C 在两者之间进行通信。 (uC32板与arduino非常相似,在编码方面几乎相同)。

我正在使用 wire 库,我只是想从 MPL3115A2 读取寄存器 0x​​0C,它应该给我设备 ID。

这是一个代码片段(定义在代码的顶部,其余部分在主循环中):

#define barAddress 0x60

Wire.beginTransmission(barAddress);
Wire.send(0x0C);
Wire.endTransmission();

Wire.requestFrom(barAddress, 1);
uint8_t a = Wire.receive();
Serial.println(a, HEX);

所以我从地址 0x60 开始传输(来自数据表:标准的 7 位 I2C 从地址为 0x60 或 1100000。8 位读取为 0xC1,8 位写入为 0xC0。)。然后我发送 0x0C 因为那是我想要访问的寄存器。然后我结束传输,并从地址 0x60 请求 1 个字节,将该位接收到一个 8 位变量中,然后打印它。

我 运行 遇到的问题是,当我打印它时,我只得到 0。我没有得到设备 ID,只有 0。无论我尝试读取哪个寄存器,我都得到 0 .

在过去的几天里,我一直在用头撞墙,试图让它发挥作用。我附上了我用逻辑分析仪捕获的东西,以及我一直试图访问的 MPL3115A2 数据表中的寄存器列表。

使用逻辑分析仪我可以看到时钟和数据线。时钟似乎正常,数据线给我以下信息:

START
Write['192'] + ACK
'12' + ACK
STOP
START
Read['193'] + ACK
'0' + NAK
STOP

这对我来说似乎都是正确的(192 和 193 来自 8 位写入和读取是 0xC0 和 0xC1),除了“0”。我应该获取设备 ID,而不是 0。

感谢您对此的任何帮助!

你应该看看 Freescale 的应用说明 AN4481, which is referred to by the datasheet。第 5 页显示了您正在执行的单字节读取操作,除了寄存器地址写入必须 而不是 后跟一个 STOP,而是使用 REPEATED-START。

我不熟悉 Wire 库,但看起来您需要做的就是删除 sendrequestFrom 之间的 Wire.endTransmission();

希望这能解决您的问题。