pic32和MPL3115A2高度/压力传感器之间的I2C通信

时间:2015-05-23 13:57:01

标签: arduino sensor i2c pic32

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

我正在使用有线库而我只是试图从MPL3115A2读取寄存器0x0C,它应该为我提供设备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。

感谢您对此提供任何帮助!

1 个答案:

答案 0 :(得分:0)

您应该查看飞思卡尔的应用说明AN4481datasheet引用该应用说明。第5页显示了您正在进行的单字节读操作,但寄存器地址写操作必须后跟STOP,而是使用REPEATED-START。

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

希望这能解决您的问题。