2014-10-26 45 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