write()在写入I2C_SLAVE设备时返回-1

时间:2013-05-18 14:21:10

标签: c linux i2c

我已阅读Linux kernel documents on i2c并编写代码以尝试复制命令i2cset -y 0 0x60 0x05 0xff

我写的代码在这里:

#include <stdio.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <string.h>

int main(){

 int file;    
 file = open("/dev/i2c-0", O_RDWR);
 if (file < 0) {
  exit(1);
 }

 int addr = 0x60;

 if(ioctl(file, I2C_SLAVE, addr) < 0){
 exit(1);
 }

__u8 reg = 0x05;
__u8 res;
__u8 data = 0xff;

int written = write(file, &reg, 1); 
printf("write returned %d\n", written);

written = write(file, &data, 1); 
printf("write returned %d\n", written);

}

当我编译并运行此代码时,我得到:     写回-1 -1     写返回-1

我试图完全按照文档告诉我的内容,我的理解是首先通过调用ioctl设置地址,然后我需要write()寄存器然后数据我想发送到寄存器。

我也试过使用SMbus,但是我无法使用它来编译我的代码,它在链接阶段抱怨它无法找到函数。

我在这段代码中犯了什么错误吗?我是i2c的初学者,对c也没有很多经验。

编辑:错误提供以下消息:Operation not supported。我在这台机器上以root身份登录,所以我认为它不是权限,尽管我可能错了。

2 个答案:

答案 0 :(得分:1)

我解决这个问题的方法是使用SMBus,特别是函数i2c_smbus_write_byte_datai2c_smbus_read_byte_data。我能够使用这些功能成功读取和写入设备。

我确实在查找这些函数时遇到了一些麻烦,我一直在尝试使用apt-get下载库来安装相应的头文件。最后,我只是下载了文件smbus.csmbus.h

然后我需要的代码是:

#include <stdio.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "smbus.h"
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>


int main(){

int file;     
file = open("/dev/i2c-0", O_RDWR);
if (file < 0) {
    exit(1);
}

int addr = 0x60;

if(ioctl(file, I2C_SLAVE, addr) < 0){
    exit(1);
}

__u8 reg = 0x05; /* Device register to access */
__s32 res;

res = i2c_smbus_write_byte_data(file, reg, 0xff);
close(file);
}

然后,如果我编译smbus.c文件:gcc -c smbus.c和myfile:gcc -c myfile.c,然后链接它们:gcc smbus.o myfile.o -o myexe我得到一个运行我的I2C命令的工作可执行文件。当然,我smbus.csmbus.hmyfile.c在同一目录中。

答案 1 :(得分:0)

在C中,您可以检查errno变量的内容,以获取有关错误的更多详细信息。包含errno.h时会自动声明,您可以通过调用strerror(errno)来获取更具描述性的文字。

您是否检查过您拥有/dev/i2c-0的写入权限?