1

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

我正在使用线库,我只是想从 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。

感谢您对此的任何帮助!

4

1 回答 1

0

您应该查看飞思卡尔的应用笔记AN4481 ,它在数据表中被引用。第 5 页显示了您正在执行的单字节读取操作,除了寄存器地址写入后不得跟随 STOP 而是使用 REPEATED-START。

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

希望这能解决您的问题。

于 2015-05-26T18:12:10.223 回答