I2C interface problems (iMX6-SABRESDB)...

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

I2C interface problems (iMX6-SABRESDB)...

跳至解决方案
5,716 次查看
EdSutter
Senior Contributor II

I don't have much experience with linux/i2c (plenty of i2c, just not much on linux).

Anyway, in preparation for a few I2C devices on our custom hardware I wanted to play with the generic

linux i2c driver just to get used to it.  I picked the accelerometer (MMA8451Q, device addr: 0x1C, bus 0).

The device seems simple enough to use, but I keep getting a Input/Output error when I try to write

to it.  Here's the entire snippet of code...

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <fcntl.h>

#include <linux/i2c-dev.h>

#define SLAVE_ADDR  0x1c    /* SA0 is low, so addr=1c */

int

main(int argc, char *argv[])

{

    int i, j, dev;

    char buf[8];

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

        perror("open failed");

        exit(1);

    }

    if (ioctl(dev, I2C_SLAVE, SLAVE_ADDR) < 0) {

        perror("ioctl failed");

        close(dev);

        exit(1);

    }

    buf[0] = 0;

    if (write(dev,buf,1) != 1) {

        perror("write failed");

        close(dev);

        exit(1);

    }

    if (read(dev,buf,1) != 1) {

        perror("read failed");

        close(dev);

        exit(1);

    }

    close(dev);

    for(i=0;i<1;i++)

        printf("buf[%d]: 0x%02x\n",i,buf[i]);

    exit(0);

}

Is the the correct way to access a device on the I2C bus?

Any hints as to where the problem might be?

标签 (2)
标记 (3)
0 项奖励
回复
1 解答
1,753 次查看
EdSutter
Senior Contributor II

Resolved...

I just noticed that L20 is removed from my board.. This puts the device in power-down mode, so all bets are off.

在原帖中查看解决方案

0 项奖励
回复
4 回复数
1,753 次查看
Raybiztech
Contributor V

Hi Ed Sutter,

    In this code you are writing register at address 0 (buf) which is read only status register,so you can't do write operation on that.Try read operation on same register by calling read first instead of write.

Regards,

Sasidhar 

1,753 次查看
EdSutter
Senior Contributor II

Sasidhar,

Yea good point (duh).  Bad example above.

Still can't access the device though because of the L20 issue.

No problem, I was able to access a different I2C device, and my primary goal at

this point is just get some experience with the Linux-I2C generic driver.

By the way, just doing a read (without the illegal write above) didn't matter in my case.

The overriding issue is the absence of L20 on my board because we're using some

of the pins on that device in a different iomux mode.

Thanks,

Ed

0 项奖励
回复
1,753 次查看
EdSutter
Senior Contributor II

More...

Just noticed that if I change the above code so that I am accessing the eCompass (SLAVE_ADDR=0x0e, bus=/dev/i2c-2)

i'm able to access that device.

0 项奖励
回复
1,754 次查看
EdSutter
Senior Contributor II

Resolved...

I just noticed that L20 is removed from my board.. This puts the device in power-down mode, so all bets are off.

0 项奖励
回复