参考chenzhufly的文章:
写了一个应用程序测试I2C读写EEPROM芯片AT24C02:
//
//app template, replace xxx with a specified name
//Gao Fei
//2012.10.3
//
#define APP_DEBUG
#include <stdio.h>
//#include <sys/types.h>
#include <fcntl.h>
//#include <sys/ioctl.h>
//#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "/root/bone-fs/home/root/header-files/print_debug.h"
#include <errno.h>
int main(int argc, char **argv)
{
int fd;
int ret;
//unsigned char x;
//unsigned char wrbuf[3] = {0, 0, 0xcc};
//unsigned char wrbuf[2] = {0xaa, 0x11};
unsigned char wrbuf[4] = {0xaa, 0x11, 0xff, 0xaa};//分别向0xaa、0xa1、0xa2地址写字节
//unsigned char rdaddr[2] = {0, 0};
unsigned char rdaddr[1] = {0xaa};//0xaa为读起始地址
//unsigned char rddata = 0x00;
unsigned char rddata[3];
ADEBUG("----------main----------\n");
fd = open("/dev/i2c-2", O_RDWR);
if (fd < 0)
{
ADEBUG("!!!i2c device open failed!!!\n");
return -1;
}
ADEBUG("i2c device open success\n");
//ret = ioctl(fd, I2C_TENBIT, 0);
//if (ret < 0)
// return -1;
//ADEBUG("ioctl success\n");
ret = ioctl(fd, I2C_SLAVE_FORCE, 0x50);//0x50是器件地址,7bit
if (ret < 0)
{
ADEBUG("!!!ioctl I2C_SLAVE failed!!!\n");
ADEBUG("errno = %d\n", errno);
return -1;
}
ADEBUG("ioctl success\n");
//i2c_smbus_write_byte_data(fd, 0x10, 0x65);
//x = 0x00;
//write(fd, &x, 1);
//usleep(100);
//x = 0x00;
//write(fd, &x, 1);
//usleep(100);
//x = 0x11;
//write(fd, &x, 1);
//usleep(4000);
//ret = write(fd, wrbuf, 3);
//ret = write(fd, wrbuf, 2);
ret = write(fd, wrbuf, 4);
ADEBUG("write ret: %d\n", ret);
ADEBUG("errno = %d\n", errno);
//sleep(1);
usleep(10000);//!!!!!!
ret = write(fd, rdaddr, 1);
ADEBUG("write ret: %d\n", ret);
ADEBUG("errno = %d\n", errno);
/*ADEBUG("read ret: %d\n", read(fd, &rddata, 1));
ADEBUG("rddata: %d\n", rddata);
ADEBUG("read ret: %d\n", read(fd, &rddata, 1));
//ADEBUG("errno = %d\n", errno);
ADEBUG("rddata: %d\n", rddata);
ADEBUG("read ret: %d\n", read(fd, &rddata, 1));
//ADEBUG("errno = %d\n", errno);
ADEBUG("rddata: %d\n", rddata);*/
ADEBUG("read ret: %d\n", read(fd, rddata, 3));
ADEBUG("rddata: %d,%d,%d\n", rddata[0], rddata[1], rddata[2]);
//sleep(1);
close(fd);
return 0;
}