我已经阅读了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
我试着完全按照文档告诉我的去做,我的理解是地址首先是通过调用ioctl来设置的,然后我需要write()寄存器,然后是要发送到寄存器的数据。
我也尝试过使用smbus,但是我不能用它来编译我的代码,它在链接阶段抱怨它找不到函数。
我在这段代码中犯了什么错误吗?我是i2c的初学者,对c也没有太多经验。
编辑:errno给出以下消息:Operation not supported。不过,我是以根用户身份登录到这台机器上的,所以我不认为这是权限问题,尽管我可能错了。

最佳答案

我解决这个问题的方法是使用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和my file:gcc -c myfile.c,然后链接它们:gcc smbus.o myfile.o -o myexe我会得到一个运行i2c命令的工作可执行文件。当然,我的smbus.csmbus.hmyfile.c在同一个目录中。

关于c - 写入I2C_SLAVE设备时,write()返回-1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16625301/

10-11 15:30