主题 : 请用过linux下IIC的兄弟进来帮忙指点一下,跪谢 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3389
精华: 0
发帖: 8
金钱: 60 两
威望: 44 点
综合积分: 16 分
注册时间: 2009-01-08
最后登录: 2011-06-09
楼主  发表于: 2009-08-07 14:23

 请用过linux下IIC的兄弟进来帮忙指点一下,跪谢

linux下已经集成了iic驱动,我想拿eeprom读写操作来做个应用试试(代码如下)。
算法:“先定义一个字符串,写进去,读出来,看一下是不是成功写入”

但是发现走到ioctl就会返回-1,是怎么回事啊? 请用过linux下IIC的兄弟进来帮忙指点一下,跪谢


#define EEPROM_SLAVE_ADD    0xA0

int main(void)
{
        int ret1 = 0;
        int ret2 = 0;
        int r = 0;
        char null_buf[8]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 0};
        char outbuf[8]={'Z','Z','Z','Z', 0,0,0,0};

        int fd = open("/dev/i2c/0",O_RDWR);    //can read and write
        printf("open(/dev/i2c/0) return:(%d) \n", fd);
        if (fd == -1)
        {
                printf("can't open device /dev/i2c/0. \n");
                exit(1);
        }

        if( ( r = ioctl(fd, I2C_SLAVE_FORCE, EEPROM_SLAVE_ADD)) < 0)
        //这里的命令字换成I2C_SLAVE也是返回-1
        {
               printf("ioctl failed.r:(%d).\n", r);
               return -1;
        }


        ret1 = write(fd,null_buf,8);
        printf("write returned.ret1:(%d). \n", ret1);
        if( !ret1 )
         {
                     printf("write failed.ret1:(%d). \n", ret1);
                     exit(1);
         }

        ret2 = read(fd,outbuf,8);
        printf("read returned.ret2:(%d). \n", ret2);
        if( !ret2 )
         {
                     printf("read failed.ret2:(%d). \n", ret2);
                     exit(1);
         }

      printf("outbuf: %s\n", outbuf);
      close(fd);
}
这个阶段正是我事业的上升期,我怎么能走得开呢?
级别: 精灵王
UID: 3197
精华: 3
发帖: 770
金钱: 6995 两
威望: 5398 点
综合积分: 1600 分
注册时间: 2008-12-30
最后登录: 2010-12-31
1楼  发表于: 2009-08-07 14:52
友善之臂已经提供了操作i2d的编程示例.
http://www.arm9.net/download-linux-examples.asp
级别: 新手上路
UID: 3389
精华: 0
发帖: 8
金钱: 60 两
威望: 44 点
综合积分: 16 分
注册时间: 2009-01-08
最后登录: 2011-06-09
2楼  发表于: 2009-08-07 15:19
26672624兄弟:不能用文件系统接口来访问么?
这个阶段正是我事业的上升期,我怎么能走得开呢?
级别: 精灵王
UID: 3197
精华: 3
发帖: 770
金钱: 6995 两
威望: 5398 点
综合积分: 1600 分
注册时间: 2008-12-30
最后登录: 2010-12-31
3楼  发表于: 2009-08-07 16:04

 回 2楼(riyan) 的帖子

看清楚代码, 还真不知道在Linux中不通过设备文件如何访问设备.:

int eeprom_open(char *dev_fqn, int addr, int type, struct eeprom* e)
{
    int funcs, fd, r;
    e->fd = e->addr = 0;
    e->dev = 0;
    
    fd = open(dev_fqn, O_RDWR);
    if(fd <= 0)
    {
        fprintf(stderr, "Error eeprom_open: %s\n", strerror(errno));
        return -1;
    }

    // get funcs list
    if((r = ioctl(fd, I2C_FUNCS, &funcs) < 0))
    {
        fprintf(stderr, "Error eeprom_open: %s\n", strerror(errno));
        return -1;
    }

    
    // check for req funcs
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_READ_BYTE );
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_WRITE_BYTE );
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_READ_BYTE_DATA );
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_WRITE_BYTE_DATA );
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_READ_WORD_DATA );
    CHECK_I2C_FUNC( funcs, I2C_FUNC_SMBUS_WRITE_WORD_DATA );

    // set working device
    if( ( r = ioctl(fd, I2C_SLAVE, addr)) < 0)
    {
        fprintf(stderr, "Error eeprom_open: %s\n", strerror(errno));
        return -1;
    }
    e->fd = fd;
    e->addr = addr;
    e->dev = dev_fqn;
    e->type = type;
    return 0;
}
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2009-08-07 16:27
引用第2楼riyan于2009-08-07 15:19发表的  :
26672624兄弟:不能用文件系统接口来访问么?

友善之臂提供的例子里用的就是文件系统接口(open, ioctl, ...);
你的程序的问题在于设定的I2C Slave地址不对,根据i2c的spec, i2c 设备的地址为7bit或10bit。mini2440上的AT24C08的地址为0x50
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3389
精华: 0
发帖: 8
金钱: 60 两
威望: 44 点
综合积分: 16 分
注册时间: 2009-01-08
最后登录: 2011-06-09
5楼  发表于: 2009-08-07 17:11
多谢kasim。slaveadd换成0x50之后确实可以读出数据了。
另外有个问题,slaveadd设置成功之后,怎么设置在eeprom中操作的起始地址?比如我想从eeprom的第10个字节开始写入
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
6楼  发表于: 2009-08-07 23:17
为什么不看看write()系统调用的用法?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 19870
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
综合积分: 54 分
注册时间: 2010-04-24
最后登录: 2014-05-26
7楼  发表于: 2011-02-20 15:50
器件的地址不是0xa0吗   按照电路板原理图A0A1A2接地  器件前四位固有地址1010  那么加起来写操作就是0xa0  ?  读操作就是0xa1?