2014-10-26 72 views
0

我使用PIC18F87J11作爲主設備,LiPower Shield作爲從設備,我所要做的就是能夠從LiPower Shield讀取電池電壓值。我正在使用MPLAB C18庫進行I2C通信。我無法獲得正確的讀數,因爲我認爲兩個設備之間的通信設置不正確。使I2C工作在PIC18上

我正在尋找解釋波形信號以檢測問題。此外,我想知道如果我在代碼中丟失了某些東西。任何改進代碼的建議都會有所幫助。

LiPower Shield附帶Arduino示例代碼,但我使用Microchip的PIC18芯片。示例代碼找到here

這是我在嘗試讀取電池電壓時得到的信號。

enter image description here

enter image description here

enter image description here

enter image description here

代碼:

SSP2ADD = 19; 
OpenI2C2(MASTER,SLEW_OFF); 


StartI2C2(); 
IdleI2C2(); 
WriteI2C2(0x36); 
IdleI2C2(); 

data = ReadI2C2();  // Read byte of data 
printf ("\r\nAddress 32"); 
printf (" Byte:"); 
PrintChar(data); 
IdleI2C2(); 
AckI2C2(); 
IdleI2C2(); 
WriteI2C2(0x02); 
IdleI2C2(); 
data = ReadI2C2(); // Read byte of data 
printf ("\r\nAddress 02"); 
printf (" Byte:"); 
PrintChar(data); 
IdleI2C2(); 
AckI2C2(); 
StopI2C2(); // Stop condition I2C on bus 

輸出:我認爲是錯誤的。

Address 32 Byte:FF 
Address 02 Byte:FF 

我真的不知道,如果我寫/從正確的地址讀取,但是這是他們在他們的示例代碼中使用的地址。如果可能的話,我希望我能夠對代碼的信號和反饋作出一些解釋。

+0

任何意見將不勝感激! – Ammar 2014-10-27 03:54:20

回答

3

我不熟悉PIC,但是你的代碼看起來沒有任何附近的權利。每MAX17043DS datasheet,第12頁,內存讀取必須包括以下內容:

  1. I2C啓動條件
  2. 設備寫入I2C寫地址(0x6C)
  3. 檢查ACK從從屬
  4. 寫8-從從屬位存儲器地址
  5. 檢查ACK
  6. I2C重複開始條件
  7. 寫設備I2C讀地址(0x6D)
  8. 讀數據的第一個字節
  9. 發送ACK
  10. 讀取數據
  11. 的第二個字節發送NACK
  12. I2C停止條件

我在你的代碼中看到的是一個I2C起始條件通過寫0xf 0x36。由於這不是從設備識別的設備地址,因此它會發送NACK(如在邏輯分析儀軌跡中看到的那樣)並忽略其他所有內容。

This question and answer在PIC18上有很多關於I2C的信息。你也應該找一個基本的I2C教程。

+0

感謝您提供的步驟,您能否澄清我將在第4步寫'寫8位內存地址'?這是我目前唯一沒有得到的東西。 – Ammar 2014-10-27 15:47:50

+1

這是註冊地址。例如,數據表顯示SOC寄存器位於地址0x02和0x03。所以你會在第4步寫入0x02,然後讀取寄存器的兩個字節。 – DoxyLover 2014-10-27 18:10:32

+0

感謝您澄清,通過我每次寫入嘗試後不斷得到NACK。我完全遵循了你提到的步驟。這可能是盾發生了什麼事,我正在訂購一個新的,我會再次測試代碼。 – Ammar 2014-10-27 18:16:13