我已经阅读了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
我试着完全按照文档告诉我的去做,我的理解是地址首先是通过调用
ioctl
来设置的,然后我需要write()
寄存器,然后是要发送到寄存器的数据。我也尝试过使用smbus,但是我不能用它来编译我的代码,它在链接阶段抱怨它找不到函数。
我在这段代码中犯了什么错误吗?我是
i2c
的初学者,对c
也没有太多经验。编辑:errno给出以下消息:
Operation not supported
。不过,我是以根用户身份登录到这台机器上的,所以我不认为这是权限问题,尽管我可能错了。 最佳答案
我解决这个问题的方法是使用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
和my file:gcc -c myfile.c
,然后链接它们:gcc smbus.o myfile.o -o myexe
我会得到一个运行i2c命令的工作可执行文件。当然,我的smbus.c
和smbus.h
与myfile.c
在同一个目录中。关于c - 写入I2C_SLAVE设备时,write()返回-1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16625301/