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?
Solved! Go to Solution.
Resolved...
I just noticed that L20 is removed from my board.. This puts the device in power-down mode, so all bets are off.
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
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
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.
Resolved...
I just noticed that L20 is removed from my board.. This puts the device in power-down mode, so all bets are off.