I2C interface problems (iMX6-SABRESDB)...

cancel
Showing results for 
Search instead for 
Did you mean: 

I2C interface problems (iMX6-SABRESDB)...

Jump to solution
4,265 Views
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?

Labels (2)
Tags (3)
0 Kudos
1 Solution
302 Views
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.

View solution in original post

0 Kudos
4 Replies
302 Views
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 

302 Views
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 Kudos
302 Views
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 Kudos
303 Views
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.

View solution in original post

0 Kudos