为Devantech数字罗盘设置i2c从站地址

时间:2011-11-16 16:28:51

标签: usb i2c slave digital-compass

我正在尝试与这里发现的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: %m\n" );
            return 2;
    }

返回&#34;设置从站地址失败:参数无效&#34;

我原本以为地址应该是0xC0,因为指南针手册中的一个句子读取&#34;首先发送一个起始位,模块地址(0xC0)......&#34;但那没用。

现在我有一个从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: %m\n", 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: %m\n" );
    return 2;
}

if( i2c_smbus_write_byte( fd, 0xAA ) < 0 )
    fprintf( stderr, "Failed to write 0xAA to I2C device: %m\n" );

它会设置地址,但不会写任何内容。每当我尝试写信时,我都会 -

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

1 个答案:

答案 0 :(得分:0)

为什么您尝试将0xAA发送到设备? 据我所知,这不是一个寄存器(对于CMPS03,唯一的命令是寄存器15,它的用法并不常见:更改I2C地址,恢复出厂设置,... )。 并且0x55似乎不是设备的地址...... 0xC0应该是写入地址。

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