我已阅读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, ®, 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身份登录,所以我认为它不是权限,尽管我可能错了。
答案 0 :(得分:1)
我解决这个问题的方法是使用SMBus,特别是函数i2c_smbus_write_byte_data
和i2c_smbus_read_byte_data
。我能够使用这些功能成功读取和写入设备。
我确实在查找这些函数时遇到了一些麻烦,我一直在尝试使用apt-get
下载库来安装相应的头文件。最后,我只是下载了文件smbus.c和smbus.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.c
和smbus.h
与myfile.c
在同一目录中。
答案 1 :(得分:0)
在C中,您可以检查errno
变量的内容,以获取有关错误的更多详细信息。包含errno.h
时会自动声明,您可以通过调用strerror(errno)
来获取更具描述性的文字。
您是否检查过您拥有/dev/i2c-0
的写入权限?