gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:33 24 4
gpt4 key购买 nike

我已经通读了 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。虽然我在这台机器上以 root 身份登录,所以我不认为这可能是权限问题,尽管我可能是错的。

最佳答案

我解决这个问题的方法是使用 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 命令的工作可执行文件。当然,我在与 myfile.c 相同的目录中有 smbus.csmbus.h

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com