i2c测试接口

#include <stdio.h>


#include <sys/types.h>


#include <sys/stat.h>


#include <fcntl.h>


#include <stdlib.h>


#include <sys/ioctl.h>


#include <linux/i2c.h>


#include <linux/i2c-dev.h>


#include <errno.h>


int main(int argc,char *argv[])


{


int i2c_fd,rw,dev_addr;


unsigned char value;


unsigned char reg;


struct i2c_rdwr_ioctl_data i2c_data;


struct i2c_msg i2c_msg[2];


if((argc <5 )||(argc>6)){


printf("parameter must 4(R) or 5(W)!\n");


printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n"); 


return -1;


}


//arg[2]:r/w flag 


rw = atoi(argv[3]);


switch(rw){


case 0: //read


if(argc != 5){


printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n"); 


return -1;


}


break;


case 1: //write


if(argc != 6) {


printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n"); 


return -1;


}


break;


defalut:


printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n"); 


return -1;


break;


}

//arg[1], open device


i2c_fd = open(argv[1],O_RDWR,644);


if(i2c_fd < 0){


printf("open %s error!\n",argv[1]);


return -1;


}

//arg[2]:device addr


dev_addr = atoi(argv[2]);


if(dev_addr > 127){


printf("addr must low 127!\n");


goto out;


}

//arg[4]:reg value


reg = atoi(argv[4]);

//arg[5]: value


if(rw == 1)


value = atoi(argv[5]);

if(rw == 0){//read


i2c_msg[0].buf =(unsigned char*)malloc(1);


i2c_msg[0].addr = dev_addr;


i2c_msg[0].flags = 0;


i2c_msg[0].len = 1;


i2c_msg[0].buf[0] = reg;


i2c_msg[1].buf =(unsigned char*)malloc(1);


i2c_msg[1].addr = dev_addr;


i2c_msg[1].flags = I2C_M_RD;


i2c_msg[1].len = 1;


i2c_msg[1].buf[0] = 0;


printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);


printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);


printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);


printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);


printf("i2c_msg[1].addr:%d\n",i2c_msg[1].addr);


printf("i2c_msg[1].flag:%d\n",i2c_msg[1].flags);


printf("i2c_msg[1].len:%d\n",i2c_msg[1].len);


printf("i2c_msg[1].buf[0]:%d\n",i2c_msg[1].buf[0]);


i2c_data.msgs = &i2c_msg[0]; 


i2c_data.nmsgs = 2;

}else{//write


i2c_msg[0].buf =(unsigned char*)malloc(2);


i2c_msg[0].addr = dev_addr;


i2c_msg[0].flags = 0;


i2c_msg[0].len = 2;


i2c_msg[0].buf[0] = reg;


i2c_msg[0].buf[1] = value;


printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);


printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);


printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);


printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);


printf("i2c_msg[0].buf[1]:%d\n",i2c_msg[0].buf[1]);





i2c_data.msgs = &i2c_msg[0]; 


i2c_data.nmsgs = 1;


}



ioctl(i2c_fd,I2C_TIMEOUT, 1); /* 设置超时 */ 


ioctl(i2c_fd,I2C_RETRIES, 2); /* 设置重试次数 */ 


if((ioctl(i2c_fd,I2C_RDWR,(unsigned long*)&i2c_data)) < 0 )


{

printf("read or wirte i2c error!\n");


goto out;


}


if(rw == 0){


printf("read data is:0x%x\n",i2c_msg[1].buf[0]);


free(i2c_msg[1].buf);


}

free(i2c_msg[0].buf);


close(i2c_fd);


return 0; 


out:


close(i2c_fd);


return -1;

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值