1

我已经阅读了i2c 上的 Linux 内核文档并编写了一个代码来尝试复制该命令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. 我在这台机器上以 root 身份登录,所以我不认为这可能是权限问题,尽管我可能错了。

4

2 回答 2

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 file:gcc -c smbus.c和 myfile: gcc -c myfile.c,然后链接它们:gcc smbus.o myfile.o -o myexe我得到一个运行 I2C 命令的工作可执行文件。当然,我有smbus.csmbus.h在同一个目录中myfile.c

于 2013-05-18T21:33:49.857 回答
0

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

你检查过你有写权限/dev/i2c-0吗?

于 2013-05-18T14:33:49.613 回答