jary06 发表于 2010-02-05 09:37:52

问题解决,因为小弟的(e2prom_data.msgs).addr=0x50设置错误,应该是0xa0>>1,多谢各位大侠~

xinhuawen 发表于 2011-03-21 09:57:55

想问一下你确定吗,0x50与0xa0>>1有什么区别吗

liujwcool 发表于 2012-06-11 11:42:14

" /> jary06 发表于 2010-02-05 09:37:52

问题解决,因为小弟的(e2prom_data.msgs).addr=0x50设置错误,应该是0xa0>>1,多谢各位大侠~

xinhuawen 发表于 2011-03-21 09:57:55

想问一下你确定吗,0x50与0xa0>>1有什么区别吗

liujwcool 发表于 2012-06-11 11:42:14

" />

请教关于i2c Remote I/O error

我用2.6.24内核自带的i2c-dev.c通过ioctl来操作适配器进而读写24c02,
可程序运行错误::Q
ioctl error 1:Remote I/O error
ioctl error 2:Remote I/O error
恳请各位高手指教,谢谢!

代码列出如下,i2c-msg以改成内核定义形式。



        #include <stdio.h>
        #include <linux/types.h>
        #include <stdlib.h>
        #include <fcntl.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/ioctl.h>
        #include <errno.h>
        #define I2C_RETRIES 0x0701
        #define I2C_TIMEOUT 0x0702
        #define I2C_RDWR 0x0707
        /*********定义struct i2c_rdwr_ioctl_data和struct i2c_msg,要和内核一致*******/
struct i2c_msg
        {
                unsigned short addr;
                unsigned short flags;
        #define I2C_M_TEN 0x0010
        #define I2C_M_RD 0x0001
                unsigned short len;
                unsigned char *buf;
        };
struct i2c_rdwr_ioctl_data
        {
                struct i2c_msg *msgs;
                int nmsgs;
        /* nmsgs这个数量决定了有多少开始信号,对于“单开始时序”,取1*/
        };
/***********主程序***********/
        int main()
        {
                int fd,ret;
                struct i2c_rdwr_ioctl_data e2prom_data;
                fd=open("/dev/i2c-0",O_RDWR);
        /*
        */dev/i2c-0是在注册i2c-dev.c后产生的,代表一个可操作的适配器。如果不使用i2c-dev.c
        *的方式,就没有,也不需要这个节点。
        */
                if(fd<0)
                {
                        perror("open error");
                }
                e2prom_data.nmsgs=2;
        /*
        *因为操作时序中,最多是用到2个开始信号(字节读操作中),所以此将
        *e2prom_data.nmsgs配置为2
        */
                e2prom_data.msgs=(struct i2c_msg*)malloc(e2prom_data.nmsgs*sizeof(struct i2c_msg));
                if(!e2prom_data.msgs)
                {
                        perror("malloc error");
                        exit(1);
                }
                ioctl(fd,I2C_TIMEOUT,1);/*超时时间*/
                ioctl(fd,I2C_RETRIES,2);/*重复次数*/
                /***write data to e2prom**/

                e2prom_data.nmsgs=1;
                (e2prom_data.msgs).len=2; //1个 e2prom 写入目标的地址和1个数据
                (e2prom_data.msgs).addr=0x50;//e2prom 设备地址
                (e2prom_data.msgs).flags=0; //write
                (e2prom_data.msgs).buf=(unsigned char*)malloc(2);
                (e2prom_data.msgs).buf=0x10;// e2prom 写入目标的地址
                (e2prom_data.msgs).buf=0x58;//the data to write
        ret=ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);
                if(ret<0)
                {
                        perror("ioctl error1");
                }
                sleep(1);
        /******read data from e2prom*******/
                e2prom_data.nmsgs=2;
                (e2prom_data.msgs).len=1; //e2prom 目标数据的地址
                (e2prom_data.msgs).addr=0x50; // e2prom 设备地址
                (e2prom_data.msgs).flags=0;//write
                (e2prom_data.msgs).buf=0x10;//e2prom数据地址
                (e2prom_data.msgs).len=1;//读出的数据
                (e2prom_data.msgs).addr=0x50;// e2prom 设备地址
                (e2prom_data.msgs).flags=I2C_M_RD;//read
                (e2prom_data.msgs).buf=(unsigned char*)malloc(1);//存放返回值的地址。
                (e2prom_data.msgs).buf=0;//初始化读缓冲
        ret=ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);
                if(ret<0)
                {
                        perror("ioctl error2");
                }
                printf("buff=%x\n",(e2prom_data.msgs).buf);
        /***打印读出的值,没错的话,就应该是前面写的0x58了***/
                close(fd);
                return 0;
        }

jary06 发表于 2010-02-05 09:37:52

问题解决,因为小弟的(e2prom_data.msgs).addr=0x50设置错误,应该是0xa0>>1,多谢各位大侠~

