簡體   English   中英

pic32和MPL3115A2高度/壓力傳感器之間的I2C通信

[英]I2C communication between pic32 and MPL3115A2 Altitude/Pressure Sensor

我正在嘗試做一些非常簡單的事情,但是讓它工作起來有點麻煩。 我正在使用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。

感謝您對此的任何幫助!

您應該查看飛思卡爾的應用筆記AN4481 ,該筆記由數據表引用。 第5頁顯示了您正在執行的單字節讀取操作,不同之處在於寄存器地址寫操作后不得帶STOP,而應使用REPEATED-START。

我不熟悉Wire庫,但是看起來您需要做的就是刪除Wire.endTransmission(); sendrequestFrom之間。

希望這可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM