设置Devantech数字罗盘的i2c从地址



我正在尝试与Devantech数字指南针在这里找到的接口-

http://www.acroname.com/robotics/parts/R117-COMPASS.html

我正在使用i2c-usb转换器将其插入我的笔记本电脑-

http://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm

首先,我对电气工程了解不多。我对最基本的东西有一个很好的了解,但在那之后我就迷路了。

我正在尝试遵循这个教程-

https://xgoat.com/wp/2007/11/11/using-i2c-from-userspace-in-linux/

然而,当我试图设置设备地址时,我在一开始就卡住了。

if( ioctl( fd, I2C_SLAVE, ADDRESS ) < 0 )
    {
            fprintf( stderr, "Failed to set slave address: %mn" );
            return 2;
    }

返回"Failed to set slave address: Invalid argument"

我最初认为地址应该是0xC0,因为指南针手册中的一句话是"首先发送一个起始位,模块地址(0xC0)……",但这不起作用。

现在我有一个从1到100的循环,并尝试每一个地址,但它们都失败了。循环是-

for(int i=0x0;i<0x100;i++) {
    if( ioctl( fd, I2C_SLAVE, i ) < 0 )
        fprintf( stderr, "Failed to set slave address for address %i: %mn", i );
}

我不知道还能尝试什么。现在,我只想设置地址,这样我就可以开始尝试读写。由于转换器实际上是连接到pc的,我应该使用地址吗?如果有的话,我在哪里能找到它的相关信息?如果有人知道我可以尝试什么或者哪里错了,那就太好了。

编辑:

好的,现在我有了这样的代码-

#define ADDRESS 0x55
int fd = open("/dev/i2c-0", O_RDWR);
if (fd < 0) {
    printf("n<0, %m", errno);
    return -1;
}
if( ioctl( fd, I2C_SLAVE, ADDRESS ) < 0 ) {
    fprintf( stderr, "Failed to set slave address: %mn" );
    return 2;
}
if( i2c_smbus_write_byte( fd, 0xAA ) < 0 )
    fprintf( stderr, "Failed to write 0xAA to I2C device: %mn" );

它将设置地址,但它不会写任何东西。每当我试图给它写信时,我都会收到-

Failed to write 0xAA to I2C device: No such device or address 

为什么要将0xAA发送到设备?据我所知,这不是它的寄存器(对于CMPS03,唯一的命令是寄存器15,其用法不常见:更改I2C地址,出厂重置,…)。0x55似乎绝对不是设备的地址……0xC0应该是write。

可能是/dev/i2c-0没有正确创建/不正确?你是如何创建/dev/ic2-0的?

最新更新