查看: 9069|回复: 5

[求助] 通过i2c设备节点操作i2c从设备报I/O错误

[复制链接]

该用户从未签到

7

主题

17

帖子

0

注册会员

Rank: 2

积分
77
最后登录
2016-8-3
发表于 2016-7-8 15:48:10 | 显示全部楼层 |阅读模式
请教一个关于i2c设备驱动的问题
我想通过i2c设备节点操作i2c从设备
#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_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;
};

int main(int argc ,char* argv[])
{
        int fd,ret;
        struct i2c_rdwr_ioctl_data e2prom_data;
       
        fd = open("/dev/i2c-2",O_RDWR);
        if(fd<0)
        {
                perror("open error\n");
        }

        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\n");
        }
        ioctl(fd,I2C_TIMEOUT,1);
        ioctl(fd,I2C_RETRIES,2);

/*        e2prom_data.nmsgs = 1;
        (e2prom_data.msgs[0]).len = 2;
        (e2prom_data.msgs[0]).addr = 0x50;
        (e2prom_data.msgs[0]).flags = 0;
        (e2prom_data.msgs[0]).buf = (unsigned char*)malloc(2);
        (e2prom_data.msgs[0]).buf[0] = 0x10;
        (e2prom_data.msgs[0]).buf[1] = 0x58;
       
        ret = ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);

        if(ret < 0)
        {
                perror("ioctl error1");
        }

        sleep(1);
*/

        e2prom_data.nmsgs = 2;
        (e2prom_data.msgs[0]).len = 1;
        (e2prom_data.msgs[0]).addr = 0x64;       
        (e2prom_data.msgs[0]).flags = 0;
        (e2prom_data.msgs[0]).buf = (unsigned char*)malloc(1);
        (e2prom_data.msgs[0]).buf[0] = 0x02;
       
        (e2prom_data.msgs[1]).len = 2;
        (e2prom_data.msgs[1]).addr = 0x64;
        (e2prom_data.msgs[1]).flags = I2C_M_RD;
        (e2prom_data.msgs[1]).buf = (unsigned char*)malloc(2);
        (e2prom_data.msgs[1]).buf[0] = 0;
        (e2prom_data.msgs[1]).buf[1] = 0;

        ret = ioctl(fd,I2C_RDWR,(unsigned long)&e2prom_data);
        if(ret<0)
        {
                perror("ioctl error2");
        }

       
        printf("buf[0] = %x\n",(e2prom_data.msgs[1]).buf[0]);
        printf("buf[1] = %x\n",(e2prom_data.msgs[1]).buf[1]);
       
        free((e2prom_data.msgs[1]).buf);
        free(e2prom_data.msgs);
               
        close(fd);
       
        return 0;
}


这是我的代码

使用的板子是imx6q

要读取的设备是ltc2941库仑计
设备是接到i2c3上面的  设备节点应该就是i2c-2

The 7-bit
hard-coded I2C address of LTC2941 is 1100100.

这个是从设备地址

addr
02h   C    Accumulated Charge MSB          R/W              7Fh
03h   D   Accumulated Charge LSB            R/W              FFh

这个是我要读取的设备寄存器的地址

我在板子上面运行之后报 ioctl error2:input/output error
我程序地址有没有什么问题  我现在就是不知道报这个错误   是因为这个设备没接对还是设备已经挂上i2c了我在读写的时候错了

有没有写过的 先帮我看看代码有没有问题 0.0
我知道答案 目前已有5人回答
回复

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-7-8 16:00:15 | 显示全部楼层
    IIC设备地址右移一位在写进去试下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    17

    帖子

    0

    注册会员

    Rank: 2

    积分
    77
    最后登录
    2016-8-3
     楼主| 发表于 2016-7-8 16:33:13 | 显示全部楼层
    技术范儿 发表于 2016-7-8 16:00
    IIC设备地址右移一位在写进去试下

    试了下 貌似还是报I/O错误  能告诉我为什么要右移么
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-7-8 17:04:25 | 显示全部楼层
    Crom 发表于 2016-7-8 16:33
    试了下 貌似还是报I/O错误  能告诉我为什么要右移么

    为什么右移你去看看芯片手册IIC从机地址那部分
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    35

    帖子

    0

    注册会员

    Rank: 2

    积分
    110
    最后登录
    2019-6-10
    发表于 2016-8-6 11:37:21 | 显示全部楼层
    有逻辑分析仪么?淘宝上有一种200+RMB的,功能还行,可以分析I2C的数据,你可以买一个,然后接上去,看看I2C总线上数据传输是否正确,如果你有示波器,可以自己自己抓波形自己分析波形的,你操作的是eeprom,我之前遇到过,是地址错误,或者是没接好设备。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    35

    帖子

    0

    注册会员

    Rank: 2

    积分
    110
    最后登录
    2019-6-10
    发表于 2016-8-6 11:40:10 | 显示全部楼层
    这是我用逻辑分析仪抓波形,然后他给出的提示,原因是我忘了接设备,没有ANK:
    http://www.cnblogs.com/zengjfgit/p/5702749.html
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-8 18:35 , Processed in 0.096808 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表