2015-06-04 226 views
2

我正在嘗試讀取i2c值,就像使用i2cget一樣,但它在其中一種情況下返回了錯誤的值。I2C讀取返回不正確的值

i2cget -y 0 0x57 0x40回報0x57
i2cget -y 0 0x3b 0x09回報0x86

當我跑我的#define I2C_ADDR 0x57buffer[0] = 0x40我的程序返回0x57程序。

但是當我用#define I2C_ADDR 0x3bbuffer[0] = 0x09運行我的程序時,我的程序返回0x00

這裏是我的代碼:

// #define I2C_ADDR 0x57 
#define I2C_ADDR 0x3b 

// #define I2C_REG 0x40 
#define I2C_REG 0x09 

int main(int argc, char **argv) { 

    char buffer[1]; 
    buffer[0] = I2C_REG; 

    int fd; 

    // Get i2c File Descriptor 
    if((fd = open("/dev/i2c-0", O_RDWR)) >= 0){ 

     // Set i2c Block Address 
     if((ioctl(fd, I2C_SLAVE, I2C_ADDR)) >= 0) { 

      // Set i2c Register Address 
      write(fd, buffer, 1); 

      // Read data at Register into buffer 
      read(fd, buffer, 1); 

      // Close fd 
      close(fd); 

      // Print Result 
      printf("0x%02x\n", buffer[0]); 

     } else { 
      // ioctl error 
      printf("ioctl error: %s\n", strerror(errno)); 
     } 
    } else { 
     // file error 
     printf("Error opening file: %s\n", strerror(errno)); 
    } 

    return 0; 
} 

我在i2cget -y 0x3b 0x09和我的程序運行的strace。這是一段輸出結果,顯示了2次讀取的不同之處。

i2cget:

open("/dev/i2c-0", O_RDWR|O_LARGEFILE) = 3 
ioctl(3, 0x705, 0xbeae5bf8)    = 0 
ioctl(3, 0x703, 0x3b)     = 0 
ioctl(3, 0x720, 0xbeae5b4c)    = 0 
close(3)        = 0 

我的程序:

open("/dev/i2c-0", O_RDWR|O_LARGEFILE) = 3 
ioctl(3, 0x703, 0x3b)     = 0 
write(3, "\t", 1)      = 1 
read(3, "\0", 1)      = 1 
close(3) 
+0

我不知道你的I2C器件,但我猜的結果是不是在第一個字節。嘗試enlagre緩衝區並打印緩衝區。 – flotto

+0

它給了我一系列的0x00。 – Dobz

回答

1

i2cgetstrace我研究了0x720,發現它是I2C_SMBUS的價值。然後我找到buildrooti2cget的源代碼。

在C代碼中沒有使用它,但是使用了函數i2c_smbus_read_byte_data。我將它添加到我的代碼並運行它,它不會運行,因爲函數未定義。我從buildroot中將i2c-dev.h文件複製到我的文件夾,並將#include更改爲包含本地文件並運行,並輸出正確的數據。

下面是代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <errno.h> 
#include "i2c-dev.h" 

#define I2C_ADDR 0x3b 
#define I2C_REG 0x09 

// Prints Value of /dev/i2c-0 at Block 0x3b Register 0x09 
int main(int argc, char **argv) { 
    int fd, res; 

    if ((fd = open("/dev/i2c-0", O_RDWR)) >= 0) { 

     ioctl(fd, I2C_SLAVE, I2C_ADDR); 

     res = i2c_smbus_read_byte_data(fd, I2C_REG); 

     close(fd); 

     printf("Value - 0x%02x\n", res); 
    } else { 
     printf("Error opening file: %s\n", strerror(errno)); 
    } 

    return 0; 
}