xinhuawen 发表于 2011-03-21 09:57:55

想问一下你确定吗,0x50与0xa0>>1有什么区别吗

liujwcool 发表于 2012-06-11 11:42:14

IT运维

操作系统

程序设计

数据库技术

综合交流区

站务及频道

查看完整版本: ChinaUnix.net

jary06 发表于 2010-02-03 09:49:29

请教关于i2c Remote I/O error

我用2.6.24内核自带的i2c-dev.c通过ioctl来操作适配器进而读写24c02,
可程序运行错误::Q
ioctl error 1:Remote I/O error
ioctl error 2:Remote I/O error
恳请各位高手指教,谢谢!

代码列出如下,i2c-msg以改成内核定义形式。



        #include <stdio.h>
        #include <linux/types.h>
        #include <stdlib.h>
        #include <fcntl.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/ioctl.h>
        #include <errno.h>
        #define I2C_RETRIES 0x0701
        #define I2C_TIMEOUT 0x0702
        #define I2C_RDWR 0x0707
        /*********定义struct i2c_rdwr_ioctl_data和struct i2c_msg,要和内核一致*******/
struct i2c_msg
        {
                unsigned short addr;
                unsigned short flags;
        #define I2C_M_TEN 0x0010
        #define I2C_M_RD 0x0001
                unsigned short len;
                unsigned char *buf;
        };
struct i2c_rdwr_ioctl_data
        {
                struct i2c_msg *msgs;
                int nmsgs;
        /* nmsgs这个数量决定了有多少开始信号,对于“单开始时序”,取1*/
        };
/***********主程序***********/
        int main()
        {
                int fd,ret;
                struct i2c_rdwr_ioctl_data e2prom_data;
                fd=open("/dev/i2c-0",O_RDWR);
        /*
        */dev/i2c-0是在注册i2c-dev.c后产生的,代表一个可操作的适配器。如果不使用i2c-dev.c
        *的方式,就没有,也不需要这个节点。
        */
                if(fd<0)
                {
                        perror("open error");
                }
                e2prom_data.nmsgs=2;
        /*
        *因为操作时序中,最多是用到2个开始信号(字节读操作中),所以此将
        *e2prom_data.nmsgs配置为2
        */
                e2prom_data.msgs=(struct i2c_msg*)malloc(e2prom_data.nmsgs*sizeof(struct i2c_msg));
                if(!e2prom_data.msgs)
                {
                        perror("malloc error");
                        exit(1);
                }
                ioctl(fd,I2C_TIMEOUT,1);/*超时时间*/
                ioctl(fd,I2C_RETRIES,2);/*重复次数*/
                /***write data to e2prom**/

                e2prom_data.nmsgs=1;
                (e2prom_data.msgs).len=2; //1个 e2prom 写入目标的地址和1个数据
                (e2prom_data.msgs).addr=0x50;//e2prom 设备地址
                (e2prom_data.msgs).flags=0; //write
                (e2prom_data.msgs).buf=(unsigned char*)malloc(2);
                (e2prom_data.msgs).buf=0x10;// e2prom 写入目标的地址
                (e2prom_data.msgs).buf=0x58;//the data to write
        ret=ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);
                if(ret<0)
                {
                        perror("ioctl error1");
                }
                sleep(1);
        /******read data from e2prom*******/
                e2prom_data.nmsgs=2;
                (e2prom_data.msgs).len=1; //e2prom 目标数据的地址
                (e2prom_data.msgs).addr=0x50; // e2prom 设备地址
                (e2prom_data.msgs).flags=0;//write
                (e2prom_data.msgs).buf=0x10;//e2prom数据地址
                (e2prom_data.msgs).len=1;//读出的数据
                (e2prom_data.msgs).addr=0x50;// e2prom 设备地址
                (e2prom_data.msgs).flags=I2C_M_RD;//read
                (e2prom_data.msgs).buf=(unsigned char*)malloc(1);//存放返回值的地址。
                (e2prom_data.msgs).buf=0;//初始化读缓冲
        ret=ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);
                if(ret<0)
                {
                        perror("ioctl error2");
                }
                printf("buff=%x\n",(e2prom_data.msgs).buf);
        /***打印读出的值,没错的话,就应该是前面写的0x58了***/
                close(fd);
                return 0;
        }

jary06 发表于 2010-02-05 09:37:52

问题解决,因为小弟的(e2prom_data.msgs).addr=0x50设置错误,应该是0xa0>>1,多谢各位大侠~

xinhuawen 发表于 2011-03-21 09:57:55

想问一下你确定吗,0x50与0xa0>>1有什么区别吗

liujwcool 发表于 2012-06-11 11:42:14

我也遇到这个错误了,不知道是什么原因呢。 0x50确实和0xa0>>1没啥区别啊
页: [1]
查看完整版本: 请教关于i2c Remote I/O error